UIPopoverController с UINavigationController Subview contentSizeForViewInPopover не работает на родительском - PullRequest
16 голосов
/ 28 мая 2010

У меня есть UIPopoverController с подклассом UINavigationController. И родительское, и дочернее представления являются UITableviews.

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

Когда я щелкаю в дочернем представлении, я изменяю размер всплывающего окна на contentSizeForViewInPopover = (320 780)

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

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

Заранее спасибо !!

Ответы [ 6 ]

24 голосов
/ 02 августа 2010

Свойство 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);
    }
}
13 голосов
/ 19 августа 2011

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

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

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

2 голосов
/ 24 мая 2011

В моем проекте мне пришлось динамически изменять размер поповера.

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

Код ниже, надеюсь, он кому-нибудь поможет:

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

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

        _popoverController.popoverContentSize = size;
    }
}
1 голос
/ 13 сентября 2011

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

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

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

Еще одна вещь, которую я подобрал, это то, что при нажатии назад при редактировании textField размер остается небольшим, а не большим предыдущим представлением. Вызовите метод resignFirstResponder для вашего textField в viewWillDisappear контроллера.

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

1 голос
/ 01 июня 2010

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


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

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

Надеюсь, это вам поможет.

0 голосов
/ 31 октября 2013

Попробовав много вещей, ответ @ chuck-k помог мне прилично разрешить проблемы с поповером UINavigationController в 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];
}

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

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

...