【问题标题】:UIStoryboardSegue animates property in subclassUIStoryboardSegue 为子类中的属性设置动画
【发布时间】: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 它正在工作,谢谢。 :)
  • 很高兴它做到了 :) 编码愉快

标签: ios iphone swift storyboard


【解决方案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 的代码,因此您可以拦截它并执行您的自定义代码,然后再将其提交给另一个可能会像拆分视图一样实现它的父代码。

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2012-05-01
      • 1970-01-01
      • 2011-12-10
      • 2011-03-18
      相关资源
      最近更新 更多