解除模态显示的视图控制器时帧不正确

car*_*yot 18 objective-c uiviewcontroller ios presentviewcontroller uipresentationcontroller

我提出了一个UIViewController使用自定义转换和自定义UIPresentationController.视图控制器的视图不会覆盖整个屏幕,因此呈现视图控制器仍然可见.

接下来,我UIImagePickerController在此视图控制器的顶部提供一个实例.问题是,当我关闭图像选择器时,呈现视图控制器的框架覆盖整个屏幕而不是我想要它覆盖的部分.frameOfPresentedViewInContainerView在我的自定义中指定的框架UIPresentationController似乎完全被忽略.

仅当存在与所述图像拾取器modalPresentationStyleUIModalPresentationOverCurrentContext我的帧保持不变(因为没有视图从视图层次结构在第一位置去除这是有意义的).不幸的是,这不是我想要的.我希望图像选择器全屏显示,无论出于何种原因,它似乎搞乱了我的布局.我可能做错了什么或遗忘在这里?有什么建议?

Tho*_*eek 16

我尝试了两种提到的包装方法.使用这种包装方法的一个副作用是设备旋转不能很好地显示 - 在呈现的视图周围引入黑框.

而不是做包装技巧,尝试设置modalPresentationStyle呈现UIImagePickerControllerUIModalPresentationOverFullScreen.这意味着在演示/解雇期间,不会从视图层次结构中删除/恢复图像选择器下方的视图.

  • 天啊……我用头撞着每一个坚硬的表面,试图弄清楚这一点。从来没有想象过这是一个如此简单的解决方案。非常感谢 !:) 顺便说一句,这应该是公认的答案。 (2认同)

eru*_*del 4

这是预期的,因为全屏演示不会恢复由计算得出的原始帧frameOfPresentedViewInContainerView。\n解决此问题的推荐方法是创建一个包装视图,您将在其中插入所呈现的视图控制器的视图。以下是自定义演示控制器的相关代码:

\n\n
- (void)presentationTransitionWillBegin {\n    // wrapper is a property defined in the custom presentation controller.\n    self.wrapper = [UIView new];\n    [self.wrapper addSubview:self.presentedViewController.view];\n}\n\n- (CGRect)frameOfPresentedViewInContainerView {\n    CGRect result = self.containerView.frame;\n\n    // In this example we are doing a half-modal presentation\n    CGFloat height = result.size.height/2;\n    result.origin.y = height;\n    result.size.height = height;\n\n    return result;\n}\n\n- (UIView *)presentedView {\n    return self.wrapper;\n}\n\n- (BOOL)shouldPresentInFullscreen {\n    return NO;\n}\n\n- (void)containerViewWillLayoutSubviews {\n    self.wrapper.frame = self.containerView.frame;\n    self.presentedViewController.view.frame = [self frameOfPresentedViewInContainerView];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我们覆盖presentedView以返回包装器视图,而不是呈现的视图控制器视图的默认值 \xe2\x80\x93 。这样,即使第二个呈现修改了包装器的框架,呈现的视图控制器的视图也不会改变。

\n

  • 感谢@erudel 的建议,但不幸的是这并不能解决我的问题。我从中得到的是,自定义呈现的视图控制器在它呈现的视图控制器的解除动画之后是正确的,这是我之前通过简单地重新调整呈现的视图控制器的框架就已经实现的效果在 `containerViewWillLayoutSubviews` 中查看(不需要包装视图)。然而,在解除动画期间,视图的框架保持全屏,这会导致布局变化跳跃,当然首先就是不正确的。 (3认同)