【问题标题】:iOS 8 Rotation Methods Deprecation - Backwards CompatibilityiOS 8 旋转方法弃用 - 向后兼容性
【发布时间】:2014-10-04 00:09:30
【问题描述】:

在 iOS 8 中,界面旋转的方法是deprecated。这包括:

  • willRotateToInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:
  • willAnimateRotationToInterfaceOrientation:duration:

替换方法包括:

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

如果未实现新的旋转方法,并且项目是使用 iOS 8 SDK 编译的,则视图控制器 - 将不会接收调用 - 对已弃用的旋转方法的调用。

我担心的是:AppStore 中已经使用 iOS 7 SDK 构建的应用会发生什么情况?是否仍会在 iOS 8 设备上调用已弃用的轮换方法?

编辑:

仍会调用旋转方法,但在 iOS 8 中存在一些更改/问题/错误。

还有UIScreen is now interface oriented

【问题讨论】:

  • 他们会运作良好;它们是使用 iOS7 SDK 构建的,当时这些方法还没有被弃用。但是,如果您使用 iOS8 SDK 编译项目(当它出现时),您将需要关注这一点并更新您的项目 - 但旧应用程序无需进一步操作就可以正常工作。

标签: ios rotation ios8


【解决方案1】:

当应用在 iOS 8+ 设备上运行时,仍会调用您列出的已弃用的轮换方法。如果您支持 iOS 7,您可以继续使用它们而不会出现问题。如果您只支持 iOS 8+,最好使用未弃用的方法。

但是,请注意,如果您在同一个视图控制器中实现新的旋转方法和不推荐使用的方法,则在 iOS 7 上运行时将调用不推荐使用的方法,而在 iOS 8+ 上它只会调用新的方法已经替换了那些已弃用的。

例如,如果你只实现willRotateToInterfaceOrientation,则在iOS 7和8运行时会调用这个方法。如果你再添加viewWillTransitionToSize,iOS 7仍然会调用willRotateToInterfaceOrientation,但iOS 8不会,而是它只会调用viewWillTransitionToSize

【讨论】:

  • didRotateFromInterfaceOrientation 没有在 iOS 8 设备上被调用,尽管您有上面提到的所有设置。
  • @Leon didRotateFromInterfaceOrientation 在 iOS 8 12A365 上被调用,我刚刚用一个全新的 Swift 新项目进行了尝试。很简单:新建单视图项目,覆盖 ViewController 中的didRotateFromInterfaceOrientation 并添加NSLog("rotated")。在 iPhone 和 iPad 的 iOS 7 和 8 上完成轮换后记录。事实上,即使您不将部署目标更改为 iOS 7,它也会被调用。
  • 显然还有更多,我的 NSLog 没有显示。会不会是因为我的 didRotateFromInterfaceOrientation 方法属于一个类别而不是 ViewController?
  • @Leon 可能,我从未尝试过。来自 UIViewController 类参考:“如果发生方向更改时视图控制器不可见,则永远不会调用旋转方法。”
  • 我不确定它是如何适应的。这个方法肯定是在 iOS 7 设备上调用的,而不是 8 设备上。我在这个类别上还有其他问题,它只出现在 8 上,但没有弃用出现错误或任何东西。非常奇怪,感觉更像是一个错误。
【解决方案2】:

旋转方法仍然有效,存在其他问题:

