首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动画化UIPresentationController中的呈现视图

动画化UIPresentationController中的呈现视图
EN

Stack Overflow用户
提问于 2014-11-10 19:29:25
回答 2查看 3.9K关注 0票数 1

在某些情况下,我建议阅读以下内容:

非常相关的问题:"From View Controller" disappears using UIViewControllerContextTransitioning非常相关的答案:https://stackoverflow.com/a/25901154/751268

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

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

如果您想要动画呈现视图控制器的视图,您应该考虑使用UIModalPresentationFullscreen样式,或者继续使用UIModalPresentationCustom,并实现您自己的UIPresentationController子类,而shouldRemovePresentersView返回是。

我这样做了,viewFromKey:不再返回nil了,但是现在呈现视图控制器完全消失了(考虑到我明确表示应该通过实现shouldRemovePresentersView),这是有意义的。

我将呈现视图控制器的视图添加到容器视图中,但它仍然会被删除。我还需要做些什么才能让这件事奏效吗?

以下是一些相关代码:

代码语言:javascript
复制
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还是会被删除.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-27 07:58:01

我正在添加另一个答案,因为我的答复太长,不适合在评论。

首先,viewForKey在iOS8中是可用的,所以除非您只针对iOS8 (为什么?)您不应该使用它,或者在检查UIViewControllerContextTransitioning对该选择器的响应并使用viewControllerForKey for iOS7之后使用它。

话虽如此,但在我看来,这似乎是一个错误,我向你解释了我自己:

如果您查看UIPresentationController头文件,您会发现它是这样的

代码语言:javascript
复制
// 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,则用于viewForKeyUITransitionContextFromViewControllerKey仍然为零。

我认为您应该为此填写一个bug报告,现在应该使用viewControllerForKey,这是可以使用的(这没有任何问题),因为它不建议使用,并且在这两个操作系统版本中都没有问题。

这很可能是因为viewForKey应该返回UITransitionContextFromViewControllerKey的视图,当 shouldRemovePresentersView被显式设置为NO而不是YES时。

我的2美分

票数 5
EN

Stack Overflow用户

发布于 2014-11-26 08:58:05

如果您想要的是shouldRemovePresentersView仍然可见,为什么要将fromView设置为YES

我和您有同样的问题,因为在我的自定义3d演示中,父视图控制器在转换完成后立即被移除。

解决方案是将modalPresentationStyle更改为UIModalPresentationOverCurrentContext,这将特别禁止系统在转换结束时删除所有者viewController。

在使用这种方法时,我的3D转换仍然受到动画问题的困扰。

我最后使用了一个UIModalPresentationCustom modalPresentationStyle,它解决了我几乎所有的问题,但新的视图控制器(它是一个UINavigationController)不会在调用状态栏出现时向下移动。

为了解决这个问题,在转换完成后,我最终将modalPresentationStyle更改为UIModalPresentationFullScreen

下面是我的代码,它显示了带有自定义表示的新viewController:

代码语言:javascript
复制
//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中。

代码语言:javascript
复制
    UIView* inView = [transitionContext containerView];

    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
.....
......

    [inView insertSubview:toViewController.view aboveSubview:fromViewController.view];

但在解雇演示文稿时,不要将视图添加到containerView中,因为它仍在显示(因为我们明确要求系统不要删除它),而只是在两个视图之间动画化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26851471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档