iOS:设备旋转后如何运行功能(快速)


70

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

以前,我会运行一个函数来更新它们在didRotateFromInterfaceOrientation中的位置,但是我看到现在iOS8中已弃用此功能。

我看过viewWillTransitionToSize,但结果很奇怪,而且似乎没有viewDidtransitionToSize函数。

设备旋转后,是否有一种简便的方法(在Swift中)运行函数?

Answers:


170

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

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

不应该super.viewWillTransitionToSize:先打电话吗?
Behdad

是的,我不好。添加。谢谢!
阿西2016年

有没有一种方法可以在视图本身上调用这样的内容,而不是它的控制器?
ArielSD '17

1
@ArielSD视图应该相当“笨”,仅重新计算其子视图布局,因为(直接或间接)调用了setNeedsLayout。如果您需要进行其他操作,而不是在方向更改时更新布局,请随时保留对视图的引用并直接调用您想使用的任何方法。
Acey

28

上面的答案https://stackoverflow.com/a/26944087/6583492绝对正确,这要归功于Acey和Moonwalkr。但是对于迅速的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
    }
}

1
太好了,您需要删除;; 在5号线
鲁本

这应该是他的回答中的评论/编辑,而不是帖子
Leo Dabus

18

虽然这里没有要求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");
    }  
}];
}
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.