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
的层次结构,这样你就可以拦截它并执行你的自定义代码,然后再说它上升到另一个可能像拆分视图一样实现它的父级。
我有一个 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
的层次结构,这样你就可以拦截它并执行你的自定义代码,然后再说它上升到另一个可能像拆分视图一样实现它的父级。