Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 屏幕外的动画视图出错_Ios_Objective C_Animation - Fatal编程技术网

Ios 屏幕外的动画视图出错

Ios 屏幕外的动画视图出错,ios,objective-c,animation,Ios,Objective C,Animation,我有一个包含两个视图的视图控制器。我需要的是,在按下视图控制器之后,顶部的视图(_sidepanelview)会移到屏幕的左侧 以下是我写的: -(void)viewDidAppear:(BOOL)animated{ CGRect newsidepanelviewposition = _sidepanelview.frame; newsidepanelviewposition.origin.x = -_sidepanelview.frame.size.width; [

我有一个包含两个视图的视图控制器。我需要的是,在按下视图控制器之后,顶部的视图(_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!");

    }];
}
问题是,当我运行应用程序时,在按下视图控制器后,视图(侧面板视图)从屏幕上消失,并从右侧再次出现在屏幕中央,而不是从x=0移动到x=-\u侧面板视图宽度从屏幕上消失

我做错了什么


注意:我在应用程序中未选中“自动布局”,动画工作正常,但在打开“自动布局”的情况下使用它会让人抓狂

正如您的
注释所示,自动布局是“罪魁祸首”。
视图具有自动布局引擎定期强制执行的约束。更改视图的
框架时,框架会发生更改,但视图的布局约束不会发生更改。当下一个周期的
布局子视图
发生时,视图的位置和大小(即
)将重置为约束规定的大小

如果要包含该视图/视图控制器的自动布局,请使用约束更改来执行动画

这里的黄金法则是,
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!");

    }];
}
  • 参考
    \u侧面板LeadingSpace
    NSLayoutConstraint
    ),以查看
    \u侧面板视图
    的前导空间约束,例如IBOutlet
  • 通过在动画块中调用
    layoutifneedd
    ,更改约束的
    常量
    ,并布局视图

  • 你能告诉我如何使用setFrame来反驳故事板中的约束吗?我的意思是,
    setFrame
    本质上与AutoLayout相矛盾,因为帧更新不会更新约束。如果您使用的是自动布局,请不要使用
    setFrame
    ——始终只更新约束。我已经用一些示例代码更新了我的答案。在我的例子中,我只是使用约束将_sidepanelview在容器的X和Y中居中。我应该如何更新约束?例如,我看到您使用了leadingSpace约束。好的,在这种情况下,为centerX约束创建一个
    IBOutlet
    。将其设置为“减去侧面板宽度”将使中心偏移该距离。不客气!:)要了解更多关于这个主题的信息,我强烈推荐过去3年的WWDC讨论,特别是早期的讨论!