Почему мой контроллер вида внутри 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;
}
Надеюсь, это поможет кому-то еще.