我正在尝试使用Uiview Animation模仿UinavigationController的PushViewController,但我似乎已经遇到了一个问题。我无法动画self.view.frame。

这是我正在使用的代码,但自我。查看不会移动!

    [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];
                     }];

谢谢!

有帮助吗?

解决方案

考虑动画开始之前的观点:

  • self.view.frame 是(我认为)0,0,320,380
  • myViewController.viewself.view
  • myViewController.view.frame 为320,0,320,480 self.view的坐标系, ,因此它不在其超级图的框架之外(屏幕的右边缘)

现在考虑动画完成后的观点:

  • self.view.frame 为-320,0,320,480
  • myViewController.view 仍然是 self.view
  • myViewController.view.frame 为0,0,320,480 self.view的坐标系, ,因此它完全位于其超级图片的框架内,但其屏幕坐标中的框架为-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];
}];

其他提示

无法确定您是否遇到与此代码的上下文有关的其他问题。好像 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 是一个容器视图控制器,我希望逻辑在那里。看到我的答案 动画更改视图控制器,而无需使用导航控制器堆栈,子视图或模态控制器? 有关如何实现容器视图控制器的示例。修改我的示例以进行您想要的动画幻灯片是微不足道的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top