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);
作为测试,我设置了一个按钮,单击该按钮后,会为您指定的 frame
和 position
的视图设置动画。
无论UICollectionView
的滚动状态如何,视图都会移入。
我还尝试在动画视图本身上设置一个点击手势识别器,以将其动画化回其动画后frame
和position
,即使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 时保留 UICollectionViewCell
在 UICollectionView 中滚动时绕过 UIScrollViewDelegate
停止滚动时获取 UICollectionView 的项目(或索引)
tvOS:当它像这样实现时无法滚动 UICollectionView 项目:UITableView 内的 UICollectionView