我正面临一个奇怪的iOS 8.3问题,它显示键盘的方向错误(视图控制器处于横向模式,但键盘显示在纵向模式下):
我可以按照以下步骤触发此问题:
创建2个UIViewController
子类:ViewControllerA
和ViewControllerB
在ViewControllerA
实施supportedInterfaceOrientations
并返回UIInterfaceOrientationMaskPortrait
在ViewControllerB
实施supportedInterfaceOrientations
并返回UIInterfaceOrientationMaskLandscape
创建一个名为UINavigationController
的{{1}}子类,实现NavigationController
并返回supportedInterfaceOrientations
(我这样做是因为我想保留NavigationController并且它是rootVC来自旋转)
使用[self.topViewController supportedInterfaceOrientations]
作为应用的初始视图控制器,将NavigationController
设置为ViewControllerA
NavigationController
启动应用,rootViewContrller
将显示在肖像中。在ViewControllerA
上显示一个按钮,使用ViewControllerA
ViewControllerB
presentViewController:animated:completion
将出现在Landscape中;在ViewControllerB
上显示文本字段,点击文本字段将触发键盘,但键盘处于纵向模式,就像上图一样。
PS。您可以下载并运行Xcode项目on github
此问题似乎只出现在iOS 8.3上。难道我做错了什么 ?或许这只是iOS的另一个错误?
顺便说一句,如果您只是在没有ViewControllerB
的情况下直接显示ViewControllerA
,则不会发生此问题。因此,如果这是iOS的错误,我怎样才能避免继承ViewController
,但仍然保留UINavigationController
ViewControllerA
的{{1}}旋转。
更新:此错误仍然出现在iOS 8.4上,我在2015年6月17日发布了一个错误报告,并得到了苹果的回复,他们表示已经在最新的iOS 9测试版中解决了这个问题。
答案 0 :(得分:2)
我们通过欺骗设备认为它被旋转到不同的方向然后进入预期的方向来解决这个问题。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.segmentedControl.selectedSegmentIndex = 0;
if(!self.rotatingForDismissal)
{
[self.tableNumberTextField becomeFirstResponder];
}
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.3"))
{
[[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeLeft) forKey:@"orientation"];
[[UIDevice currentDevice] setValue:@(self.interfaceOrientation) forKey:@"orientation"];
}
}
答案 1 :(得分:0)
我能够使用以下内容正确显示键盘。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (SYSTEM_VERSION_GREATER_THAN(@"7.1") && SYSTEM_VERSION_LESS_THAN(@"9.0"))
{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[[UIDevice currentDevice] setValue:@(UIDeviceOrientationUnknown) forKey:@"orientation"];
[[UIDevice currentDevice] setValue:@(orientation) forKey:@"orientation"];
}
}
请注意,使用UIDeviceOrientationUnknown
不会导致副作用,例如视图自动轮换不当。