Можно ли заставить 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: метод, контроллер всплывающих окон вызывает этот метод при изменении ориентации интерфейса.