【问题标题】:Need a way to force a UIInterfaceOrientation rotation without iOS device rotating需要一种方法来强制 UIInterfaceOrientation 旋转而不旋转 iOS 设备
【发布时间】:2023-10-09 21:25:01
【问题描述】:

我需要知道是否有办法告诉 iOS7 设备在不旋转设备的情况下设置视图方向。代码中的某种方式触发设备调用代码,告诉它以哪种方式显示视图。

如果设备处于横向并在发生某些更改时保持横向,我想强制更改以纵向显示视图,此时用户需要转动设备才能正确查看.我会在下面解释原因

查看我的应用程序可能会使我的描述更清晰 - it is free to download

我有许多视图控制器(嵌入在 navigationControllers 中),只有其中一个需要旋转到横向,然后仅在特定条件下。

* 上的解决方案似乎是在 UINavigationController 上创建一个类别,为其提供 shouldAutorotate 和 supportedInterfaceOrientations 方法,然后在各个 viewControllers 中使用这些方法来阻止或允许旋转。

这对我有用....但是

在我希望旋转的一个视图控制器上,我不希望它一直旋转。

这个视图控制器是diveSiteDetailsController,(如果你已经下载了应用程序,你需要在第一页选择潜水地点然后点击'+'来查看它)。它有一个 UISegmentedController 和 4 个子视图(3 个表视图和 1 个其他 UIView)。 App Store 上的当前版本工作正常,现在我已经解决了这个问题 - 但查看它可能会帮助您更好地理解我的问题)。

在diveSiteDetailViewController 上,UISegmentedController 用于在4 个子视图之间切换。

所有子视图都用于输入有关同一潜水地点的数据,但由于有很多潜在数据,我将其分解为逻辑卡盘,每个卡盘都是一个子视图 - 位置、数据(深度、水流、能见度) ,环境类型和注释。

每个子视图的 .hidden 属性用于使它们出现和消失。

我只希望第二个子视图旋转(数据视图 - 它上面有一些滑块,如果在横向上更容易使用)。

限制这种旋转很容易 - 我是这样实现的

- (NSUInteger)supportedInterfaceOrientations{
if (self.dsDataRangeSlidingTV.hidden) {
return UIInterfaceOrientationMaskPortrait;
}
return UIInterfaceOrientationMaskAllButUpsideDown;
}

现在视图只会在显示数据表视图时旋转为横向。

但是,一旦在横向中,如果我使用 UISegmentedController 选择了不同的子视图,那么它们显然也会以横向显示,因为 iOS 设备还没有进行旋转。这是我试图避免的情况。

旋转 iOS 设备将按预期将这些视图返回到纵向,但是当我使用 UISegmentedController 从数据子视图切换到另一个子视图时,我需要触发设备以重新评估其显示,并且它触发了我没有知道该怎么做。

任何建议都非常受欢迎。

【问题讨论】:

    标签: ios7 uiinterfaceorientation


    【解决方案1】:

    这是一个对我有用的解决方法

    我在响应被点击的 UISegmentedControl 的方法末尾添加了以下几行。

    UIViewController *aDummyController = [[UIViewController alloc]init];
    [self presentViewController:aDummyController animated:NO completion:nil];
    [self dismissViewControllerAnimated:NO completion:nil];
    

    添加一个新的 viewController 并将其弹出会触发旋转。这是实现我想要的一种笨拙的方式。

    我在这篇文章中找到了解决方案

    Is there a documented way to set the iPhone orientation?

    感谢 Josh,虽然没有被接受,但目前有 99 人投了赞成票。

    我仍然有一个错误,如果我将设备保持在横向(尽管显示是纵向视图),而在屏幕上进入潜水站点详细信息控制器,那么潜水站点详细信息控制器显示的初始视图将是横向的。

    为了解决这个问题,我在 diveSiteDetailsController 上创建了一个名为 notThisTime 的 Bool 属性,并在调用它的 viewController 上的 prepareFor Segue 中将其设置为 true。

    然后我确实将supportedInterfaceOrientation更改为

    - (NSUInteger)supportedInterfaceOrientations
    
    {//   DLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    
    if (self.notThisTime){
        return UIInterfaceOrientationMaskPortrait;
    }
    if (!self.dsDataRangeSlidingTV.hidden) {
    
    return UIInterfaceOrientationMaskAllButUpsideDown;
    

    }

    然后在我添加的 ViewDidLoad 方法的末尾

    self.notThisTime = NO; 
    

    我仍然希望听到任何人提出如何更好地处理此问题的建议。推送和弹出一个虚拟视图以让 iPhone 进行方向检查似乎是一种解决方法,它应该只是作为标准方法调用可用。

    最后一点 - iOS 模拟器不喜欢这样 - 你需要在设备上检查 - 它有时会尝试在垂直绘制屏幕时以横向绘制 iPhone 容器 - 但它在 iPhone 上确实可以正常工作

    【讨论】: