Ios 使用转换委托时将显示触发器视图
我想展示一个视图控制器:Ios 使用转换委托时将显示触发器视图,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我想展示一个视图控制器: 模态 使用自定义转换 同时,我想确保当它被解除时,它后面的视图控制器意识到被推到前台 我的基本想法是尝试一些不同的配置,看看哪种配置会导致在后面的视图控制器上调用viewwillbeen 尝试1 presentedViewController.modalPresentationStyle = .Custom presentedViewController.transitioningDelegate = someTransitioningDelegate 这种方法的
- 模态
- 使用自定义转换
- 同时,我想确保当它被解除时,它后面的视图控制器意识到被推到前台
viewwillbeen
尝试1
presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate
这种方法的结果是:
- 自定义转换工作得非常好
当我调用视图将出现
presentedViewController时,是否未在
presentedViewController后面的视图控制器上被调用
viewwillbeen
,所以我这样做了:
尝试2
presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate
或
这种方法的结果是:
在解除view将出现
时,在presentedViewController
presentedViewController后面的视图控制器上被调用
- 显示视图控制器时,转换按预期进行
- 解除视图控制器时,过渡期间的背景为黑色,这是不需要的
.FullScreen
会导致presentedViewController
后面的视图控制器从显示层次结构中删除-这很好,因为这可能是触发视图将出现
调用的原因
尝试3次
presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
其结果是:
在视图将出现
后面的视图控制器上被调用presentedViewController
- 转换过程中的背景是位于所需的presentedViewController后面的视图控制器
- 没有自定义转换
我正在从事的项目的结构使得使用委派(这似乎是建议的答案)变得困难。使用
NSNotificationCenter
是另一种选择,它允许我调用应该由视图调用的代码,但在尝试3中,我希望有一种更优雅的方法来实现所有这些:
触发器视图将出现
使用自定义转换
请参见过渡动画期间在背景中显示的视图控制器
我在过去实现这一点的方法是从transition animator中调用ViewWillDisplay和ViewDidDisplay。下面是一个简化的示例:
public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
fromVC.viewWillDisappear(true)
toVC.viewWillAppear(true)
UIView.animateWithDuration(0.3, animations: {
//Animations here
}, completion: { (success) in
toVC.viewDidAppear(success)
fromVC.viewDidDisappear(success)
transitionContext.completeTransition(true)
})
}
在我制作动画之前,我会调用“will”方法,而完成之后的“did”方法似乎苹果认为调用viewwillbeen
等是一种不道德的行为,但是调用beginAppearanceTransition
和endAppearanceTransition
也没关系。我同意这个
public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
fromVC.viewWillDisappear(true)
toVC.viewWillAppear(true)
UIView.animateWithDuration(0.3, animations: {
//Animations here
}, completion: { (success) in
toVC.viewDidAppear(success)
fromVC.viewDidDisappear(success)
transitionContext.completeTransition(true)
})
}