我正在开发一个有几个笔尖的iPhone应用程序,应该只是风景。
应用程序设置为通过Info.plist文件以横向模式启动。
我有两个视图控制器:
FirstViewController
和SecondViewController
。
对于其中的每一个,我都有一个nib文件,其中视图是横向的。两个视图控制器都作为插件添加到我的MainView
笔尖中,并且他们的视图被懒惰地初始化。
加载应用程序时,第一个视图按预期显示在横向中。但是,当我切换到第二个视图时,设备(或模拟器)保持横向,但视图旋转,就像设备处于纵向模式,制动我的界面。
在UIViewController
个类中,我有以下代码:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}
并切换视图,在我的app委托中我正在做:
[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];
其中viewController
和secondViewController
是视图控制器连接的两个出口。
这是第二个视图在IB中的显示方式: alt text http://img27.imageshack.us/img27/4898/picture1ni.png
这就是它在模拟器中的样子: alt text http://img402.imageshack.us/img402/4866/picture2wt.png
为什么第二个视图在横向显示但是界面已旋转?
我不想处理转换属性,因为这似乎有点过分了。
答案 0 :(得分:3)
我主演了这个问题,希望有人会给你一个富有洞察力的回应,我会学到一些东西......遗憾的是,我担心你可能需要使用变换才能让它正常工作。这是我最近用来解决问题的代码:
- (void)forceLandscapeForView:(UIView *)theView {
theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
theView.bounds = CGRectMake(0, 0, 480, 320);
theView.center = CGPointMake(160, 240);
[theView setNeedsLayout];
[theView setNeedsDisplay];
}
然后,当您添加新视图时,请检查当前方向,并在必要时强制旋转:
if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
[self forceLandscapeForView:_activeViewController.view];
}
当然,您需要在每个视图控制器中对shouldAutorotateToInterfaceOrientation
做出适当的响应:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
如果不是全部必要,我很乐意听到其他解决方案。我已经注意到这个设置还有一个警告:如果你在视图之间有一个过渡,并且你在转换过程中旋转手机,那么视图方向可能会被翻转或“卡住”在错误的横向方向上,例如在视图之间导航时,您需要将手机翻过来(横向右侧与横向左侧)。
答案 1 :(得分:0)
这只是一个建议,但您可以尝试在第二个视图的shouldAotorotate方法中返回NO。或者尝试在IB中的纵向视图中进行制作。您的视图似乎已正确加载(在横向模式下),但随后收到了shouldAutorotate消息并已旋转了90度。