屏幕外的动画视图出错ios

时间:2016-11-01 00:30:57

标签: ios objective-c animation

我有一个包含两个视图的视图控制器。我需要的是,在按下视图控制器后,顶部的视图(_sidepanelview)向左移动,消失在屏幕上。

这是我写的:

-(void)viewDidAppear:(BOOL)animated{
    CGRect newsidepanelviewposition = _sidepanelview.frame;
    newsidepanelviewposition.origin.x = -_sidepanelview.frame.size.width;


    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        _sidepanelview.frame = newsidepanelviewposition;

    } completion:^(BOOL finished) {
        NSLog(@"Done!");

    }];
}

问题在于,当我运行应用程序时,在按下视图控制器之后,视图_sidepanelview从屏幕上消失并再次出现在屏幕中心来自右侧而不是从x = 0向左移动到x = -_sidepanelview宽度从屏幕上消失。

我做错了什么?

注意:我在未选中自动布局的情况下执行了该应用,动画效果很好,但是在启用自动布局的情况下使用它会吓坏!

1 个答案:

答案 0 :(得分:2)

正如您的note建议的那样,自动布局是"罪魁祸首"。 您的视图具有AutoLayout引擎定期强制执行的约束。当您更改视图的frame时,框架会更改,但不会更改视图的布局限制。当layoutSubviews的下一个周期发生时,您的观点位置和大小(即frame)将重置为约束所规定的内容。

如果要为该视图/视图控制器包含AutoLayout,请使用约束更改来执行动画。

这里的黄金法则是, setFrame是AutoLayout的对立面。

示例代码

-(void)viewDidAppear:(BOOL)animated {

    _sidePanelLeadingSpace.constant = -_sidepanelview.frame.size.width; // 1 

    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{

        [self.view layoutIfNeeded]; // 2


    } completion:^(BOOL finished) {
        NSLog(@"Done!");

    }];
}
  1. 将引用_sidePanelLeadingSpaceNSLayoutConstraint)添加到_sidepanelview的行距空间约束中,例如作为IBOutlet。
  2. 更改约束' constant并通过调用动画块中的layoutIfNeeded来布局视图