Можно ли заставить UIPopoverPresentationController изменить положение popover вместо изменения его размера?

Я использую автоматическое расположение с раскадровкой. Я представляю 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 не изменяется:

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

}

Я попытался сбросить разрешенный ArrowDirections (в предпочитаемом контенте, потому что это казалось наиболее логичным местом). Это не работает (поповер все еще изменяет размеры):

- (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 не изменяется

Прямоугольник sourceView не должен изменяться, только ориентация интерфейса. Из документации UIPopoverControllerDelegate:

Для всплывающих окон, которые были представлены с использованием presentPopoverFromRect: inView: разрешенный ArrowDirections: animated: метод, контроллер всплывающих окон вызывает этот метод при изменении ориентации интерфейса.

Другие вопросы по тегам