iOS:如何在设备旋转后运行功能(Swift)

Ric*_*ard 60 rotation ios swift

我有一个不使用自动布局的UIView,并且根据主视图中X和Y坐标的百分比显示一些组件.

以前我会运行一个函数来更新他们在didRotateFromInterfaceOrientation中的位置,但是我发现这在iOS8中已被弃用了.

我看了一下viewWillTransitionToSize,但它给出了奇怪的结果,并且似乎没有viewDidtransitionToSize函数.

有没有一种简单的方法(在Swift中)在设备旋转后运行一个函数?

Ace*_*cey 151

该viewWillTransitionToSize委托方法被调用了UIViewControllerTransitionCoordinator符合对象.协议声明的方法是animateAlongsideTransition(_:animation, completion:).您可以使用它在转换完成后执行代码.

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    coordinator.animateAlongsideTransition(nil, completion: {
        _ in

        // Your code here
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 我明白为什么他们叫你Ace!谢谢兄弟,效果很好. (3认同)

dax*_*axh 26

以上回答/sf/answers/1886086121/是完全正确的,感谢Acey和Moonwalkr.但对于swift 3.0,它将如下所示

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil) { _ in
        // Your code here
    }
}
Run Code Online (Sandbox Code Playgroud)


Oli*_*nge 14

虽然这里没有要求Objective C版本:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {

    // change any properties on your views

} completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if( UIDeviceOrientationIsPortrait(orientation) ) {
        NSLog(@"portrait");
    } else {
        NSLog(@"landscape");
    }  
}];
}
Run Code Online (Sandbox Code Playgroud)