10

我有一个使用UIModalPresentationCustom演示样式呈现的视图控制器。我使用自定义UIViewControllerTransitioningDelegate将视图控制器呈现为侧边栏(因此它从屏幕边缘滑入并且不占据整个屏幕)。

UIModalPresentationFullScreen但是,当我使用- 然后关闭全屏视图控制器时,当我从这个视图控制器呈现另一个视图控制器时,我的底层自定义呈现控制器突然调整大小以占据全屏。有谁知道为什么会这样?

编辑:这本质上是我animateTransition展示侧边栏的方法——我已经删除了大部分代码以使其可读。基本上,它从transitionContext 获取容器,将目标视图控制器的视图添加到容器中并为其设置动画。

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIView *container = transitionContext.containerView;

    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *fromView = fromVC.view;
    UIView *toView = toVC.view;

    if( toVC.isBeingPresented )
    {
        [container addSubview:toView];

        //... Animate some new frame for toView            

        //Call [transitionContext completeTransition:YES] on animation completion
    }
    else
    {
        //... Animate fromView out

        //On completion remove fromView from superview

        //Call [transitionContext completeTransition:YES] on animation completion
    }
}

编辑2:做更多的研究,我注意到当模式堆栈中它上面的视图控制器被解除时,我的自定义呈现视图控制器的视图的框架正在设置。以下堆栈跟踪导致框架被设置为全屏:

0 -[MyCustomPresentedViewControllerView setFrame:]
1 -[UIView(MPAdditions) setFrameOrigin:]
2 -[UIViewControllerAccessibility(SafeCategory) dismissViewControllerWithTransition:completion:]
3 -[UIViewController dismissViewControllerAnimated:completion:]
4

3 回答 3

7

通过分配改变演示风格:

viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

导致模态呈现控制器占据屏幕的一小部分,与UIPresentationController.

但是,
viewController.modalPresentationStyle = UIModalPresentationOverFullScreen
在这种情况下使用更好,因为他的模态控制器是全屏的。

于 2015-12-29T04:27:41.830 回答
3

我遇到了同样的问题。我已经尝试使用符号断点对其进行调试,并且似乎对某种布局管理器进行了一些内部调用。

虽然我无法“解决”这个问题(在我看来,这就像 SDK 中的一个错误),但我能够想出一个解决方法来解决这个问题。基本上,您必须在两个合适的时间设置呈现视图的正确尺寸。像这样:

在使用自定义 UIPresentationController 呈现的视图控制器中,添加以下内容:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.view.frame = [self.presentationController frameOfPresentedViewInContainerView];
    });
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.frame = [self.presentationController frameOfPresentedViewInContainerView];
}

如果您想知道:是的,您确实需要在两个地方这样做。因为奇怪的是,当我仅在 viewDidAppear 异步块中执行此操作时,一旦动画完成,它就会损坏(调整为全屏)。

于 2015-11-19T23:46:53.527 回答
2

尝试使用:

viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

它在 iOS 8.1 中帮助了我

于 2014-11-20T20:59:32.293 回答