在呈现VC时保持动画视图的最后位置

时间:2014-03-28 20:21:52

标签: ios objective-c animation uiviewanimation

我正在动画一个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有一些东西..

1 个答案:

答案 0 :(得分:3)

首先,您不应在viewDidLoad中制作动画视图。您应该在viewWillAppearviewDidAppear开始动画。

评论中说的是正确的,你不应该在启用自动布局时直接修改帧。任何约束更新或布局传递都会将帧重置为其原始值。你应该做的是修改现有的约束本身。如果在代码中添加这些约束,可能会将动画所需的那些保存为属性,并在动画设置方法中进行修改。如果在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是已在某处设置的约束示例。