对于某些情况,我建议阅读以下内容:
非常相关的问题:"From View Controller" disappears using UIViewControllerContextTransitioning
非常相关的答案:https://stackoverflow.com/a/25901154/751268
我正在尝试实现一个自定义视图控制器过渡,该过渡使新的视图控制器具有动画效果以覆盖一半的屏幕,同时将当前的视图控制器缩小到90%(位于窗口中居中,位于所显示的视图控制器下方)。
首先,我的问题是viewFromKey:
返回了nil
。为了解决这个问题,答案提到了:
如果要为呈现的视图控制器的视图设置动画,则应考虑使用UIModalPresentationFullscreen
样式或继续使用UIModalPresentationCustom
并通过UIPresentationController
返回YES来实现自己的shouldRemovePresentersView
子类。
我这样做了,viewFromKey:
不再返回nil
了,但是现在呈现的视图控制器完全消失了(考虑到我明确地说应该通过实现shouldRemovePresentersView
来实现,这是有道理的)。
我将呈现视图控制器的视图添加到容器视图,但是仍然被删除。为了使它正常工作,我还有什么要做的吗?
这是一些相关的代码:
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
BOOL show = self.isPresentation;
UIView *menuView = show ? toView : fromView;
UIView *backView = show ? fromView : toView;
UIView *containerView = [transitionContext containerView];
[containerView addSubview:backView];
[containerView addSubview:dimmedView];
[containerView addSubview:menuView];
// Adjust transforms, alpha and perform animations
我以为通过从
YES
返回shouldRemovePresentersView
并将其手动添加到containerView
,应该可以解决此问题,但是无论如何backView
都会被删除... 最佳答案
我要添加另一个答案,因为我的回复太长而无法在评论中显示。
首先viewForKey
在iOS8中可用,因此除非您仅针对iOS8(为什么?),否则不应该使用它,或者在检查UIViewControllerContextTransitioning
响应该选择器并为iOS7使用viewControllerForKey
后再使用它。
话虽如此,在我看来这是一个错误,我解释了自己:
如果查看UIPresentationController
头文件,您会看到它说
// Indicate whether the view controller's view we are transitioning from will be removed from the window in the end of the
// presentation transition
// (Default: YES)
- (BOOL)shouldRemovePresentersView;
因此,如您所见,默认值为YES,因此仅当您特别想说NO时,才应覆盖它。
但是,您是对的,没有将其显式设置为YES,则
viewForKey
的UITransitionContextFromViewControllerKey
仍然为nil。我认为您应该为此填写一个错误报告,现在使用
viewControllerForKey
可以很好地使用(这没什么问题),因为它不被弃用,并且可以在两个OS版本中正常工作。而且这很可能是一个错误的原因是,当的
viewForKey
显式设置为否而不是是时,UITransitionContextFromViewControllerKey
应该返回shouldRemovePresentersView
的视图。我的2美分
关于ios - 在UIPresentationController中对呈现 View 进行动画处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26851471/