不建议使用旋转方法,是否等同于'didRotateFromInterfaceOrientation'?


137

我正在尝试实现viewWillTransitionToSizeiOS 8中引入的新方法(不推荐使用其他所有旋转方法)。我想知道现在相当于什么,didRotateFromInterfaceOrientation因为我们需要执行许多清理任务,而且我看不到可以分配给您的块UIViewControllerTransitionCoordinator以便在“过渡”到新的块时被调用大小完成。谢谢。

Answers:


255

好的,找到它了,只需要对animateAlongsideTransition:completion:passed 使用方法UIViewControllerTransitionCoordinator

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

每当我们像didRotateFromInterfaceOrientation?一样旋转时,此方法会调用吗?您能告诉我您使用的方法吗?谢谢
ask123 2014年

2
是的,它会的。我就是这样做的: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
2014年

1
谢谢-我将添加一个快速版本作为答案来节省人们一些时间
DogCoffee 2015年

3
在iOS 9中不推荐使用statusbarorientation。该选项还有什么?
Deepak Sharma

1
@DeepakSharma我参加聚会有点晚了,但是您可以使用[UIDevice currentDevice].orientation。您也可以将其通过管道传输到UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)。希望这可以帮助!
杰夫

70

Swift版本的答案很奇怪

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

这很奇怪,因为我将其放在了ViewController中,但print日志中没有任何内容。我猜是因为没有调用此方法。您能想到要使其正常工作还需要插入的其他任何东西吗?
2016年

我只是将其添加到一个空项目(通用应用程序)中,并且无需添加任何内容即可正常运行。也许在方法的最开始放置一条log语句,看看它是否被调用。我想不到您需要添加的任何内容。您正在运行哪个iOS?
DogCoffee

@DogCoffee ..它没有被调用。与模拟器有关系吗?
萨蒂

@Saty也可以在模拟器中使用-然后再次检查即可。可以正常工作。
DogCoffee

1
在iOS 9中不推荐使用statusbarorientation。该选项还有什么?
Deepak Sharma

10

iOS 10.3和Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

为什么需要动画?您不能立即检查“ newCollection”吗?
氰化物

@cyanide将与我的动画同步
Mike Glukhov

7

Swift 3中公认的答案:

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

对我来说很好


在iOS 10上不适用于我-它会打印旧的方向,而不是新的方向。
Vaddadi Kartick

1
@VaddadiKartick,因为您应该使用let orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

既然问题是:什么等于 didRotateFromInterfaceOrientation

我以为我会提供以下代码:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

我正在模拟器中的iPhone上进行测试,但是如果我使用iPad进行测试,则不会运行我的打印语句,因为traitsCollection不会更改。

这很奇怪,因为这正是Apple的建议

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

第二个代码段中缺少一个括号
Anton Duzenko,2016年

这在垂直和水平课程在全屏上都是常规课程的iPad上是否有效?
Deepak Sharma

您的代码与Apple的代码不同,您仅测试垂直大小类。
ADG

已经有一段时间了,看起来链接的内容已更改。
纽约市技术工程师,

3

[[UIApplication sharedApplication] statusBarOrientation]在iOS9中已弃用,您必须针对各种设备针对UITraitCollection进行测试。

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
不推荐使用二传手。一位苹果公司员工写道:“不赞成读取状态栏方向,而只是写方向。如果您在吸气剂上看到此标题,可能是我们构造标题的方式错误。” (forums.developer.apple.com/thread/12937
格雷厄姆心动

吸气剂是否也不被弃用。根据文档
Groot

0

在Ipad上,特征集没有变化,因此这是从开始到结束检测旋转的方法。这是Swift 5语法:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.