- Как приостановить вложенную UIView анимации, которая оживляет альфа/непрозрачность, когда пользователь нажимает на дом и возвращается в приложение?
- Что я пропустил в коде ниже? Спасибо.
фон:
У меня есть простая вложенная UIView анимация, которая регулирует альфа вид медленно в разное время от alpha = 0
до alpha = 1
за 1 минуту.
Когда пользователь нажимает кнопку «Домой», анимация UIView не приостанавливается, поэтому, когда приложение возобновляется, анимация UIView продвигается вперед до самого конца анимации, альфа мгновенно меняется с 0 на 1 при возобновлении приложения ,
Итак, я пытаюсь приостановить анимацию UIView, когда пользователь нажимает кнопку «Главная страница» и временно приостанавливает приложение.
У меня есть функция, которая приостанавливает анимацию (pauseLayer
), а затем возобновляет анимацию (resumeLayer
). Эти две функции отлично работают при вызове из UIButton
. Он приостанавливает alpha
и возобновляет анимацию, как ожидалось. (Тем не менее, при нажатии на кнопку Home, пока анимация приостановлена, когда он возобновляет альфа изменения мгновенно от 0 до 1.)
При попытке вызова pauseLayer
, когда пользователь нажимает на кнопку Home (получение уведомления WillResignActive
), а затем возвращается обратно в приложение (получая уведомление 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) {
к каждому разделу, а затем нажмите на кнопку Home, затем вернитесь в приложение, то анимация только переходит к следующему разделу и останавливается, не далее. Это лучше, но проблема в том, что 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 вы должны использовать UIApplicationDidBecomeActive – DerrickHo328
К сожалению, это не сработало @ Calimari328, но спасибо, хотя я не пробовал это. – user4806509