强制旋转 UIViewController

Posted

技术标签:

【中文标题】强制旋转 UIViewController【英文标题】:Force Rotate UIViewController 【发布时间】:2012-07-06 17:23:56 【问题描述】:

所以,我已经放弃尝试解决我一直遇到的一个问题,我的控制器将在不调用我的 shouldAutorotateToInterfaceOrientation: 方法的情况下旋转,因为几年来每个人都将其称为 ios 错误。

现在我只需要强制旋转我的UIViewController。有没有办法可以做到这一点,因为 UIDevice 实例方法现在已被删除,我不知道该怎么做才能强制旋转我的控制器。

【问题讨论】:

看看这个问题***.com/questions/9826920/…。我不确定,+ (void)attemptRotationToDeviceOrientation 方法是否可以回答您的问题。 这是一件好事,但不幸的是,我的问题恰恰相反。我不是试图旋转到某个方向,而是在设备仍保持在错误方向时从错误方向返回。 你说shouldAutoRotateToInterfaceOrientation 没有被调用。显然这是 iOS6 之前的问题,所以也许你不再关心了,但如果你仍然有这个问题,这可能是由于你的视图控制器层次结构与你的视图层次结构不同步(例如错误地使用addSubview 在视图之间转换)。如果您在这里仍有问题,请随时告诉我们。 @Rob 我仍然有这个问题。问题是当 MPMediaPlayer 出现并旋转为横向时(仅在纵向视图中 - 但我很欣赏它旋转为横向)。当 MPMediaPlayer 被关闭时,呈现它的 UIView / UIViewController 现在被旋转到横向,甚至无需调用任何旋转方法。我可以使用NSNotificationCenter 拦截旋转通知,但这对我没有帮助,因为我无法强制旋转控制器。 【参考方案1】:

我不确定您所说的哪个 UIDevice 方法已被删除,但以下方法对我有用(这确实使用了 UIDevice orientation 方法)。底线,如果您有一个只接受横向的视图,您可以使用以下命令强制 iOS 更改方向。这很奇怪,但它确实有效。抱歉,我不能将功劳归功于原作者,但曾经在 *** 上的其他地方遇到过这个问题:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);


- (void)forceLandscape

    // make sure shouldAutorotateToInterfaceOrientation is configured to accept only landscape

    if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))
    
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *view = [window.subviews objectAtIndex:0];
        [view removeFromSuperview];
        [window addSubview:view];
    

相当于强制纵向模式(当然,假设您的shouldAutorotateToInterfaceOrientation 只接受纵向):

- (void)forcePortrait

    // make sure shouldAutorotateToInterfaceOrientation is configured to accept only portrait

    if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))
    
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *view = [window.subviews objectAtIndex:0];
        [view removeFromSuperview];
        [window addSubview:view];
    

【讨论】:

那么,基本上,删除根视图控制器并读取它?这看起来不是有点骇人听闻,因为控制器无论如何都不应该旋转?苹果会在完整的应用程序中允许这样做吗? 我只是想看看其他人是否有其他选择,但我很确定这就是我最终不得不选择的。 哦。对不起。它是根视图,而不是视图控制器。我没有正确阅读内容! 但我确实尝试过,但它仍然没有强制旋转。 @RileyE 是的,绝对是hackish。丑,丑,丑。我不喜欢它,但它对我有用。为了回答你关于它不起作用的问题,我不得不问你是如何创建你的视图的。我只是问,因为如果您正在使用数量惊人的[self.view addSubview:controller.view],那么众所周知,这会阻止滚动事件被发送到您的新视图。但是,如果您通过标准pushViewControllerpresentViewController 获得您的视图,您应该没问题。您是如何过渡到纯横向视图的?【参考方案2】:

使用 xcode7.3 ios9。 一个多星期以来,我一直在尝试强制打开和关闭景观视图,没有留下任何头发:(。对于其他任何人发现这个问题并且没有一个答案有效,或者任何其他关于强制景观的无数答案,我终于找到了在这里工作的东西: http://www.btday.com/how-to-force-view-controller-orientation-in-ios-8/

建议是把操作放在viewDidAppear里,不过好像在viewWillAppear里也能用,稍微不那么难看。

override func viewWillAppear(animated: Bool) 
    UIDevice.currentDevice().setValue(UIInterfaceOrientation.LandscapeLeft.rawValue, forKey: "orientation")

如果这是错误/不好的,请说出来,我只有一个多月的 mac,所以我完全是 nuub!

还请注意,我使用的是 UITabBarController,无论您将它放在标签栏控制器还是其中一个子标签栏控制器中似乎都无关紧要

【讨论】:

以上是关于强制旋转 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

记录一个移动端图片预览(支持旋转),使用css强制旋转的坑

如何强制旋转 UIViewController

android 屏幕旋转生命周期和setRequestedOrientation强制旋转

根据节点的旋转对节点应用强制

手机旋转时强制android像iphone一样调整文本大小

无法强制我的精灵顺利移动/旋转