UIStoryboardSegue 在子类中为 属性 设置动画

UIStoryboardSegue animates property in subclass

我有一个 UIStoryboardSegue 子类用于用下一个视图控制器替换当前视图控制器。

由于我们在界面编辑器中有一个Animates 属性,我想在子类中访问这个属性。

我的代码如下:

class ReplaceSegue: UIStoryboardSegue {

    override func perform() {
        var viewControllers = source.navigationController?.viewControllers.dropLast() ?? []
        viewControllers.append(destination)
        source.navigationController?.setViewControllers(viewControllers.map {[=11=]}, animated: true) // I dont want this `true` to be hardcoded
    }
}

根据 UIStoryBoardSegue class

中的评论

The segue runtime will call +[UIView setAnimationsAreEnabled:] prior to invoking this method, based on the value of the Animates checkbox in the Properties Inspector for the segue.

很明显,您可以使用

读取动画复选框的值
UIView.areAnimationsEnabled

所以在我的自定义转场中

class MySegue: UIStoryboardSegue {
    override func perform() {
        debugPrint(UIView.areAnimationsEnabled)
    }
}

如果动画复选框是 unchecked,则打印 false;如果是 checked,则打印 true :)

所以在你的情况下

class ReplaceSegue: UIStoryboardSegue {
    override func perform() {
            var viewControllers = source.navigationController?.viewControllers.dropLast() ?? []
            viewControllers.append(destination)
            source.navigationController?.setViewControllers(viewControllers.map {[=12=]}, animated: UIView.areAnimationsEnabled)
    }
}

我希望发生的事情已经很清楚了,如果你仍然有疑问,这里是解释,iOS 检查动画复选框的值并使用它来设置是否启用动画通过调用 setAnimationsAreEnabled 在调用 perform() 方法之前使用界面中动画复选框的值。

因此,当控件到达执行内部时,您可以放心,iOS 已经读取动画复选框的值并使用它来设置 setAnimationsAreEnabled 您现在要做的就是询问areAnimationsEnabled 获取动画复选框的值。

所以这应该为您提供动画复选框的价值:)

希望对您有所帮助:)

你不应该为此需要 UIStoryboardSegue 子类。 The docs 状态 "You can subclass UIStoryboardSegue in situations where you want to provide a custom transition between view controllers"。这意味着没有任何动画的替换不是自定义转换,因此不应使用 segue 子类。

进行替换的正确方法是使用 Show Detail(例如替换)segue 并在管理子视图控制器的父视图控制器内实现方法 showDetailViewController 并替换子项,例如

@implementation DetailNavigationController

- (void)showDetailViewController:(UIViewController *)vc sender:(id)sender{
    [self setViewControllers:@[vc] animated:NO];
}

如果你不知道,Show Detail segue(在神奇地实例化目标视图控制器之后)有一个 perform 方法,它只调用 showDetailViewController 自身,并且基础 UIViewController 实现搜索在视图控制器层次结构中寻找一个覆盖 showDetailViewController 的层次结构,这样你就可以拦截它并执行你的自定义代码,然后再说它上升到另一个可能像拆分视图一样实现它的父级。