为了使用 UISplitViewController,我在从一个视图控制器导航到另一个视图控制器时替换了窗口根控制器。
为了在执行此操作时获得一些不错的过渡,我使用了如下的缩放效果:
MyOtherViewController *controller = [[MyOtherViewController alloc] initWithNibName:@"MyOtherView" bundle:nil];
UIWindow *window = ((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).window;
controller.view.frame = [window frame];
controller.view.transform = CGAffineTransformMakeScale(0.01,0.01);
controller.view.alpha = 0;
[window addSubview:controller.view];
[UIView animateWithDuration:0.2 animations:^{
controller.view.transform = CGAffineTransformMakeScale(1,1);
controller.view.alpha = 1.0;
} completion:^(BOOL finished) {
if (finished) {
[self.view removeFromSuperview];
window.rootViewController = controller;
}
}];
这工作得很好,除了在制作动画时,新视图总是像纵向模式一样定向,无论当前设备方向如何。动画完成后,视图会正确定向。
我缺少什么?
我尝试过的事情:
- 将我的新控制器视图作为 UIWindow 的唯一子视图
- 在动画开始之前使我的新控制器成为根视图控制器
奇怪的是,如果我在方法开始时对窗口执行 recursiveDescription,则窗口框架被定义为尺寸为 768x1024(即纵向),并且其中的视图为 748x1024,但变换为[0, -1, 1, 0, 0, 0] (这是旋转还是什么?不应该是恒等变换吗?)
UIWindow
不旋转。它内部有一个旋转视图(如您所见)。不过,在这种情况下,我认为问题可能是您的视图此时已经进行了转换,并且您需要将其连接起来,而不是像在您的视图中所做的那样替换它setTransform:
calls.
您不应该向应用程序委托询问窗口,您应该从视图中获取窗口(self.view.window
).
如果在任何时候您将视图附加到窗口本身,而不是将其放入旋转视图中,那么您需要通过遍历层次结构来了解要匹配的视图的有效变换:
- (CGAffineTransform)effectiveTransform {
CGAffineTransform transform = [self transform];
UIView *view = [self superview];
while (view) {
transform = CGAffineTransformConcat(transform, [view transform]);
view = [view superview];
}
return transform;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)