如何将viewWillTransition保存到一个视图控制器而不是全部?

时间:2017-05-29 07:34:27

标签: ios swift xcode override

以下是我如何覆盖我的视图控制器,但是,如果还有另一种更好的方法来做到这一点,那么我的第二个视图控制器不符合覆盖,请指导我,任何建议都会很好

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


    coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
            self.applyPortraitConstraint()
            break
        // Do something
        default:
            print("LandScape")
            // Do something else
            self.applyLandScapeConstraint()
            break
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
        print("rotation completed")
    })
    super.viewWillTransition(to: size, with: coordinator)
}

 func applyPortraitConstraint(){
    stackView.axis = .vertical
    stackView.distribution = .fill
}

 func applyLandScapeConstraint(){
    stackView.axis = .horizontal
    stackView.distribution = .fillEqually
}

3 个答案:

答案 0 :(得分:4)

虽然您已找到解决问题的方法,但我认为我提供了一种更简单的方法来处理它。另一个好处是,无论你的控制器中有什么视图,它都会变得不那么脆弱。

首先,部分基于Malik回答的评论中已经包含的信息的一些背景:正如Malik指出的那样," viewWillTransition"方法只会在包含它的视图控制器中执行。但是,由于您正在使用标签栏控制器,因此即使您在不同的选项卡上,与标签栏关联的每个控制器也都会保留。因此,即使用户在旋转设备时位于不同的选项卡控制器上," viewWillTransition"仍然会在具有该方法的控制器中调用该方法。那么,如果您希望该方法中的代码仅在用户当前位于该选项卡上时执行该怎么办?

以下是一个更简单的解决方案:如果您想要当前的代码" viewWillTransition"只有当用户在该控制器的选项卡上时才能调用,您可以在该代码之前添加一个guard语句,用于检查" tabBarController.selectedIndex"的当前值。 " selectedIndex" value告诉您当前选择和可见的选项卡控制器。

例如,假设" viewWillTransition"在索引为0的选项卡控制器中。您可以包含一个检查selectedIndex为0的guard语句,如果不是,则返回。如果用户当前不在选项卡0上,这将阻止方法中的其余代码被执行。如果用户位于选项卡上,索引为1并旋转设备,尽管" viewWillTransition& #34;仍然会在Controller 0中调用,guard语句将阻止其余的代码被执行。

以下是代码:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        guard tabBarController?.selectedIndex == 0 else { return }
        //Include the rest of your code here
}

希望这可以帮助你或其他人!

答案 1 :(得分:1)

根据我的理解,此代码仅适用于它所属的viewController。任何其他viewController都不会调用此方法。相反,他们将调用自己的方法。我不知道其他viewControllers如何能够使用这段代码。 除非你在所有的viewControllers中使用相同的代码,否则我建议你只在viewControllers中使用这个代码,你实际上想要遵循这种行为。

答案 2 :(得分:1)

更好的版本的守卫声明将是:

guard
    tabBarController?.selectedViewController === self
else {
    return
}

这样您就不会按照填充标签的顺序污染视图控制器实现。