Ios 显示VC时保持动画视图的最后位置

Ios 显示VC时保持动画视图的最后位置,ios,objective-c,animation,uiviewanimation,Ios,Objective C,Animation,Uiviewanimation,我正在设置ImageView的动画以将其向上移动。一切正常,但当我呈现ViewController时,ImageView会切换回其原始位置 我已经尝试在动画完成时设置帧,但它仍然切换回其原始位置 我是这样做的: -(void)viewDidLoad:(BOOL)animated{ [super viewDidLoad:animated]; [self performSelector:@selector(animationCode) withObject:nil afterDela

我正在设置ImageView的动画以将其向上移动。一切正常,但当我呈现ViewController时,ImageView会切换回其原始位置

我已经尝试在动画完成时设置帧,但它仍然切换回其原始位置

我是这样做的:

-(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);
    }];
}

你知道怎么解决这个问题吗?我认为它与ViewDisPapering有关。

首先,您不应该在
viewDidLoad
中设置动画视图。您应该在
viewwillbeen
viewdidebeen
中启动动画

评论中所说的是正确的,在启用自动布局时不应直接修改帧。任何约束更新或布局过程都会将框架重置为其原始值。您应该做的是修改已就位的约束本身。如果在代码中添加这些约束,可能会将动画所需的约束另存为属性,并在动画设置方法中修改它们。如果在Interface Builder中设置视图,则可以在代码中创建约束的输出并以这种方式访问它们。记住在动画块内调用
[self.view layoutifneed]
,以实际触发约束更新和布局传递

-(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
是一个已在某处设置的约束示例。

是否启用了自动布局?是的,我需要它:使用自动布局时不应设置任何帧-当视图需要重绘时,子视图将恢复到其约束定义的位置,不是您指定的新帧。您需要通过修改约束来执行任何移动或调整大小。我注意到的一件事是在viewDidLoad中而不是在ViewDidDisplay中启动动画。我也不知道你为什么要在完成块中重新定位它。@rdelmar该死,我该怎么做?我在IB中再次检查了我的视图。我没有在Imageview上设置任何约束。@SaifDeen如果你不在Interface Builder中添加约束,默认约束将为你添加。这些默认约束旨在将其保留在IB中的位置。您需要添加约束,因为您无法将这些默认约束链接到插座。我尝试添加Y约束,但在IB中找不到正确的对齐约束…@SaifDeen您不能只添加Y约束,你们需要添加所有的约束,这样布局就不会模棱两可了。该死,真管用!因为每个人都有相同的问题:添加所有约束,为Y achse约束添加一个出口,然后像leo写的那样修改它。再次感谢!