UICollectionView 滚动时 UIView 动画停止工作

Posted

技术标签:

【中文标题】UICollectionView 滚动时 UIView 动画停止工作【英文标题】:UIView Animation stops working when UICollectionView scrolled 【发布时间】:2015-08-19 20:53:29 【问题描述】:

我有一个 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坐标不变) 试图弄清楚我在哪里搞砸了。任何帮助将不胜感激。

【问题讨论】:

您是否尝试删除viewDidLayoutSubviews 中的self.displayView.frame?会发生什么? 【参考方案1】:

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

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

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

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

为什么会这样?

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

【讨论】:

【参考方案2】:

问题是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

【讨论】:

以上是关于UICollectionView 滚动时 UIView 动画停止工作的主要内容,如果未能解决你的问题,请参考以下文章

滚动时 UICollectionView 的滞后

滚动 UICollectionView 时保留 UICollectionViewCell

UICollectionView 在滚动时响应?

在 UICollectionView 中滚动时绕过 UIScrollViewDelegate

停止滚动时获取 UICollectionView 的项目(或索引)

tvOS:当它像这样实现时无法滚动 UICollectionView 项目:UITableView 内的 UICollectionView