Измените contentSizeForViewInPopover на push для навигации контроллера на iOS - PullRequest
5 голосов
/ 15 марта 2012

У меня есть UIPopoverController с навигационным контроллером и кучей подпредставлений. Размер поповера устанавливается как раз перед тем, как он будет показан следующим образом:

[self.myPopover setPopoverContentSize:CGSizeMake(320, 500)];

Это прекрасно работает. Всплывающее окно отображается с настроенным размером. Когда другое представление помещается в стек навигации, размер всплывающего окна устанавливается снова - требуется другая высота - в методе viewWillAppear:

self.contentSizeForViewInPopover = CGSizeMake(320, 700);

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

Я добавил тот же вызов в viewWillAppear при первом просмотре, но размер не изменился.

Как мне изменить размер всплывающего окна при навигации между представлениями?

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

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

В моем contentViewController я сохраняю ссылку на UIPopoverController * parent;

Эта ссылка устанавливается во время инициализации UIPopoverController и его содержимого. Это, конечно, может не вписываться непосредственно в вашу иерархию представлений. Код в UIViewController что показывает UIPopowerController это что-то вроде:

if (self.popoverController == nil) {
    _contentController = [[ContentViewController alloc] initWithNibName:@"ContentViewController"
                                                                 bundle:[NSBundle mainBundle]]; 

    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:_contentController]; 
    _contentController.parent = popover;
    [popover setPopoverContentSize: CGSizeMake(520.0,580.0)];

    popover.delegate = self;

    self.popoverController = popover;
}

И когда я хочу динамически изменить размер содержимого из contentViewController, я использую:

-(void)setNewSize:(CGSize) newSize {

    [_parent setPopoverContentSize:newSize animated:YES];
}
3 голосов
/ 15 марта 2012

Я использую этот хак:

- (CGSize)contentSizeForViewInPopover
{
    return CGSizeMake(320, 200);
}

- (void) forcePopoverSize 
{
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, 
                                          currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
}


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

    [self forcePopoverSize];
}

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

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}
...