Cocoa touch 我可以手动触发viewController上支持的接口方向的任何调用吗?
我有一个UINavigationController子类作为我的应用程序中的根viewController。我将各种其他视图控制器推送到导航控制器的ViewController堆栈上 其中一些允许以任何方向显示,一些仅为横向显示 我使用了此链接中的信息: 因此,当设备发生旋转时,导航控制器会正确报告俯视图控制器允许的方向。然而,当一个新的视图控制器被推到堆栈上时,我似乎无法解决如何触发自动旋转 e、 g.应用程序的根vc是my naviationViewController。它的初始顶部vc可以横向或纵向显示。假设设备是纵向的,现在我将另一个vc推到导航控制器上。这个新的vc只能在横向显示。如果设备旋转360度,则会发生正确的情况,即导航控制器将旋转限制为横向。但是,如果设备从未移动,则navController上不会调用supportedInterfaceOrientations:,因此设备不知道UI应自动旋转到横向 那么-当旋转发生时,我可以触发UIC应用程序执行它所做的任何操作吗?还是我遗漏了什么Cocoa touch 我可以手动触发viewController上支持的接口方向的任何调用吗?,cocoa-touch,uinavigationcontroller,screen-rotation,Cocoa Touch,Uinavigationcontroller,Screen Rotation,我有一个UINavigationController子类作为我的应用程序中的根viewController。我将各种其他视图控制器推送到导航控制器的ViewController堆栈上 其中一些允许以任何方向显示,一些仅为横向显示 我使用了此链接中的信息: 因此,当设备发生旋转时,导航控制器会正确报告俯视图控制器允许的方向。然而,当一个新的视图控制器被推到堆栈上时,我似乎无法解决如何触发自动旋转 e、 g.应用程序的根vc是my naviationViewController。它的初始顶部vc可以
谢谢。因此,您似乎可以触发系统重新评估哪些设备方向是允许的。每当viewController以模式全屏显示时,就会发生这种情况 因此,(这是一个令人讨厌的攻击,但似乎有效)你可以要求根VC提出一个只允许横向的VC,然后一旦提出,再次驳回它 e、 g.见以下代码:
- (void)viewDidAppear:(BOOL)animated
{
// Force an orientation update if we are not in landscape...
BOOL force = YES;
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft)
{
force = NO;
}
if (force)
{
PortraitOnlyViewController *newVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"forceLandscape"];
[self.navigationController presentViewController:newVC animated:NO completion:^(void){
NSLog(@"forcing VC has been presented.");
[self.navigationController dismissViewControllerAnimated:NO completion:^(void){
NSLog(@"forcing VC has been dismissed");
}];
}];
}
}
我不得不修改Diggory的答案,因为我没有使用UINavigationController,也没有使用Swift。我在iOS 8.3上还遇到以下错误:
Trying to dismiss the presentation controller while transitioning already. (<_UIFullscreenPresentationController
class ViewController: UIViewController {
var allowTurning = false
override func supportedInterfaceOrientations() -> Int {
if allowTurning {
return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
} else {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
}
@IBAction func doTurn(sender: UIButton) {
allowTurning = true
let fakeViewController = UIViewController()
presentViewController(fakeViewController, animated: false) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.dismissViewControllerAnimated(false, completion: {
NSLog("Done dismissing!")
})
})
}
}
}