如何避免 animateTransition(transitionContext) 协议方法(在 navigationController 推送方法中)删除以前的 ViewController 视图?
How to avoid animateTransition(transitionContext) protocol method(in navigationController push methods) from removing previous ViewController's view?
我必须推一个 viewController,它有一个 alpha 为 0.5 的调光视图。因此,ViewController 的视图必须在这个变暗的背景后面显示前一个控制器的视图。问题是我使用的导航控制器使用 UIViewControllerAnimatedTransitioning 协议来自定义动画。默认情况下,在将新的 viewController 推入堆栈后,navigationController 会自动删除之前的视图。那么,如何在完成这个过渡后保持之前的视图,这可能吗?
注意:我不想只将控制器的视图添加到导航控制器(这给了我导航功能中的奇怪行为),我确实需要以这种方式推送它,所以我可以继续使用应用程序代码模式。
代码:
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
if isPresenting {
let ContainerView = transitionContext.containerView()
if let PresentedController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) {
if let PresentedView = transitionContext.viewForKey(UITransitionContextToViewKey) {
PresentedView.alpha = 0
PresentedView.frame = transitionContext.finalFrameForViewController(PresentedController)
ContainerView.addSubview(PresentedView)
// i've also tried to add the fromView in the containerView.
UIView.animateWithDuration(0.4, animations: {
PresentedView.alpha = 1
}) {
Completion in
transitionContext.completeTransition(Completion)
}
}
}
} else {
// dismiss code...
}
}
感谢您的耐心等待。
几周前我也遇到过类似的情况。就我而言,我正在模态地展示我的视图控制器。我解决这个问题的方法是拍摄 fromViewController 视图的快照并将其用作 toViewController 视图的背景。
捕捉快照:
UIImage *snapshotImage = nil;
UIGraphicsBeginImageContextWithOptions(self.tabBarController.view.frame.size, NO, 0.0);
if ([self.tabBarController.view drawViewHierarchyInRect:self.tabBarController.view.bounds afterScreenUpdates:YES]) {
snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
您可以为此捕获 transitionContext.containerView。将此图片传递给您的新 VC 并将其设置为 VC 视图的背景:
self.view.backgroundColor = [UIColor colorWithPatternImage:self.bgImage];
P.S。我不精通 Swift,因此您必须自己将代码转换为 swift,但希望这能为您提供一个不错的起点
我必须推一个 viewController,它有一个 alpha 为 0.5 的调光视图。因此,ViewController 的视图必须在这个变暗的背景后面显示前一个控制器的视图。问题是我使用的导航控制器使用 UIViewControllerAnimatedTransitioning 协议来自定义动画。默认情况下,在将新的 viewController 推入堆栈后,navigationController 会自动删除之前的视图。那么,如何在完成这个过渡后保持之前的视图,这可能吗?
注意:我不想只将控制器的视图添加到导航控制器(这给了我导航功能中的奇怪行为),我确实需要以这种方式推送它,所以我可以继续使用应用程序代码模式。
代码:
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
if isPresenting {
let ContainerView = transitionContext.containerView()
if let PresentedController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) {
if let PresentedView = transitionContext.viewForKey(UITransitionContextToViewKey) {
PresentedView.alpha = 0
PresentedView.frame = transitionContext.finalFrameForViewController(PresentedController)
ContainerView.addSubview(PresentedView)
// i've also tried to add the fromView in the containerView.
UIView.animateWithDuration(0.4, animations: {
PresentedView.alpha = 1
}) {
Completion in
transitionContext.completeTransition(Completion)
}
}
}
} else {
// dismiss code...
}
}
感谢您的耐心等待。
几周前我也遇到过类似的情况。就我而言,我正在模态地展示我的视图控制器。我解决这个问题的方法是拍摄 fromViewController 视图的快照并将其用作 toViewController 视图的背景。
捕捉快照:
UIImage *snapshotImage = nil;
UIGraphicsBeginImageContextWithOptions(self.tabBarController.view.frame.size, NO, 0.0);
if ([self.tabBarController.view drawViewHierarchyInRect:self.tabBarController.view.bounds afterScreenUpdates:YES]) {
snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
您可以为此捕获 transitionContext.containerView。将此图片传递给您的新 VC 并将其设置为 VC 视图的背景:
self.view.backgroundColor = [UIColor colorWithPatternImage:self.bgImage];
P.S。我不精通 Swift,因此您必须自己将代码转换为 swift,但希望这能为您提供一个不错的起点