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

chr*_*ysb 12 iphone uiview uiviewanimation ios ios6

这是我的配置:

我有一个带有ListViewController的故事板.ListViewController有一个名为EmptyListView的子视图UIView.只有当UITableView中没有项目时才会显示EmptyListView,否则它将被隐藏.

EmptyListView有一个名为emptyListViewArrow的子视图UIImageView,它可视地指向按钮,在我的UITableView中创建一个新条目.这个箭头以无论是上下方式无限制地动画.

我监听EmptyListView在完成布局子视图后发送通知.我这样做是因为如果没有,变异约束的动画表现不正确.

- (void) layoutSubviews {
    [super layoutSubviews];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"EmptyViewDidLayoutSubviews" object:nil];
}
Run Code Online (Sandbox Code Playgroud)

当ListViewController观察到此通知时,它会开始动画:

[UIView animateWithDuration:0.8f delay:0.0f options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) animations:^{
    self.emptyListViewArrowVerticalSpace.constant = 15.0f;
    [emptyListView layoutIfNeeded];
} completion:nil];
Run Code Online (Sandbox Code Playgroud)

如果我将应用程序放在后台或在堆栈上推送另一个ViewController,一旦我回到应用程序或ListViewController,动画就会停止/暂停.我无法重新开始.

我试过了:

  1. 听取申请将辞职/变得活跃.辞职时,我做了[self.view.layer removeAllAnimations],然后尝试使用上面的代码再次启动动画.
  2. 删除动画的UIImageView并将其添加回父视图,然后尝试启动动画.

我很遗憾在这里使用约束,但是很想知道可能存在什么问题.

谢谢!

rde*_*mar 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];
}
Run Code Online (Sandbox Code Playgroud)


Vak*_*kas 9

我有同样的问题。解决以下问题。

yourCoreAnimation.isRemovedOnCompletion = false
Run Code Online (Sandbox Code Playgroud)

或者你有一组动画

yourGroupAnimation.isRemovedOnCompletion = false
Run Code Online (Sandbox Code Playgroud)


Pra*_*kam 5

这是缺点.要克服这个问题,你必须再次调用动画方法.

你可以这样做:

在控制器中添加Observer

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeAnimation:) name:UIApplicationDidBecomeActiveNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

恢复应用后,将调用此方法.

添加此方法:

- (void)resumeAnimation:(NSNotification *)iRecognizer {
    // Restart Animation
}
Run Code Online (Sandbox Code Playgroud)

希望这会帮助你.