动画self.view.frame?

时间:2011-11-30 04:41:52

标签: ios animation uiview pushviewcontroller

我正在尝试使用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];
                     }];

谢谢!

2 个答案:

答案 0 :(得分:3)

考虑动画开始之前视图的位置:

  • self.view.frame是(我假设)0,0,320,380
  • myViewController.viewself.view
  • 的子视图
  • myViewController.view.frameself.view的坐标系中是320,0,320,480 ,所以它在超视图的框架之外(并且在屏幕的右边缘之外)

现在考虑动画完成后视图的位置:

  • self.view.frame是-320,0,320,480
  • myViewController.view仍然是self.view
  • 的子视图
  • myViewController.view.frameself.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.viewmyViewController.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?的回答。在那里修改我的例子来制作你想要的动画幻灯片是微不足道的。