当视图消失时,UIView动画停止,重新出现时不再恢复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当视图消失时,UIView动画停止,重新出现时不再恢复相关的知识,希望对你有一定的参考价值。
这是我的配置:
我有一个带有ListViewController的故事板。 ListViewController有一个名为EmptyListView的子视图UIView。只有当UITableView中没有项目时才会显示EmptyListView,否则它将被隐藏。
EmptyListView有一个名为emptyListViewArrow的子视图UIImageView,它可视地指向按钮,在我的UITableView中创建一个新条目。这个箭头以无论是上下方式无限制地动画。
我监听EmptyListView在完成布局子视图后发送通知。我这样做是因为如果没有,变异约束的动画表现不正确。
- (void) layoutSubviews {
[super layoutSubviews];
[[NSNotificationCenter defaultCenter] postNotificationName:@"EmptyViewDidLayoutSubviews" object:nil];
}
当ListViewController观察到此通知时,它会开始动画:
[UIView animateWithDuration:0.8f delay:0.0f options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) animations:^{
self.emptyListViewArrowVerticalSpace.constant = 15.0f;
[emptyListView layoutIfNeeded];
} completion:nil];
如果我将应用程序放在后台或在堆栈上推送另一个ViewController,一旦我回到应用程序或ListViewController,动画就会停止/暂停。我无法重新开始。
我试过了:
- 听取申请将辞职/变得活跃。辞职时,我做了[self.view.layer removeAllAnimations],然后尝试使用上面的代码再次启动动画。
- 删除动画的UIImageView并将其添加回父视图,然后尝试启动动画。
我很遗憾在这里使用约束,但是很想知道可能存在什么问题。
谢谢!
我不确定你在通知中做了什么。我已经完成了许多带有约束的动画,而且从来没有这样做过。我认为问题在于当你离开视图时,约束的常量值将是15(我已经通过viewWillDisappear中的日志验证了这一点),因此将其设置为15的动画将不执行任何操作。在测试应用程序中,我将常量设置回viewWillAppear中的起始值(0),并且它工作正常:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.bottomCon.constant = 0;
[self.view layoutIfNeeded];
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[UIView animateWithDuration:1 delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
self.bottomCon.constant = -40.0f;
[self.view layoutIfNeeded];
} completion:nil];
}
我遇到了同样的问题。解决了以下问题。
yourCoreAnimation.isRemovedOnCompletion = false
或者你有一组动画
yourGroupAnimation.isRemovedOnCompletion = false
这是缺点。要克服这个问题,你必须再次调用动画方法。
你可以这样做:
在控制器中添加Observer
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeAnimation:) name:UIApplicationDidBecomeActiveNotification object:nil];
恢复应用后,将调用此方法。
添加此方法:
- (void)resumeAnimation:(NSNotification *)iRecognizer {
// Restart Animation
}
希望这会帮助你。
我遇到了同样的问题。我将动画应用到viewDidLoad中的imageView。
UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, ], animations: {
self.myImageView.transform = self.transform
self.myImageView.alpha = 0.7
}
但每当我推动其他VC并回来时,动画就无法正常工作。
什么对我有用
- 我不得不像这样重置
viewWillDisappear
中的动画 myImageView.transform = .identity myImageView.alpha = 1 - 在viewWillAppear中也写上面的动画块(
UIView.animate()
)。
希望这可以帮助
当应用程序进入后台并再次返回前台时,您将面临同样的问题:
斯威夫特:
NotificationCenter.default.addObserver(self, selector: #selector(enterInForeground), name: NSNotification.Name(rawValue: NSNotification.Name.UIApplicationWillEnterForeground.rawValue), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(enterInBackground), name: NSNotification.Name(rawValue: NSNotification.Name.UIApplicationDidEnterBackground.rawValue), object: nil)
func enterInForeground() {
self.animateTheLaserLine()
}
func enterInBackground() {
// reset the position when app enters in background
// I have added the animation on layout constrain you can take your
// component
self.laserTopConstrain.constant = 8
}
以上是关于当视图消失时,UIView动画停止,重新出现时不再恢复的主要内容,如果未能解决你的问题,请参考以下文章
在 UIView 动画时重新启动 UIPanGestureRecognizer