Swift中的过渡更改后移动事物

时间:2019-01-21 04:14:38

标签: ios swift uiview

我之前曾问过一个有关从横向过渡到纵向的布局问题的问题。我在这里问,但没有回应。分析问题之后,我认为我的问题是我在viewWillTransition上调用了重新定位方法:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    resetPositions()
}

func resetPositions() {
    if isMainContainer {
        if UIApplication.shared.statusBarOrientation.isLandscape {
            containerViewBot.center.y = containedView.center.y
            containerViewBotBack.center.y = containedView.center.y - offset
        } else {
            containerViewBot.center.x = self.view.center.x
            containerViewBotBack.center.x = self.view.center.x - offset
        }
    } else {
        if UIApplication.shared.statusBarOrientation.isLandscape {
            containerViewBotBack.center.y = containedView.center.y
            containerViewBot.center.y = containedView.center.y + offset
        } else {
            containerViewBotBack.center.x = self.view.center.x
            containerViewBot.center.x = self.view.center.x + offset
        }
    }
}  

我想知道如何在过渡后调用此方法,例如 viewDidFinishTransition或在将窗口重新排列为新模式(横向/纵向)后如何调用resetPosition方法。

2 个答案:

答案 0 :(得分:2)

将您的resetPositions()放入协调器的动画方法的完成块中。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        coordinator.animate(alongsideTransition: nil) { (context) in
            resetPositions()
        }
    }

答案 1 :(得分:1)

使用coordinator参数。类型为UIViewControllerTransitionCoordinator,它提供您可以进行的调用,该调用将在转换完成后(或根据需要与转换一起进行)完成。

还请阅读viewWillTransition文档中的内容:

  

如果在自定义视图控制器中重写此方法,请始终在实现的某个时刻调用super,以便UIKit可以正确转发大小更改消息。

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

    coordinator.notifyWhenInteractionChanges { (context) in
        // Called after the transition
        resetPositions()
    }
}