当视图消失时,UIView动画停止,重新出现时不再恢复

时间:2013-09-05 03:41:02

标签: iphone ios ios6 uiview uiviewanimation

这是我的配置:

我有一个带有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,动画就会停止/暂停。我无法重新开始。

我试过了:

  1. 听取申请将辞职/变为现役。辞职时,我做了[self.view.layer removeAllAnimations],然后尝试使用上面的代码再次启动动画。
  2. 删除正在设置动画的UIImageView并将其添加回父视图,然后尝试启动动画。
  3. 我很遗憾在这里使用限制,但是很想知道可能出现什么问题。

    谢谢!

5 个答案:

答案 0 :(得分:11)

我不确定您对该通知做了什么。我已经完成了许多带有约束的动画,而且从来没有这样做过。我认为问题在于当你离开视图时,约束的常量值将是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];
}

答案 1 :(得分:6)

我遇到了同样的问题。解决了以下问题。

yourCoreAnimation.isRemovedOnCompletion = false

或者您有一组动画

yourGroupAnimation.isRemovedOnCompletion = false

答案 2 :(得分:5)

这是缺点。 要解决这个问题,你必须再次调用动画方法。

您可以按照以下方式执行此操作:

在控制器中添加观察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeAnimation:) name:UIApplicationDidBecomeActiveNotification object:nil];

一旦你恢复应用程序,这将被调用。

添加此方法:

- (void)resumeAnimation:(NSNotification *)iRecognizer {
    // Restart Animation
}

希望这会对您有所帮助。

答案 3 :(得分:0)

应用程序进入后台并再次回到前景时,您将面临同样的问题:

快捷键:

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
}

答案 4 :(得分:0)

我遇到了相同的问题。我将动画应用于viewDidLoad中的imageView。

import * as crypto from 'crypto';

但是每当我推一些其他的VC回来时,动画就不起作用

  

对我有用的

  1. 我必须像这样重置error TS2307: Cannot find module 'crypto'中的动画

    myImageView.transform = .identity

    myImageView.alpha = 1

  2. viewWillAppear还中将上述动画块(UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, ], animations: { self.myImageView.transform = self.transform self.myImageView.alpha = 0.7 } )写入。

希望这会有所帮助