我之前曾问过一个有关从横向过渡到纵向的布局问题的问题。我在这里问,但没有回应。分析问题之后,我认为我的问题是我在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方法。
答案 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()
}
}