UIPopoverController автоматически изменяет размер до максимальной высоты на pushViewController - PullRequest
68 голосов
/ 11 августа 2010

У меня есть поповер, содержащий UINavigationController. Я могу отображать поповер хорошо, и он содержит navController просто отлично. NavController содержит tableView, и когда я выбираю элемент, он создает новый подробный вид:

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

Затем я нажимаю новый контроллер вида:

    [self.navigationController pushViewController:detailViewController animated:YES];

Это происходит, когда возникает проблема: после нажатия нового вида, когда поповер изменяет размер до максимальной высоты, доступной на iPad.

Я попытался установить высоту всех представлений в xib на фиксированную высоту, а не на гибкость. Я попытался явно установить высоту поповера. Я также попытался использовать различные контроллеры представления в качестве дочернего представления. Проблема остается: поповер хочет, чтобы автоматически изменял свой размер до максимальной высоты всякий раз, когда на навигационный контроллер выдвигается новый вид.

Вот вопрос , в котором обсуждается попытка преднамеренно контролировать размер всплывающего окна при нажатии новых представлений:

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

Другими словами, что-то буквально заставляет поповер достичь максимальной высоты, и, кажется, это происходит после , когда были вызваны все методы делегата.

Это навигационный контроллер? Кто-нибудь видел такие вещи?

Ответы [ 13 ]

1 голос
/ 16 декабря 2014

Это может сработать один раз, но не с xCode 6, где contentSizeForViewInPopover устарела К счастью, это уважается во время загрузки раскадровки. Я скачал редактор XML (Xmplify) и взломал раскадровку. Установите для ключа contentSizeForViewInPopover нужный размер. Сохраните и замените (сначала сделайте копию) раскадровку.

Более конкретно:

< viewController>

     <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >

</viewController>
0 голосов
/ 14 сентября 2017

Под управлением Swift 4 и iOS 11 единственным возможным решением было для меня. Использовать showViewController:sender: and showDetailViewController:sender: вместо presentViewController:animated:completion:.

Из Apple Doc

showViewController: sender: и showDetailViewController: sender: методы предлагают наиболее адаптивный и гибкий способ отображения контроллеров представления. Эти методы позволяют представителю представления решить, как лучше всего обрабатывать презентацию. Например, контроллер представления контейнера может включать контроллер представления как дочерний элемент вместо представления его модально. Поведение по умолчанию представляет контроллер представления модально.

0 голосов
/ 01 декабря 2012

Не работай для меня, когда я использую это:

[UIPopoverController 
    [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] 
]

Когда появляется поповер, все в порядке, нажмите кнопку на vc1 и нажмите vc2 к контроллеру навигации

Далее вернуться к нажатию кнопки vc1 (root) в vc2 (метод popToRootViewController);

Мы можем видеть, что popover меняет свой размер, но размер vc1 устарел ... ЧТО ЭТО ???

Хорошо, теперь работает ... Добавьте свойство popover в мой контроллер

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;
...