我正在尝试使用UIView动画模仿UINavigationController的pushViewController,但我似乎遇到了一个问题。我无法为self.view.frame设置动画。
这是我正在使用的代码但是self.view只是不会移动!
[self.view addSubview:myViewController.view];
[myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];
[UIView animateWithDuration:0.5
animations:^{
[self.view setFrame:CGRectMake(-320, 0, 320, 480)];
[myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
}
completion:^(BOOL finished){
[view1.view removeFromSuperview];
}];
谢谢!
答案 0 :(得分:3)
考虑动画开始之前视图的位置:
self.view.frame
是(我假设)0,0,320,380 myViewController.view
是self.view
myViewController.view.frame
在self.view
的坐标系中是320,0,320,480 ,所以它在超视图的框架之外(并且在屏幕的右边缘之外)现在考虑动画完成后视图的位置:
self.view.frame
是-320,0,320,480 myViewController.view
仍然是self.view
myViewController.view.frame
在self.view
的坐标系中是0,0,320,480 ,因此它完全位于其超视图的框架内,但其在屏幕坐标系中的框架为-320,0,320,480,所以它现在完全离开了屏幕的左边缘您需要将myViewController.view
作为self.view
的兄弟,而不是子视图。试试这个:
// Calculate the initial frame of myViewController.view to be
// the same size as self.view, but off the right edge of self.view.
// I don't like hardcoding coordinates...
CGRect frame = self.view.frame;
frame.origin.x = CGRectGetMaxX(frame);
myViewController.view.frame = frame;
[self.view.superview addSubview:myViewController.view];
// Now slide the views over.
[UIView animationWithDuration:0.5 animations:^{
CGRect frame = self.view.frame;
myViewController.view.frame = frame;
frame.origin.x -= frame.size.width;
self.view.frame = frame;
} completion:^(BOOL done){
[view1.view removeFromSuperview];
}];
答案 1 :(得分:1)
无法判断是否存在与调用此代码的上下文相关的其他问题。看起来view1
是一个UIViewController子类。你应该重命名,非常令人困惑。
我确实注意到你的帧操作存在问题。看起来self
是容器视图控制器,例如self.view
包含动画视图(view1.view
和myViewController.view
,不应为其自身设置动画。如果这是正确的,您的动画应为:
[self.view addSubview:myViewController.view];
[myViewController.view setFrame:CGRectMake(320, 0, 320, 480)];
[UIView animateWithDuration:0.5
animations:^{
[view1.view setFrame:CGRectMake(-320, 0, 320, 480)];
[myViewController.view setFrame:CGRectMake(0, 0, 320, 480)];
}
completion:^(BOOL finished){
[view1.view removeFromSuperview];
}];
顺便说一句,一个视图控制器会从它的超视图中动画出来,这似乎很奇怪。如果self
是容器视图控制器,我希望逻辑存在。有关如何实现容器视图控制器的示例,请参阅我对Animate change of view controllers without using navigation controller stack, subviews or modal controllers?的回答。在那里修改我的例子来制作你想要的动画幻灯片是微不足道的。