我有一个使用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:]
答案 0 :(得分:4)
通过分配:
来更改演示文稿样式 viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
导致模态显示控制器占据屏幕的一小部分,与UIPresentationController
的原始显示视图控制器的分数相同。
但是,使用
viewController.modalPresentationStyle = UIModalPresentationOverFullScreen
对于这种情况更好,因为他的模态控制器是全屏的。
答案 1 :(得分:2)
尝试使用:
viewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
它在iOS 8.1中帮助了我
答案 2 :(得分:2)
我遇到了同样的问题。我尝试使用符号断点进行调试,似乎在某种布局管理器上有一些内部调用。
虽然我无法解决&#34;这(在我看来像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异步块中执行它时,一旦动画结束它就会被破坏(调整为全屏)。