动画self.view.frame?
-
25-10-2019 - |
题
我正在尝试使用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,380myViewController.view
是self.view
myViewController.view.frame
为320,0,320,480 在self.view
的坐标系, ,因此它不在其超级图的框架之外(屏幕的右边缘)
现在考虑动画完成后的观点:
self.view.frame
为-320,0,320,480myViewController.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.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
是一个容器视图控制器,我希望逻辑在那里。看到我的答案 动画更改视图控制器,而无需使用导航控制器堆栈,子视图或模态控制器? 有关如何实现容器视图控制器的示例。修改我的示例以进行您想要的动画幻灯片是微不足道的。
不隶属于 StackOverflow