当UICollectionView滚动时,UIView Animation停止工作

时间:2015-08-19 20:53:30

标签: ios objective-c iphone xcode

我有一个UIView。我在我的代码中的viewDidLayoutSubviews方法中设置它的位置:

self.displayView.frame =  CGRectMake(-self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);

按下按钮显示此视图,动画完成如下:

[UIView animateWithDuration:0.25 animations:^{
    self.displayView.frame =  CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}];

我在同一页面上也有一个UICollectionView。 上面的动画很有效,直到我开始滚动UICollectionView。如果我滚动UICollectionView然后单击上面的动画按钮,它就不起作用。我在animateWithDuration块之前和之后检查了displayView的位置,它显示了完全相同的位置。 (displayView的x和y坐标没有变化) 试图弄清楚我搞砸了哪里。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

问题是在viewDidLayoutSubviews滚动期间多次调用UICollectionView。因此,它会尝试将您的视图重新定位回:

self.displayView.frame =  CGRectMake(-self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);

相反,请尝试在viewDidLoad

中设置上述内容
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.displayView.frame = CGRectMake(-self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);
}

作为测试,我设置了一个按钮,在点击该按钮时,会为您的视图设置动画,就像您指定的视图一样frameposition

无论UICollectionView的滚动状态如何,视图都会移动。

我还尝试在动画视图上设置一个点击手势识别器,以便将其动画回动画后的frameposition,即使UICollectionView是正在滚动:

self.displayView.frame =  CGRectMake(-self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height);

动画不受滚动影响,因为frame的设置已移至viewDidLoad

答案 1 :(得分:0)

我今天在尝试制作弹跳动画时遇到了这个问题:

UIView.animate(withDuration: 1,
               delay: 0,
               options: [.autoreverse, .repeat],
               animations: { self.bouncingHeart.transform = CGAffineTransform(scaleX: 1.2, y: 1.2) },
               completion: nil)

滚动后,它根本就没有动画了。解决方案是重置在调用animations时在prepareForResure块内更改的属性:

override func prepareForReuse() {
    super.prepareForReuse()
    bouncingHeart.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
}

为什么会这样?

如果对已经达到其目标值的属性设置动画,则不会发生动画。您可以通过使用UIView创建一个alpha = 1,然后尝试为alpha = 1制作动画来进行测试,完成块将立即执行。