Popover со встроенным навигационным контроллером не учитывает размер на задней панели - PullRequest
88 голосов
/ 02 мая 2010

У меня есть UIPopoverController, на котором размещен UINavigationController, который содержит небольшую иерархию контроллеров представления.

Я следовал документации и для каждого контроллера представления я устанавливал размер popover-context представления следующим образом:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(размер отличается для каждого контроллера)

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

Однако, когда я перемещаюсь «Назад» по стеку вида с помощью кнопки «Назад» на панели навигации, размер всплывающего окна не изменяется - он остается настолько большим, насколько достигнуто самое глубокое представление. Это кажется сломанным для меня; Я ожидаю, что поповер учитывает размеры, которые устанавливаются, когда он попадает в стек представлений.

Я что-то упустил?

Спасибо.

Ответы [ 21 ]

1 голос
/ 30 сентября 2012

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

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = CGSizeMake(0, 0);
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}
0 голосов
/ 05 февраля 2013

У меня была эта проблема с контроллером поповера, у которого popoverContentSize = CGSizeMake (320, 600) в начале, но увеличился бы при навигации по его ContentViewController (UINavigationController).

Контроллер nav только выдвигал и выдвигал пользовательские UITableViewControllers, поэтому в моем настраиваемом классе viewDidLoad класса контроллера таблицы я установил self.contentSizeForViewInPopover = CGSizeMake (320, 556)

Меньше на 44 пикселя приходится на навигационную панель контроллера Nav, и теперь у меня больше нет проблем.

0 голосов
/ 21 мая 2015

Вам необходимо установить свойство preferredContentSize NavigationController в viewWillAppear:

-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.preferredContentSize = CGSizeMake(320, 500);}
0 голосов
/ 29 сентября 2014

@ krasnyk решение хорошо работало в предыдущих версиях iOS, но не работало в iOS8. Следующее решение сработало для меня.

    - (void) forcePopoverSize {
        CGSize currentSetSizeForPopover = self.preferredContentSize;
       //Yes, there are coupling. We need to access the popovercontroller. In my case, the popover controller is a weak property in the app's rootVC.
        id mainVC = [MyAppDelegate appDelegate].myRootVC;
        if ([mainVC valueForKey:@"_myPopoverController"]) {
            UIPopoverController *popover = [mainVC valueForKey:@"_myPopoverController"];
            [popover setPopoverContentSize:currentSetSizeForPopover animated:YES];
        }
    }

Это не лучшее решение, но оно работает.

Новый UIPopoverPresentationController также имеет проблему с изменением размера :(.

0 голосов
/ 25 июня 2014

Это правильный путь в iOS7, чтобы сделать это, Установите предпочтительный размер содержимого в viewDidLoad в каждом контроллере представления в стеке навигации (только один раз). Затем в viewWillAppear получите ссылку на контроллер поповера и обновите там contentSize.

-(void)viewDidLoad:(BOOL)animated
{
    ...

    self.popoverSize = CGSizeMake(420, height);
    [self setPreferredContentSize:self.popoverSize];
}

-(void)viewWillAppear:(BOOL)animated
{
    ...

    UIPopoverController *popoverControllerReference = ***GET REFERENCE TO IT FROM SOMEWHERE***;
    [popoverControllerReference setPopoverContentSize:self.popoverSize];
}
0 голосов
/ 30 апреля 2014

Я просто хотел бы предложить другое решение, так как ни одно из них не сработало для меня ...

Я на самом деле использую это с этим https://github.com/nicolaschengdev/WYPopoverController

При первом вызове всплывающего окна используйте это.

if ([sortTVC respondsToSelector:@selector(setPreferredContentSize:)]) {
   sortTVC.preferredContentSize = CGSizeMake(popoverContentSortWidth,
        popoverContentSortHeight);
}
else 
{
   sortTVC.contentSizeForViewInPopover = CGSizeMake(popoverContentSortWidth, 
        popoverContentSortHeight);
}

Тогда в этом всплывающем окне используйте это.

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

  if ([self respondsToSelector:@selector(setPreferredContentSize:)]) {
    self.preferredContentSize = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
  else 
  {
    self.contentSizeForViewInPopover = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
}

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

self.contentSizeForViewInPopover = CGSizeZero;

}

Затем повторите для дочерних просмотров ...

0 голосов
/ 26 сентября 2013

Столкнулся с той же проблемой и исправил ее, установив размер представления контента для контроллера навигации и контроллера представления до размещения инициализации UIPopoverController.

     CGSize size = CGSizeMake(320.0, _options.count * 44.0);
    [self setContentSizeForViewInPopover:size];
    [self.view setFrame:CGRectMake(0.0, 0.0, size.width, size.height)];
    [navi setContentSizeForViewInPopover:size];

    _popoverController = [[UIPopoverController alloc] initWithContentViewController:navi];
0 голосов
/ 16 мая 2013

Поместите это во все контроллеры представления, которые вы помещаете в поповер

CGSize currentSetSizeForPopover = CGSizeMake(260, 390);
CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,
                                      currentSetSizeForPopover.height - 1.0f);
self.contentSizeForViewInPopover = fakeMomentarySize;
self.contentSizeForViewInPopover = currentSetSizeForPopover;
0 голосов
/ 12 августа 2011

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

AirPrintController *airPrintController = [[AirPrintController alloc] initWithNibName:@"AirPrintController" bundle:nil];
airPrintController.view.frame = [self.view frame];
airPrintController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
[self.navigationController pushViewController:airPrintController animated:YES];
[airPrintController release];

установить свойство contentSizeForViewInPopover для этого контроллера, прежде чем отправлять этот контроллер в navigationController

0 голосов
/ 21 февраля 2012

Мне повезло, поместив в viewdidappear следующее:

[self.popoverController setPopoverContentSize:self.contentSizeForViewInPopover animated:NO];

Хотя это может и не привести к хорошей анимации в случае, когда вы нажимаете на всплывающие окна разных размеров Но в моем случае работает отлично!

...