回答編集履歴

1

サンプルコードを追加

2016/06/26 05:24

投稿

u39ueda
u39ueda

スコア950

test CHANGED
@@ -15,3 +15,235 @@
15
15
 
16
16
 
17
17
  簡単に言うと、バックグラウンドに行く時(`applicationDidEnterBackground()`)に`animationForKey()`でCAAnimationオブジェクトをメンバ変数等に保存しておいて、フォアグラウンドに復帰する際(`applicationWillEnterForeground()`)に再度 `addAnimation(forKey:)` で追加し直してあげればいいです。
18
+
19
+
20
+
21
+ ## 6/26追記
22
+
23
+
24
+
25
+ 一応動かせるコードを載せます。
26
+
27
+
28
+
29
+ - AppDelegateからViewControllerを探すのは面倒ですし画面構成によって探し方も変わるのでViewController内で通知を受信してアニメーションをポーズさせるように変更しました。
30
+
31
+ - アニメーション開始のコードがなかったのでviewDidAppearでとりあえず開始するようにしました。
32
+
33
+ - scHeiとscWidってなんなのかわかんなかったのでとりあえず画面サイズっぽい値を入れてみました。
34
+
35
+
36
+
37
+ ```Swift
38
+
39
+ KenteiViewController.swift
40
+
41
+
42
+
43
+ class KenteiViewController: UIViewController {
44
+
45
+
46
+
47
+ private var myImageView: UIImageView!
48
+
49
+ var pausedAnimations: [String: CAAnimation]?
50
+
51
+
52
+
53
+ override func viewDidLoad() {
54
+
55
+ super.viewDidLoad()
56
+
57
+
58
+
59
+ // バックグラウンドへ遷移する通知の受信開始
60
+
61
+ NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(KenteiViewController.didEnterBackgroundNotification(_:)), name: UIApplicationDidEnterBackgroundNotification, object: nil)
62
+
63
+ // バックグラウンドから復帰する通知の受信開始
64
+
65
+ NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(KenteiViewController.willEnterForegroundNotification(_:)), name: UIApplicationWillEnterForegroundNotification, object: nil)
66
+
67
+ }
68
+
69
+
70
+
71
+ deinit {
72
+
73
+ // バックグラウンドへ遷移する通知の受信解除
74
+
75
+ NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil)
76
+
77
+ // バックグラウンドから復帰する通知の受信解除
78
+
79
+ NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillEnterForegroundNotification, object: nil)
80
+
81
+ }
82
+
83
+
84
+
85
+ // バックグラウンドへ遷移する通知受信時の処理
86
+
87
+ func didEnterBackgroundNotification(notification: NSNotification) {
88
+
89
+ guard let myImageView = myImageView else { return }
90
+
91
+
92
+
93
+ // myImageViewのレイヤに設定されているCAAnimationオブジェクトをpausedAnimationsに保持する
94
+
95
+ var animations = [String: CAAnimation]()
96
+
97
+ myImageView.layer.animationKeys()?.forEach({ (key) in
98
+
99
+ animations[key] = myImageView.layer.animationForKey(key)
100
+
101
+ })
102
+
103
+ if !animations.isEmpty {
104
+
105
+ pausedAnimations = animations
106
+
107
+ pauseLayer(myImageView.layer)
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+ // バックグラウンドから復帰する通知受信時の処理
116
+
117
+ func willEnterForegroundNotification(notification: NSNotification) {
118
+
119
+ guard let myImageView = myImageView else { return }
120
+
121
+
122
+
123
+ if let animations = pausedAnimations {
124
+
125
+ // pausedAnimationsに保持していたCAAnimationオブジェクトをmyImageViewのレイヤに追加し直す
126
+
127
+ animations.forEach({ (key, animation) in
128
+
129
+ myImageView.layer.addAnimation(animation, forKey: key)
130
+
131
+ })
132
+
133
+ self.pausedAnimations = nil
134
+
135
+ resumeLayer(myImageView.layer)
136
+
137
+ }
138
+
139
+ }
140
+
141
+
142
+
143
+ override func viewDidAppear(animated: Bool) {
144
+
145
+ super.viewDidAppear(animated)
146
+
147
+
148
+
149
+ // とりあえずココでアニメーション開始
150
+
151
+ timerbar()
152
+
153
+ }
154
+
155
+
156
+
157
+ // よくわかんないので画面サイズっぽい値にする
158
+
159
+ let scHei: CGFloat = 480.0
160
+
161
+ let scWid: CGFloat = 320.0
162
+
163
+
164
+
165
+ func timerbar(){
166
+
167
+ let barHeight = scHei*0.011
168
+
169
+ let barWidth = scWid*0.58
170
+
171
+ let barXPosition = scWid*0.14
172
+
173
+ let barYPosition = scHei*0.367
174
+
175
+ let barXPositionEnd = barXPosition + barWidth
176
+
177
+ // UIImageViewを作成する.
178
+
179
+ myImageView = UIImageView()
180
+
181
+ // 表示する画像を設定する.
182
+
183
+ let myImage = UIImage(named: "jikanbar.jpg")
184
+
185
+ // 画像をUIImageViewに設定する.
186
+
187
+ myImageView.image = myImage
188
+
189
+ // 画像の表示する座標を指定する.
190
+
191
+ myImageView.frame = CGRectMake(barXPosition ,barYPosition ,barWidth ,barHeight)
192
+
193
+ // UIImageViewをViewに追加する.
194
+
195
+ self.view.addSubview(myImageView)
196
+
197
+
198
+
199
+ UIView.animateWithDuration(20, delay: 0.0, options : UIViewAnimationOptions.CurveLinear, animations: {() -> Void in
200
+
201
+ self.myImageView.frame = CGRectMake(barXPositionEnd, barYPosition, 0, barHeight)
202
+
203
+ }, completion: {(finished: Bool) -> Void in
204
+
205
+ // アニメーション終了後の処理
206
+
207
+ })
208
+
209
+
210
+
211
+ }
212
+
213
+
214
+
215
+ func pauseLayer(layer: CALayer) {
216
+
217
+ let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
218
+
219
+ layer.speed = 0.0
220
+
221
+ layer.timeOffset = pausedTime
222
+
223
+ }
224
+
225
+
226
+
227
+ func resumeLayer(layer: CALayer) {
228
+
229
+ let pausedTime = layer.timeOffset
230
+
231
+ layer.speed = 1.0
232
+
233
+ layer.timeOffset = 0.0
234
+
235
+ layer.beginTime = 0.0
236
+
237
+ let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
238
+
239
+ layer.beginTime = timeSincePause
240
+
241
+ }
242
+
243
+ }
244
+
245
+
246
+
247
+ ```
248
+
249
+