2010-05-28 3 views
16

У меня есть UIPopoverController с подклассом UINavigationController. Представление parent и child - это UITableviews.UIPopoverController w/UINavigationController Subview contentSizeForViewInPopover не работает с родителем

Когда я вызываю родительский вид изначально с contentSizeForViewInPopover = (320,480), он отлично работает.

Когда я щелкаю в поле зрения ребенка изменить размер поповер к contentSizeForViewInPopover = (320780)

Когда возвращение обратно в родительский зрения я не могу получить поповер, чтобы изменить размер обратно contentSizeForViewInPopover = (320,480). popover остается в размере (320,780).

Пробовал все, но что-то не хватало. Кто-нибудь знает, как изменить размер представления с помощью UIPopoverControllers в приведенном выше сценарии?

Спасибо заранее!

+0

Кто-нибудь? я все еще не смог изменить размер моего popover должным образом. его легко увеличить в размере, но я не могу получить его, чтобы вернуться к меньшему оригинальному размеру. – Abbacore

+0

Хорошая маркировка - это способ ответить на ваш вопрос :) – skaffman

ответ

13

У меня была та же проблема, но ни один из вышеперечисленных решений не работал для меня. Однако, пытаясь объединить свои подходы, мне было предложено несколько иначе, чтобы атаковать проблему. Это работает для меня:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.contentSizeForViewInPopover = navigationController.topViewController.view.frame.size; 
} 

У меня есть три разных popovers, каждый из которых использует контроллеры навигации. Это решение имеет хороший побочный эффект для работы для всех из них, поскольку оно не делает конкретной ссылки на любой из контроллеров popover, но заканчивается использованием popoverContentSize из используемого в настоящее время контроллера popover.

+0

После того, как я попытался использовать все методы в этой теме и из других мест, это был единственный способ сделать эту работу. Благодарю. –

+0

Я нашел это в документации: «Это свойство содержит желаемый размер для контроллера вида, когда он отображается в popover. По умолчанию ширина установлена ​​на 320 точек, а высота установлена ​​на 1100 точек». Поэтому, если вы НЕ устанавливайте contentSizeForViewInPopover явно, это будет 320x1100, это сводило меня с ума, поскольку я думал, что яблоко будет использовать разумные значения по умолчанию и сделать contentSizeForViewInPopover по умолчанию для фрейма представления или чего-то еще, но, по-видимому, это не так. Поэтому установите contentSizeForViewinPopover, если вы хотите, чтобы ваш popover вел себя! – mgrandi

+0

Это работало и для меня, но я понятия не имею, почему. просеивание по размеру кажется искаженным. Иногда они будут правильно изменяться, в других случаях вам нужно установить странную последовательность методов, чтобы заставить ее работать правильно. – LightningStryk

1

Я думаю, что у меня была такая же проблема, и я решил ее, установив размер для представления в popover каждый раз, когда появится представление. Например:

 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.contentSizeForViewInPopover = CGSizeMake(320, 444); //Set your own size 
} 

Я надеюсь, что это вам поможет.

+0

спасибо за входную энрику. Первоначально я пробовал это и просто ничего не делал. представьте, родительский popover открывается на 320x480. затем я выбираю строку, которая подталкивает «дочерний» вид внутри popover, который равен 320x720. если я нажму кнопку «Назад», мой «родительский» вид останется 320x720. – Abbacore

+0

Можете ли вы определить, когда они нажимают кнопку «Назад» или когда предыдущий просмотр отображается снова после касания кнопки «Назад»? Если вы можете обнаружить это, тогда вы можете поместить «contentSizeForViewInPopover» в эту часть кода. –

24

Свойство contentSizeForViewInPopover свойства контроллера вида устанавливает только исходный размер (его начальный), содержащий UIPopoverController. Чтобы изменить размер UIPopoverController в произвольное время, вы должны установить его свойство popoverContentSize. Обратите внимание: popoverContentSize является свойством UIPopoverController и не контроллера вида (так что вам, вероятно, понадобится ссылка на контроллер popover).

