質問するログイン新規登録

回答編集履歴

1

サンプルコードを追加

2016/06/26 05:24

投稿

u39ueda
u39ueda

スコア950

answer CHANGED
@@ -6,4 +6,119 @@
6
6
 
7
7
  それの回答ですがやっぱり [StackOverflow](http://stackoverflow.com/a/10084306) にあります。
8
8
 
9
- 簡単に言うと、バックグラウンドに行く時(`applicationDidEnterBackground()`)に`animationForKey()`でCAAnimationオブジェクトをメンバ変数等に保存しておいて、フォアグラウンドに復帰する際(`applicationWillEnterForeground()`)に再度 `addAnimation(forKey:)` で追加し直してあげればいいです。
9
+ 簡単に言うと、バックグラウンドに行く時(`applicationDidEnterBackground()`)に`animationForKey()`でCAAnimationオブジェクトをメンバ変数等に保存しておいて、フォアグラウンドに復帰する際(`applicationWillEnterForeground()`)に再度 `addAnimation(forKey:)` で追加し直してあげればいいです。
10
+
11
+ ## 6/26追記
12
+
13
+ 一応動かせるコードを載せます。
14
+
15
+ - AppDelegateからViewControllerを探すのは面倒ですし画面構成によって探し方も変わるのでViewController内で通知を受信してアニメーションをポーズさせるように変更しました。
16
+ - アニメーション開始のコードがなかったのでviewDidAppearでとりあえず開始するようにしました。
17
+ - scHeiとscWidってなんなのかわかんなかったのでとりあえず画面サイズっぽい値を入れてみました。
18
+
19
+ ```Swift
20
+ KenteiViewController.swift
21
+
22
+ class KenteiViewController: UIViewController {
23
+
24
+ private var myImageView: UIImageView!
25
+ var pausedAnimations: [String: CAAnimation]?
26
+
27
+ override func viewDidLoad() {
28
+ super.viewDidLoad()
29
+
30
+ // バックグラウンドへ遷移する通知の受信開始
31
+ NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(KenteiViewController.didEnterBackgroundNotification(_:)), name: UIApplicationDidEnterBackgroundNotification, object: nil)
32
+ // バックグラウンドから復帰する通知の受信開始
33
+ NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(KenteiViewController.willEnterForegroundNotification(_:)), name: UIApplicationWillEnterForegroundNotification, object: nil)
34
+ }
35
+
36
+ deinit {
37
+ // バックグラウンドへ遷移する通知の受信解除
38
+ NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil)
39
+ // バックグラウンドから復帰する通知の受信解除
40
+ NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillEnterForegroundNotification, object: nil)
41
+ }
42
+
43
+ // バックグラウンドへ遷移する通知受信時の処理
44
+ func didEnterBackgroundNotification(notification: NSNotification) {
45
+ guard let myImageView = myImageView else { return }
46
+
47
+ // myImageViewのレイヤに設定されているCAAnimationオブジェクトをpausedAnimationsに保持する
48
+ var animations = [String: CAAnimation]()
49
+ myImageView.layer.animationKeys()?.forEach({ (key) in
50
+ animations[key] = myImageView.layer.animationForKey(key)
51
+ })
52
+ if !animations.isEmpty {
53
+ pausedAnimations = animations
54
+ pauseLayer(myImageView.layer)
55
+ }
56
+ }
57
+
58
+ // バックグラウンドから復帰する通知受信時の処理
59
+ func willEnterForegroundNotification(notification: NSNotification) {
60
+ guard let myImageView = myImageView else { return }
61
+
62
+ if let animations = pausedAnimations {
63
+ // pausedAnimationsに保持していたCAAnimationオブジェクトをmyImageViewのレイヤに追加し直す
64
+ animations.forEach({ (key, animation) in
65
+ myImageView.layer.addAnimation(animation, forKey: key)
66
+ })
67
+ self.pausedAnimations = nil
68
+ resumeLayer(myImageView.layer)
69
+ }
70
+ }
71
+
72
+ override func viewDidAppear(animated: Bool) {
73
+ super.viewDidAppear(animated)
74
+
75
+ // とりあえずココでアニメーション開始
76
+ timerbar()
77
+ }
78
+
79
+ // よくわかんないので画面サイズっぽい値にする
80
+ let scHei: CGFloat = 480.0
81
+ let scWid: CGFloat = 320.0
82
+
83
+ func timerbar(){
84
+ let barHeight = scHei*0.011
85
+ let barWidth = scWid*0.58
86
+ let barXPosition = scWid*0.14
87
+ let barYPosition = scHei*0.367
88
+ let barXPositionEnd = barXPosition + barWidth
89
+ // UIImageViewを作成する.
90
+ myImageView = UIImageView()
91
+ // 表示する画像を設定する.
92
+ let myImage = UIImage(named: "jikanbar.jpg")
93
+ // 画像をUIImageViewに設定する.
94
+ myImageView.image = myImage
95
+ // 画像の表示する座標を指定する.
96
+ myImageView.frame = CGRectMake(barXPosition ,barYPosition ,barWidth ,barHeight)
97
+ // UIImageViewをViewに追加する.
98
+ self.view.addSubview(myImageView)
99
+
100
+ UIView.animateWithDuration(20, delay: 0.0, options : UIViewAnimationOptions.CurveLinear, animations: {() -> Void in
101
+ self.myImageView.frame = CGRectMake(barXPositionEnd, barYPosition, 0, barHeight)
102
+ }, completion: {(finished: Bool) -> Void in
103
+ // アニメーション終了後の処理
104
+ })
105
+
106
+ }
107
+
108
+ func pauseLayer(layer: CALayer) {
109
+ let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
110
+ layer.speed = 0.0
111
+ layer.timeOffset = pausedTime
112
+ }
113
+
114
+ func resumeLayer(layer: CALayer) {
115
+ let pausedTime = layer.timeOffset
116
+ layer.speed = 1.0
117
+ layer.timeOffset = 0.0
118
+ layer.beginTime = 0.0
119
+ let timeSincePause = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
120
+ layer.beginTime = timeSincePause
121
+ }
122
+ }
123
+
124
+ ```