我有两个UIImageView
填充视图控制器,第一个填充上半部分,第二个填充下半部分。我直接在故事板文件中设置它们。
在viewDidLoad
方法中,我正在设置代码以便为两个UIImageView
执行动画,以便它看起来像一个被打开的篮子(第一个UIImageView
被移动到顶部直到它离开视图,第二个UIImageView
移动到视图的底部,直到它离开视图。)
到目前为止,这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CGRect basketTopFrame = self.basketTop.frame;
basketTopFrame.origin.y = -basketTopFrame.size.height;
CGRect basketBottomFrame = self.basketBottom.frame;
basketBottomFrame.origin.y = self.view.bounds.size.height;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.basketTop.frame = basketTopFrame;
self.basketBottom.frame = basketBottomFrame;
[UIView commitAnimations];
}
但是行为与我期望的不同,顶部框架没有移动,底部框架从左上到下动画(原点位置,而不是移出视图)。
这是我在故事板中设置的UIImageViews
位置:
这是我启动应用时的UIImageViews
:
当应用完成动画(UIImageViews
)时,这是viewDidLoad
:
请注意,此代码适用于Xcode 4.2,但自从升级到Xcode 4.5并使用Storyboard后,我开始遇到此问题。提前完成。
答案 0 :(得分:5)
您可以在故事板上启用自动布局。在这种情况下,视图组件在viewDidLoad中没有有效的帧值,因此您的代码将无法工作。
您可以通过在故事板中选择文件检查器并取消选中“使用Autolayout”来禁用自动布局。
无论如何,这是从中开始动画的错误方法。尝试将代码移动到viewDidAppear。
答案 1 :(得分:0)
一旦你关闭了“AutoLayout”,如果你的目标是IOS 4,而不是基于块的UIView动画,那么Apple建议它简化过程,你可以在一行中完成任务。请查看UIView Reference以获取更多信息。
在您的情况下,无论您是否计划在ViewDidLoad / ViewWillAppear中执行动画,都可以使用基于块的动画以下列方式完成:
CGRect basketTopFrame = self.boxTop.frame;
CGRect basketBottomFrame = self.boxBottom.frame;
[UIView animateWithDuration: 0.5 delay:0.1 options:UIViewAnimationOptionCurveEaseOut animations:^{
[self.boxTop setFrame:CGRectMake(basketTopFrame.origin.x, -basketTopFrame.size.height, basketTopFrame.size.width, basketTopFrame.size.height)];
[self.boxBottom setFrame:CGRectMake(basketBottomFrame.origin.x, self.view.bounds.size.height, basketBottomFrame.size.width, basketBottomFrame.size.height)];
} completion:^(BOOL finished) {
// TODO : Do any additional stuffs.
}];