是否可以强制 UIPopoverPresentationController 重新定位弹出框而不是调整其大小?
Posted
技术标签:
【中文标题】是否可以强制 UIPopoverPresentationController 重新定位弹出框而不是调整其大小?【英文标题】:Can UIPopoverPresentationController be forced to reposition popover instead of resizing it? 【发布时间】:2015-03-27 18:32:16 【问题描述】:我在 Storyboard 中使用自动布局。我从一个单元格矩形中呈现一个 popoverPresentationController:
NumberController * viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NumberController"];
UIPopoverPresentationController *pc = [viewController popoverPresentationController];
pc.delegate = self;
pc.permittedArrowDirections = UIPopoverArrowDirectionAny;
pc.sourceView = tableView;
pc.sourceRect = [tableView rectForRowAtIndexPath:indexPath];
[self.navigationController presentViewController:viewController animated:animated completion:nil];
弹出框以纵向模式显示在 iPad 上,箭头向上。
我将 iPad 旋转到横向模式。 popoverPresentationController 保持相同的 sourceView/sourceRect 并正确指向单元格。它还保留向上箭头。
但它现在位于视图的底部,因此弹出框会调整为较短的高度。这不是我们想要的行为。
如果弹出框只是移动到新位置并更改箭头方向,则根本不需要调整大小。这是期望的行为。
我认为以下方法可能允许我进行更改,但由于 sourceView rect 没有更改,因此未调用它:
- (void)popoverController:(UIPopoverController *)popoverController
willRepositionPopoverToRect:(inout CGRect *)rect
inView:(inout UIView **)view
我尝试重置 allowedArrowDirections(在preferredContentSize 中,因为这似乎是最合乎逻辑的地方)。这不起作用(弹出框仍在调整大小):
- (CGSize) preferredContentSize
[super preferredContentSize];
self.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUnknown;
return CGSizeMake(DEFAULT_POPOVER_WIDTH,DEFAULT_POPOVER_HEIGHT);
我根本找不到强制 popoverPresentationController 更改箭头方向并重新定位弹出框而不是调整弹出框大小的方法。我开始认为这是不可能的 - 但我仍然希望我只是错过了一些东西。
编辑:与此同时,我想到如果我不想在 iPad 中调整它的大小,弹出框可能不是呈现此视图的最佳方式。我将尝试使用 UIModalPresentationFormSheet 演示文稿。但我仍然想找到这个问题的答案。
【问题讨论】:
【参考方案1】:我刚刚遇到了问题
- (void)popoverController:(UIPopoverController *)popoverController
willRepositionPopoverToRect:(inout CGRect *)rect
inView:(inout UIView **)view
没有被调用,因为我的视图控制器已分离。您的视图层次结构中可能有一个视图,其视图控制器尚未添加为子视图控制器。
我认为以下方法可能允许我进行更改,但由于 sourceView rect 没有更改,因此未调用它
sourceView rect 不必改变,只是界面方向。来自 UIPopoverControllerDelegate 文档:
对于使用 presentPopoverFromRect:inView:permittedArrowDirections:animated: 方法呈现的弹出框,弹出框控制器会在界面方向更改时调用此方法。
【讨论】:
以上是关于是否可以强制 UIPopoverPresentationController 重新定位弹出框而不是调整其大小?的主要内容,如果未能解决你的问题,请参考以下文章