Почему мой контроллер вида внутри UIPopoverPresentationController занимает весь экран?

Я нахожусь в процессе обновления приложения с ios 7 до ios 8, и одной из областей, с которыми у меня возникают проблемы, является новый UIPopoverPresentationController. По какой-то причине всякий раз, когда я представляю контроллер представления, использующий этот класс, контроллер представления не появляется во всплывающем окне, а вместо этого представляет, как будто он помещается в стек навигации (занимает весь экран). Я уверен, что упускаю очевидное, но между документацией Apple и многочисленными ответами Swift на SO я пропускаю это. Вот мой код:

-(void)createAndSizePopover:(NSString*)tableName
{
    //Create the picklist
    self.pickListPopoverViewController = nil;
    //NOTE WSPickListViewController is a UIViewController
    self.pickListPopoverViewController = [[WSPickListViewController alloc] initWithNibName:nil bundle:nil withPickListItem:self.densityUnits andPickListTableName:tableName isSlimLine:YES];
    self.pickListPopoverViewController.showSearchBar = NO;
    self.pickListPopoverViewController.modalPresentationStyle = UIModalPresentationPopover;
    ((WSPickListViewController*)self.pickListPopoverViewController).pickListItemDelegate = self;

    //Size the popover
    NSInteger rowsCount = [self.pickListPopoverViewController.allObjects count];
    NSInteger singleRowHeight = 35;
    NSInteger totalRowsHeight = rowsCount * singleRowHeight;
    NSInteger fourRowsHeight = 6 * singleRowHeight;
    NSInteger height = (totalRowsHeight >= fourRowsHeight) ? fourRowsHeight : totalRowsHeight;

    CGFloat largestLabelWidth = 0;
    for (WSPickList* pickItem in self.pickListPopoverViewController.allObjects)
    {
        CGSize labelSize = [pickItem.name sizeWithAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:20.0], NSForegroundColorAttributeName : [UIColor blackColor]}];
        if (labelSize.width > largestLabelWidth)
        {
            largestLabelWidth = labelSize.width;
        }
    }

    CGFloat popoverWidth = largestLabelWidth + 50;

    [self.pickListPopoverViewController setPreferredContentSize:CGSizeMake(popoverWidth, height)];
}

-(void)showOrHidePopover:(id)sender withTableName:(NSString*)tableName
{
    //Show/Hide the popover
    if (self.popover != nil)
    {
        [self.pickListPopoverViewController dismissViewControllerAnimated:YES completion:nil];
        self.popover = nil;
        self.pickListPopoverViewController = nil;
        return;
    }
    else
    {
        [self createAndSizePopover:tableName];
    }

    [self presentViewController:self.pickListPopoverViewController animated:YES completion: nil];

    self.popover = self.pickListPopoverViewController.popoverPresentationController;        
    self.popover.permittedArrowDirections = UIPopoverArrowDirectionRight;
    self.popover.sourceView = sender;

    if ([sender isKindOfClass:[UIButton class]])
    {
        self.popover.sourceRect = ((UIButton*)sender).bounds;
    }
    else if ([sender isKindOfClass:[UICollectionViewCell class]])
    {
        self.popover.sourceRect = ((UICollectionViewCell*)sender).bounds;
    }
}

Я в порядке с ответом в Objective-C или Swift (так как мне все равно нужно это учить). Заранее спасибо за любую помощь!

1 ответ

Решение

После нескольких дней теорий Google и тестирования, я наконец-то обнаружил несколько проблем в своем коде.

Во-первых, презентация не может прийти до настройки popoverPresentationController. Я знаю, что это идет вразрез с документацией Apple, в которой даже говорится, что кажется "нелогичным" представлять контроллер представления перед установкой контроллера popover, но даже это все же работает для меня.

Во-вторых, моя реализация adaptivePresentationStyleForPresentationController: была неверной. Я возвращал UIModalPresentationPopover, но я должен был вернуть UIModalPresentationNone следующим образом:

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}

Надеюсь, это поможет кому-то еще.

Другие вопросы по тегам