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

Posted

技术标签:

【中文标题】UIStoryboardSegue 为子类中的属性设置动画【英文标题】:UIStoryboardSegue animates property in subclass 【发布时间】:2019-03-27 09:53:29 【问题描述】:

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

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

我的代码如下:

class ReplaceSegue: UIStoryboardSegue 

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

【问题讨论】:

检查下面发布的答案让我知道它是否有帮助:) @SandeepBhandari 它正在工作,谢谢。 :) 很高兴它做到了 :) 编码愉快 【参考方案1】:

根据 UIStoryBoardSegue 类中的 cmets

segue 运行时会先调用 +[UIView setAnimationsAreEnabled:] 调用此方法,基于动画复选框的值 在 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 $0, animated: UIView.areAnimationsEnabled)
    

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

所以当控件到达 perform 内部时,你可以确定 iOS 已经读取了 animates 复选框的值并用它来设置setAnimationsAreEnabled,你现在要做的就是让areAnimationsEnabled 获取值动画复选框。

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

希望对你有帮助:)

【讨论】:

【参考方案2】:

您不应该为此需要 UIStoryboardSegue 子类。 The docs 状态“在您想要在视图控制器之间提供自定义转换的情况下,您可以继承 UIStoryboardSegue”。这意味着没有任何动画的替换不是自定义过渡,因此不应使用 segue 子类。

进行替换的正确方法是使用显示详细信息(例如替换)segue,并在管理子视图控制器的父视图控制器内部实现方法showDetailViewController 并替换子视图,例如

@implementation DetailNavigationController

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

如果你不知道,Show Detail segue(在神奇地实例化目标视图控制器之后)有一个 perform 方法,它只在 self 上调用 showDetailViewController,而基本的 UIViewController 实现搜索视图控制器层次结构查找对于覆盖showDetailViewController 的代码,因此您可以拦截它并执行您的自定义代码,然后再将其提交给另一个可能会像拆分视图一样实现它的父代码。

【讨论】:

以上是关于UIStoryboardSegue 为子类中的属性设置动画的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义动画删除自定义 UIStoryboardSegue

UIStoryboardSegue 嵌入

为 NSManagedObject 子类的属性构建灵活的编辑表单

UIStoryboardSegue:动画期间不显示视图

UIStoryBoardSegue 方法的 iOS Swift 问题

c#如何在父类(或是接口)当中定义一个子类必须要重写的字段(属性)?