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
为 NSManagedObject 子类的属性构建灵活的编辑表单