UIPopoverController w/UINavigationController Subview contentSizeForViewInPopover не работает на родительском

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

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

Когда я нажимаю на дочерний вид, я изменяю размер popover на contentSizeForViewInPopover = (320,780)

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

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

Спасибо в Advance!!

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

        _popoverController.popoverContentSize = size;
    }
}

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Попробовав много вещей, ответ @chuck-k помог мне решительно решить мои проблемы с UINavigationController в iOS7.

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

  • для каждого UIViewController в UINavigationController. Я вычисляю размер содержимого, который я хочу отобразить в методе - (CGSize)contentSizeForViewInPopover plus 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];
}

Проверка высоты сравнивает текущий размер содержимого контента контроллера просмотра с "входящим" контроллером. Я использую анимация = НЕТ при переходе от более крупного → меньшего размера содержимого popover, потому что в противном случае я получаю некоторую резкую репозиционирующую анимацию в iOS7. Но особенно если анимация = НЕТ при переходе от меньшего → большего размера содержимого popover, размер popover увеличится до размера, который я ожидал , но не отображал содержимое больше чем ранее меньший размер содержимого... настройка анимация = ДА разрешила эту проблему для меня. (Я проверяю только высоту, потому что в моем случае ширина фиксирована.)

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