Чтобы сбросить размер в поповере каждый раз, когда контроллер вида становится верхним контроллером представления по UINavigationController, вы можете использовать методы в UINavigationControllerDelegate протокола:

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if (viewController == viewControllerToResize) { 
     referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480); 
    } 
} 
+0

Один потенциальный вопрос заключается в том, что верхний UIViewController contentSizeForViewInPopover не был установлен, и вы устанавливаете popoverContentSize UIPopoverController, вы увидите размер popover с указанным popoverContentSize, а затем на размер по умолчанию (в настоящее время 320x1100). Чтобы решить эту проблему, я просто установил contentSizeForViewInPopover, а затем popoverContentSize. Отказ от ответственности: это не хорошо изученный вывод; а именно то, что я испытал в своем текущем проекте на iOS 4.3. – kalperin

+0

Это работало для меня, проработав несколько часов, чтобы исправить это, но мне пришлось добавить дополнительную задержку, прежде чем изменять размер popover. – XCool

2

В моем проекте я должен был динамически изменять размер самих трещать.

Я сделал оригинальный контроллер делегат моего контроллера контента поповера и реализовал это метод делегата, который вызывается каждый раз, когда размер изменяется:

код находится ниже, надеюсь, что это помогает кто-то:

-(void) popover:(UIViewController*)controller didChangeSize:(CGSize)size{ 

    if ([controller class] == [AZViewController class]){ 
     if (!_popoverController){ 
      _popoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
     } 

     _popoverController.popoverContentSize = size; 
    } 
} 
1

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

В каждом viewController, отображаемом с помощью иерархии навигации, задайте свойство contentSizeForViewInPopover в методе viewDidAppear: до его соответствующего размера.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setContentSizeForViewInPopover:CGSizeMake(320, 320)]; 
} 

Другая вещь, которую я взял, что при касании назад при редактировании TextField, размер остается небольшой вместо увеличения предыдущего вида. Вызовите метод resignFirstResponder на вашем текстовом поле в представлении контроллераWillDisappear.

Мне любопытно, работает ли это решение через sdks.

+0

не работает для меня. SDK 6, компиляция для iOS 4.3 – SpaceDog

0

После многих попыток ответ @ chuck-k помог мне решительно решить мои проблемы с UINavigationController popover в iOS7.

Вот что я сделал:

  • для каждого UIViewController в UINavigationController я рассчитать размер содержимого Я хочу отображаемую в методе - (CGSize)contentSizeForViewInPopover плюс navigationController.navigationBar.frame.size.height (который всегда 44, я думаю). Я не использую никаких других функций popover в этих UIViewControllers.

  • я объявил мой UIViewController, который создает UINavigationController как UINavigationControllerDelegate

  • Тогда в делегатом ....

.....

- (void)navigationController:(UINavigationController *)navigationController willShowViewController: (UIViewController *)viewController animated:(BOOL)animated { 

    BOOL popoverAnimation = NO; 

    if (self.myPopoverController.popoverContentSize.height < viewController.contentSizeForViewInPopover.height) popoverAnimation = YES; 

    [self.myPopoverController setPopoverContentSize:viewController.contentSizeForViewInPopover animated:popoverAnimation]; 
} 

Высота check сравнивает размер содержимого popover текущего контроллера просмотра с «входящим» контроллером. Я использую анимация = NO при переходе от больше -> меньше размер содержимого popover, потому что в противном случае я получаю некоторую отрывистую репозиционирующую анимацию в iOS7. Но особенно если анимации = NO при переходе от меньше -> больше поповера размера содержания, поповера размера увеличится до размера я ожидал но не будет отображать содержимое больше, чем ранее меньше содержание размер ... настройка анимация = ДА разрешил эту проблему для меня. (Я только проверяю высоту, потому что в моем случае ширина фиксирована.)

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