可以强制UIPopoverPresentationController重新定位popover而不是调整它吗?

时间:2015-03-27 18:32:16

标签: ios8 autolayout uipopovercontroller uipopover uipresentationcontroller

我正在使用故事板的自动布局。我从一个单元格矩形中提出了一个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中,因为这似乎是最合乎逻辑的地方)。这不起作用(popover仍然调整大小):

- (CGSize) preferredContentSize {
    [super preferredContentSize];
    self.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionUnknown;
    return CGSizeMake(DEFAULT_POPOVER_WIDTH,DEFAULT_POPOVER_HEIGHT);
}

我根本无法找到一种方法来强制popoverPresentationController更改箭头方向并重新定位popover而不是调整popover的大小。我开始认为它甚至不可能 - 但我仍然希望我只是缺少一些东西。

编辑:与此同时,我发现如果我不希望它在iPad中重新调整大小,那么弹出窗口可能不是呈现此视图的最佳方式。我将尝试使用UIModalPresentationFormSheet演示文稿。但我仍想找到这个问题的答案。

1 个答案:

答案 0 :(得分:2)

我刚遇到

的问题
    - (void)popoverController:(UIPopoverController *)popoverController
    willRepositionPopoverToRect:(inout CGRect *)rect
               inView:(inout UIView **)view {

未被调用,因为我的视图控制器已分离。视图层次结构中可能存在一个视图,其视图控制器尚未添加为子视图控制器。

  

我认为以下方法可能允许我进行更改,但由于sourceView rect不会更改,因此不会调用它

sourceView rect不必更改,只需更改界面方向。来自UIPopoverControllerDelegate文档:

  

对于使用presentPopoverFromRect:inView:allowedArrowDirections:animated:方法呈现的弹出框,当界面方向发生变化时,弹出控制器会调用此方法。