我正在动画一个ImageView来移动它。一切正常,但当我呈现ViewController时,ImageView会切换回原来的位置。
我已经尝试在动画完成时设置Frame,但它仍然会换回原来的位置。
继续我的所作所为:-(void)viewDidLoad:(BOOL)animated{
[super viewDidLoad:animated];
[self performSelector:@selector(animationCode) withObject:nil afterDelay:0.1f];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
//Animate welcome screen
-(void)animationCode{
CGRect imageFrame = self.imageViewLogo.frame;
[UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.imageViewLogo.center = CGPointMake(self.imageViewLogo.center.x, self.imageViewLogo.center.y-150);
}completion:^(BOOL finished){
self.imageViewLogo.frame = CGRectMake(imageFrame.origin.x, imageFrame.origin.y-150, imageFrame.size.width, imageFrame.size.height);
}];
}
知道怎么解决这个问题吗?我认为它与viewDissapering有一些东西..
答案 0 :(得分:3)
首先,您不应在viewDidLoad
中制作动画视图。您应该在viewWillAppear
或viewDidAppear
开始动画。
评论中说的是正确的,你不应该在启用自动布局时直接修改帧。任何约束更新或布局传递都会将帧重置为其原始值。你应该做的是修改现有的约束本身。如果在代码中添加这些约束,可能会将动画所需的那些保存为属性,并在动画设置方法中进行修改。如果在Interface Builder中设置视图,则可以在代码中创建约束出口并以这种方式访问它们。请记住在动画块内调用[self.view layoutIfNeeded]
来实际触发约束更新和布局传递。
-(void)animationCode{
CGRect imageFrame = self.imageViewLogo.frame;
[UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.imageViewLogoYConstraint.constant -= 150;
[self.view layoutIfNeeded];
} completion:nil];
}
其中,imageViewLogoYConstraint
是已在某处设置的约束示例。