【讨论】:

    【解决方案3】:

    我刚遇到这个问题,我想使用以前使用的相同方法(至少现在是这样),所以我就是这样做的。

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    {
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
        //The device has already rotated, that's why this method is being called.
        UIInterfaceOrientation toOrientation   = [[UIDevice currentDevice] orientation];
        //fixes orientation mismatch (between UIDeviceOrientation and UIInterfaceOrientation)
        if (toOrientation == UIInterfaceOrientationLandscapeRight) toOrientation = UIInterfaceOrientationLandscapeLeft;
        else if (toOrientation == UIInterfaceOrientationLandscapeLeft) toOrientation = UIInterfaceOrientationLandscapeRight;
    
        UIInterfaceOrientation fromOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    
        [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            [self willAnimateRotationToInterfaceOrientation:toOrientation duration:[context transitionDuration]];
        } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
            [self didRotateFromInterfaceOrientation:fromOrientation];
        }];
    
    }
    

    我仍然不确定是否应该在动画块之外使用它,因为我没有持续时间。

        [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
    

    【讨论】:

    • 需要注意的一点是 UIDeviceOrientation 与 UIInterfaceOrientation 不匹配,特别是 UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight 和 UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft 所以你不能像在 viewWillTransitionToSize:withTransitionController: 方法中那样混合和匹配它们/跨度>
    • 另外,你还需要在其中的某处调用 [super viewWillTransitionToSize:withTransitionController:]
    • 这是 UIInterfaceOrientation 的枚举 typedef NS_ENUM(NSInteger, UIInterfaceOrientation) { UIInterfaceOrientationUnknown = UIDeviceOrientationUnknown, UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft }; 所以你是对的,我需要左右颠倒
    • 很好的答案。讨厌 viewWillTransitionToSize。但是有一个问题:willAnimateRotationToInterfaceOrientation 在动画之前被调用(就像 willRotateToInterfaceOrientation 一样)——而不是像以前那样在动画期间调用。
    【解决方案4】:

    对我来说,在这里我们通过一些计算和一个 plist 文件来旋转“手动”,该文件跟踪标题的大小和类似的东西(所以如果我们想改变一些按钮等等,我们只改变这个 plist 而不是全部个人xibs)。我们所有的旋转代码都在 willLayoutSubviews 内,所以即使在新的 iOS8 上,所有的东西都是正确的......除了我我也确实看到对于新的 ios8 [[UIScreen mainScreen] bounds].size.width 现在根据设备方向返回宽度而不是设备实际尺寸。

    我会把这个发到其他帖子:

    - (BOOL) isIOS8OrAbove{
        float version802 = 1140.109985;
        float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
        NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
        if (NSFoundationVersionNumber >= version8){
            return true;
        }
        return false;
    }
    

    【讨论】:

      【解决方案5】:

      我会检查该特定案例以获得 100% 的信心,但我预计不会有任何麻烦。我还建议您从WWDC 2014 观看会议216 Building Adaptive Apps with UIKit 以获取更多信息。似乎未调用已折旧的方法,因此应更新应用以在运行 iOS 8 的设备上正常工作。

      【讨论】:

      • 实际上我尝试使用 iOS 8 SDK 运行应用程序。 调用了已弃用的方法。
      • 当应用程序在 iOS 8 设备上运行时,至少在正确设置部署目标的情况下,会调用上述轮换方法
      • @fabb 他们被称为,可能你设置不正确
      • 嗯,那我一定要搞清楚为什么我用iOS 8 SDK编译的时候,有些视图在旋转时没有调整大小。
      • 对于是否在 iOS 8 上调用已弃用的方法似乎有些混淆:对我来说,事实证明它们 在根视图控制器上调用的,但它们像在 iOS 7 上那样在子视图控制器上调用。HTH。
      【解决方案6】:

      在 iOS 8 SDK 中不推荐使用旋转方法。这对使用 iOS 7 SDK 构建的应用完全没有影响,即使在 iOS 8 和未来的几个 iOS 版本中运行也是如此。

      例如,UIButtonfont 属性自 iOS 3.0 以来已被弃用,但在 iOS 7.0 中仍然可用。

      【讨论】:

      • 你有苹果的参考资料吗?
      • @fabb 见here。 “弃用并不意味着立即从框架或库中删除接口。”和“不推荐使用的 API 可能会从操作系统的未来版本中删除”。这就是弃用的意思,它可能会从 future 版本的操作系统中删除。
      • 我想知道谁在没有给出理由的情况下否决了这个。答案是正确的。我们已经对其进行了测试。我们的一个应用程序支持 iOS 4.3 [一个企业应用程序],它可以在 iOS8 beta5 上完美旋转。如果应用是使用 iOS 8 SDK 构建的,轮换回调只会造成问题。
      • 不要使用 xcode 6 构建您的应用,否则轮换将失败。
      • ^ 上面的评论就是答案,如果你使用 Xcode 6 编译 7.1 或更低版本,你必须使用 Xcode 5 或更改已弃用的方法。
      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多