我有一个包含两个视图的视图控制器。我需要的是,在按下视图控制器后,顶部的视图(_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宽度从屏幕上消失。
我做错了什么?
注意:我在未选中自动布局的情况下执行了该应用,动画效果很好,但是在启用自动布局的情况下使用它会吓坏!
答案 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!");
}];
}
_sidePanelLeadingSpace
(NSLayoutConstraint
)添加到_sidepanelview
的行距空间约束中,例如作为IBOutlet。constant
并通过调用动画块中的layoutIfNeeded
来布局视图