Ios 屏幕外的动画视图出错
我有一个包含两个视图的视图控制器。我需要的是,在按下视图控制器之后,顶部的视图(_sidepanelview)会移到屏幕的左侧 以下是我写的: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; [
-(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讨论,特别是早期的讨论!