在UIPresentationController中动画呈现视图

Sco*_*ets 1 animation uiviewcontroller ios

对于某些情况,我建议阅读:

非常相关的问题:"来自View Controller"使用UIViewControllerContextTransitioning消失 非常相关的答案:https://stackoverflow.com/a/25901154/751268


我正在尝试实现一个自定义视图控制器转换,动画新视图控制器覆盖屏幕的一半,同时将呈现视图控制器缩小到90%(在窗口中心,在呈现的视图控制器下面).

首先,我的问题是viewFromKey:返回nil.要解决这个问题,答案提到:

如果要为呈现视图控制器的视图设置动画,则应考虑使用UIModalPresentationFullscreen样式或继续使用UIModalPresentationCustom并实现自己的子类,UIPresentationControllershouldRemovePresentersView返回YES.

我做到了,并且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
Run Code Online (Sandbox Code Playgroud)

我认为,通过返回YESshouldRemovePresentersView手动将它添加到containerView,应该解决这个问题,但backView无论如何获取删除...

Lef*_*ris 5

我正在添加另一个答案,因为我的回答太长而无法发表评论.

首先viewForKey在iOS8中可用,所以除非你只针对iOS8(为什么?),否则你不应该使用它,或者在检查UIViewControllerContextTransitioning响应那个选择器并使用viewControllerForKeyfor iOS7 之后使用它.

话虽如此,在我看来,这是一个错误,我解释自己:

如果你查看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;
Run Code Online (Sandbox Code Playgroud)

因此,当您看到默认值为YES时,所以只有当您特别想要拒绝时才应该覆盖它.但是,你是对的,如果没有明确地设置为YES,viewForKey那么UITransitionContextFromViewControllerKey遗体为零.

我认为你应该为此填写错误报告,现在使用viewControllerForKey哪个可以使用(没有错),因为它没有被弃用,并且在两个操作系统版本中都没有问题.

这是最有可能是错误的原因是,viewForKey应该返回了一个视图UITransitionContextFromViewControllerKey 时,shouldRemovePresentersView明确设置为NO,而不是YES.

我的2美分