我有一个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坐标没有变化) 试图弄清楚我搞砸了哪里。任何帮助将不胜感激。
答案 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);
}
作为测试,我设置了一个按钮,在点击该按钮时,会为您的视图设置动画,就像您指定的视图一样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
。
答案 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
制作动画来进行测试,完成块将立即执行。