在某些情况下,我建议阅读以下内容:
非常相关的问题:"From View Controller" disappears using UIViewControllerContextTransitioning非常相关的答案:https://stackoverflow.com/a/25901154/751268
我正在尝试实现一个自定义视图控制器转换,使新的视图控制器能够覆盖一半屏幕,同时将呈现视图控制器缩小到90% (以窗口为中心,在呈现视图控制器下面)。
首先,我的问题是viewFromKey:返回了nil。为了解决这个问题,答案提到:
如果您想要动画呈现视图控制器的视图,您应该考虑使用
UIModalPresentationFullscreen样式,或者继续使用UIModalPresentationCustom,并实现您自己的UIPresentationController子类,而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还是会被删除.
发布于 2014-11-27 07:58:01
我正在添加另一个答案,因为我的答复太长,不适合在评论。
首先,viewForKey在iOS8中是可用的,所以除非您只针对iOS8 (为什么?)您不应该使用它,或者在检查UIViewControllerContextTransitioning对该选择器的响应并使用viewControllerForKey for 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;因此,正如您所看到的,缺省值是“是”,因此,只有当您特别想说“不”时,才会出现这种情况。但是,您是正确的,如果没有显式地将此设置为YES,则用于viewForKey的UITransitionContextFromViewControllerKey仍然为零。
我认为您应该为此填写一个bug报告,现在应该使用viewControllerForKey,这是可以使用的(这没有任何问题),因为它不建议使用,并且在这两个操作系统版本中都没有问题。
这很可能是因为viewForKey应该返回UITransitionContextFromViewControllerKey的视图,当 shouldRemovePresentersView被显式设置为NO而不是YES时。
我的2美分
发布于 2014-11-26 08:58:05
如果您想要的是shouldRemovePresentersView仍然可见,为什么要将fromView设置为YES?
我和您有同样的问题,因为在我的自定义3d演示中,父视图控制器在转换完成后立即被移除。
解决方案是将modalPresentationStyle更改为UIModalPresentationOverCurrentContext,这将特别禁止系统在转换结束时删除所有者viewController。
在使用这种方法时,我的3D转换仍然受到动画问题的困扰。
我最后使用了一个UIModalPresentationCustom modalPresentationStyle,它解决了我几乎所有的问题,但新的视图控制器(它是一个UINavigationController)不会在调用状态栏出现时向下移动。
为了解决这个问题,在转换完成后,我最终将modalPresentationStyle更改为UIModalPresentationFullScreen 。
下面是我的代码,它显示了带有自定义表示的新viewController:
//show Login Screen
LoginViewController *viewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
UINavigationController *loginNavController = [[UINavigationController alloc] initWithRootViewController:viewController];
loginNavController.interactivePopGestureRecognizer.enabled = YES;
loginNavController.transitioningDelegate = self.customTransitionDelegate;
loginNavController.modalPresentationStyle = UIModalPresentationCustom;
[navigationController presentViewController:loginNavController animated:YES
completion:^{
//important, else status bar is not moving entire screen down....
loginNavController.modalPresentationStyle = UIModalPresentationFullScreen;
}
];同样非常重要的是,在运行解雇动画containerView 时,不能将旧视图添加到中。
因此,如果动画是演示,则将toView添加到containerView中。
UIView* inView = [transitionContext containerView];
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
.....
......
[inView insertSubview:toViewController.view aboveSubview:fromViewController.view];但在解雇演示文稿时,不要将视图添加到containerView中,因为它仍在显示(因为我们明确要求系统不要删除它),而只是在两个视图之间动画化。
https://stackoverflow.com/questions/26851471
复制相似问题