【问题标题】:iOS: How to run a function after Device has Rotated (Swift)iOS:设备旋转后如何运行函数(Swift)
【发布时间】:2020-08-18 23:03:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift rotation


    【解决方案1】:

    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:吗?
    • 是的,我的错。添加。谢谢!
    • 有没有办法在视图本身而不是控制器上调用类似的东西?
    • @ArielSD 视图应该相当“愚蠢”,只是因为某些东西(直接或间接)调用了 setNeedsLayout 而重新计算其子视图布局。如果您需要在方向更改时更新布局以外的其他操作,请随时保留对视图的引用并直接调用您想要的任何方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多