質問:一時停止とアルファでUIViewのアニメーションを再開は動作しません、ユーザーがホームボタンを押す
- ユーザーがホームを押したときにどのように私は、アルファ/不透明度をアニメーション化し、ネストされたUIViewのアニメーションを一時停止することができますボタンを押してアプリに戻りますか?
- 以下のコードで何が欠けていますか?ありがとうございました。
背景:
私はalpha = 0
からalpha = 1
1分以上に異なる時間にゆっくりとビューのアルファを調整し、単純なネストされたUIViewのアニメーションを持っています。
ユーザーがホームボタンを押すと、UIViewアニメーションが一時停止しないため、アプリが再開すると、UIViewアニメーションがアニメーションの最後まで早送りされ、アプリを再開するとアルファが即座に0から1に変更されます。
ユーザーがデバイスの[ホーム]ボタンを押してアプリケーションを一時停止すると、UIViewアニメーションを一時停止しようとしています。
アニメーションを一時停止して(pauseLayer
)、アニメーションを再開する機能(resumeLayer
)があります。これらの2つの機能は、UIButton
から呼び出すときに効果的です。 alpha
を一時停止し、期待通りにアニメーションを再開します。 (ホームボタンが押された場合、それは0から1へ即座アルファ変更を再開したときただし、アニメーションが、一時停止している間)
私は、ユーザーがWillResignActive
通知を受けたホームボタンを(押したときpauseLayer
を呼び出すしようとすると)、その後、アプリに戻ります(WillEnterForeground
通知を受け取ると)、アニメーションは一時停止せずに再開します。代わりに、アプリを再開するとアルファが即座に0から1に変わります。
動作するはずですが、そうではないようです。
コード:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myView1: UIView!
@IBOutlet weak var myView2: UIView!
override func viewDidLoad() {
super.viewDidLoad()
setNotifications()
myAnimation()
}
@IBAction func myPauseButton(sender: UIButton) {
let layer = self.view.layer
pauseLayer(layer)
}
@IBAction func myResumeButton(sender: UIButton) {
let layer = self.view.layer
resumeLayer(layer)
}
func setNotifications() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.WillEnterForeground(_:)), name: UIApplicationWillEnterForegroundNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.WillResignActive(_:)), name: UIApplicationWillResignActiveNotification, object: nil)
}
func WillEnterForeground(notification : NSNotification) {
let layer = self.view.layer
resumeLayer(layer)
}
func WillResignActive(notification : NSNotification) {
let layer = self.view.layer
pauseLayer(layer)
}
func pauseLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
}
func resumeLayer(layer: CALayer) {
let pausedTime: CFTimeInterval = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = 0.0
let timeSincePause: CFTimeInterval = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) - pausedTime
layer.beginTime = timeSincePause
}
func myAnimation() {
self.myView1.alpha = 0
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView1.alpha = 0.1
}, completion: {(finished: Bool) in
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView1.alpha = 0.2
}, completion: {(finished: Bool) in
UIView.animateWithDuration(30, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView1.alpha = 1
}, completion: nil)
})
})
self.myView2.alpha = 0
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView2.alpha = 0.1
}, completion: {(finished: Bool) in
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView2.alpha = 0.2
}, completion: {(finished: Bool) in
UIView.animateWithDuration(30, delay: 0, options: [.CurveEaseInOut], animations: {
self.myView2.alpha = 1
}, completion: nil)
})
})
}
}
EDIT:
私は、各セクションにif (finished) {
を追加する場合は、アプリに戻った後、ホームボタンを押して、アニメーションは次のセクションに進み、停止します。これはより優れていますが、その問題はresumeLayer
が機能していないように見えるため、アニメーションは停止したままになり、続行されません。
self.myView2.alpha = 0
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut, .LayoutSubviews, .AllowUserInteraction, .BeginFromCurrentState], animations: {
self.myView2.alpha = 0.1
}, completion: {(finished: Bool) in
if (finished) {
UIView.animateWithDuration(15, delay: 0, options: [.CurveEaseInOut, .LayoutSubviews, .AllowUserInteraction, .BeginFromCurrentState], animations: {
self.myView2.alpha = 0.2
}, completion: {(finished: Bool) in
if (finished) {
UIView.animateWithDuration(30, delay: 0, options: [.CurveEaseInOut, .LayoutSubviews, .AllowUserInteraction, .BeginFromCurrentState], animations: {
self.myView2.alpha = 1
}, completion: nil)
}
})
}
})
たぶん代わりにUIApplicationWillEnterForegroundあなたはCalimari328 @動作しませんでしたが、おかげで、しかし、私はそれを試していませんでした。その残念なことにUIApplicationDidBecomeActive – DerrickHo328
を使用する必要がありますが役に立てば幸い – user4806509