Как заставить мой UIPopoverController анимировать его размер, когда его содержащийся UINavigationController выталкивает новый контроллер?
У меня есть UIPopover
, отображаемый с UIBarButtonItem
в моем приложении для iPad. Он содержит UINavigationViewController
, который имеет свое окно настроек в качестве своего контроллера корневого представления. Окно настроек является подклассом UITableViewController
(стиль установлен в сгруппированный), а нажатие любой из его ячеек накладывает различные контроллеры вида "chooser" на навигационный контроллер, которые также являются подклассами UITableViewController
.
Для каждого из вариантов выбора, в viewDidAppear
, я устанавливаю contentSizeForViewInPopover
соответствующим образом:
self.contentSizeForViewInPopover = CGSizeMake(320, self.items.count * 44);
Но это не оживляет изменения; когда анимация навигации заканчивается, popover привязывается к новой высоте (ширина никогда не изменяется с 320). Навигация назад назад оживляет изменение размера (выполненное с помощью метода этого ответа), но вперед никогда не делает.
Я попытался получить ссылку на его использование и используя setPopoverContentSize:animated:
, но он не работает. Я посмотрел на другие questions безрезультатно.
Как мне заставить его всегда анимировать изменение размера должным образом?
Обновление: Я установил простой тестовый проект, чтобы попробовать это. Это приложение панели вкладок для iPad, настроенное в Xcode. Я добавил элемент панели вкладок в панель навигации в одном из контроллеров представления. Когда эта кнопка нажата, контроллер представляет popover, который содержит контроллер навигации, который имеет очень простой подкласс UITableViewController
, называемый TestContentViewController
, в качестве своего контроллера корневого представления.
В viewDidLoad
этого подкласса я произвольно генерирую несколько элементов:
self.numItems = arc4random() % 10 + 3;
Это мое количество строк; количество разделов равно 1. В cellForRowAtIndexPath
я просто установил текст метки ячейки и вернул его. Когда выбрана строка, я создаю другой экземпляр того же класса и вставляю его в стек.
Без каких-либо действий с свойством contentSizeForViewInPopover
на любом VC, popover просто достигает максимальной высоты и остается там независимо от того, сколько строк в моем представлении таблицы.
Если я задаю размер в viewDidAppear, вот так:
-(void)viewDidAppear:(BOOL)animated
{
self.contentSizeForViewInPopover = CGSizeMake(320, self.numItems * 44);
[super viewDidAppear:animated];
{
- Когда появляется первый popover, он очень быстро мигает до полной высоты, а затем привязывается к заданной высоте.
- Когда новый контроллер нажимается на контроллер навигации, он защелкивается до высоты без анимации.
- Когда я перехожу назад, если VC, который я использую, выше, чем тот, с которого я выхожу, он оживляет нужный размер. Если то, что я использую, меньше, оно ничего не делает.
Если я делаю то же самое, но в viewWillAppear
:
- Когда появится первый popover, он будет полноразмерным
- Когда я впервые нажимаю строку и получаю новый контроллер в стеке, он оживляет как минимум около 400 пикселей в высоту. Когда новый контроллер помещается в стек, если ему требуется больше высоты, он получает его. Если он не остается прежним,
Если я делаю то же самое в viewDidLoad
, он в основном такой же, как viewWillAppear
, за исключением того, что он сначала появляется в нужном размере.
Я попытался установить делегат контроллера навигатора в качестве VC, который представляет popover, а затем установите высоту popover (setPopoverContentSize:animated:
) в navigationController:didShowViewController:animated:
, но результирующая высота немного отключена. Я думаю, что размер, который я установил там, должен учитывать дополнительную высоту навигационной панели, встроенной в верхнюю часть popover. А анимация при нажатии нового контроллера в стеке является странной.
Обновить снова: Смотрите здесь для той же проблемы, которая была решена с помощью нового UIPopoverPresentationController
.