Подтвердить что ты не робот

Как динамически изменить contentSize для UIPopoverController?

У меня есть UIViewController, который содержит UITableView. Этот UIViewController отображается в UIPopoverController.

Теперь дело в том, что количество элементов в tableView не является постоянным, и я хочу, чтобы размер popover (то есть - popoverContentSize), чтобы настроить в соответствии с количеством элементов в tableView

Наивно, я думал, что если я установлю contentSizeForViewInPopover в viewDidLoad после того, как я загружу tableView со всеми элементами - он сделает это.

Это не так.

Итак, сделайте это коротко, мой вопрос: как я могу изменить popoverContentSize непосредственно из contentViewController - после его представления?

Приложение: enter image description here

4b9b3361

Ответ 1

Возможно, мне очень поздно ответить, но для нового пользователя от iOS 7 пожалуйста, используйте следующую строку в UIViewController i, e contentViewController вашего UIPopOverViewConotroller

-(void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    self.preferredContentSize=myTableView.contentSize;
}

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

Ответ 2

Ну, в конце я сделал что-то, что я не уверен, правильно ли это делать, но он работает.

Я добавил ссылку в свой ContentViewController на popoverController:

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer;

Затем я добавил код изменения размера в viewWillAppear и viewDidAppear:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView reloadData];
}

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.contentSizeForViewInPopover = self.tableView.contentSize;
}

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES];
}

Итак, сохраняя ссылку на popover, это хак-иш, поэтому я открыт, чтобы услышать лучшие идеи.

Ответ 3

A UIViewController класс имеет свойство

self.contentSizeForViewInPopover

который изменит размер поп файла по мере необходимости, добавив ссылку на него.

И чтобы расширить решение, я использовал метод rectForSection:, чтобы получить размер раздела (у меня только 1 секция, поэтому достаточно легко получить) а затем добавили высоту навигационной панели (кажется, 20). поэтому я могу создать popover размер готового представления таблицы:

CGRect sectionRect = [view.tableView rectForSection:0];

if (sectionRect.size.height + 20 < POPOVER_SIZE.height)
    view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20);
else
    view.contentSizeForViewInPopover = POPOVER_SIZE;

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

Ответ 4

Для iOS 7 или выше.

- (CGSize)preferredContentSize {
    return CGSizeMake(320, 550);
}

Если вы являетесь дочерним элементом контейнера, повторно укажите размер содержимого для себя. Например. В подклассе UINavigationController:

- (CGSize)preferredContentSize {
    return self.topViewController.preferredContentSize;
}

Ответ 5

В моем приложении есть меню с подменю, происходящее из popover и встроенное в контроллер навигации, то есть что-то вроде UINavigationControllerTopMenuViewControllerSubMenuViewController xN.

Ни один из вышеперечисленных решений не работал у меня.

Мое решение: в моем классе контроллера меню корневого меню, из которого наследуются все остальные контроллеры представления меню, добавьте следующий код:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.preferredContentSize  = CGSizeMake(450.0f, 0.0f);// increase standard width (320.0)
}


- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.navigationController.preferredContentSize = self.tableView.contentSize;
}

Ответ 6

У меня была такая же проблема, и ни один из ответов, которые я нашел, не работал. Я объехал все, что я думаю, хорошо работает.

У меня есть массив в моем initWithCoder, который содержит мои значения. Я просто запускаю этот код:

- (id)initWithCoder:(NSCoder *)aDecoder
{
//Popover Choices

_importantChoices = [NSMutableArray array];
[_importantChoices addObject:@"Bakery"];
[_importantChoices addObject:@"Beverage Dry Mix"];
[_importantChoices addObject:@"Beverage RTD"];
[_importantChoices addObject:@"Crisps"];
[_importantChoices addObject:@"Meat"];
[_importantChoices addObject:@"Supplements"];


//Calculate size of Popover
self.clearsSelectionOnViewWillAppear = NO;
NSInteger rowsCount = [_importantChoices count];
NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView
                                       heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
NSInteger totalRowsHeight = rowsCount * singleRowHeight;
CGFloat largestLabelWidth = 0;
for (NSString *tmp in _importantChoices) {
    CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20.0f]}];
    if (labelSize.width > largestLabelWidth) {
        largestLabelWidth = labelSize.width;
    }
}
CGFloat popoverWidth = largestLabelWidth + 100;     //Add a little padding to the width
self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight);
return self;
}

Ответ 7

iOS8/9 - просто переопределите preferredContentSize и принудительно создайте представление таблицы до его возврата contentSize.

- (CGSize)preferredContentSize {
    [self.tableView layoutIfNeeded];
    return self.tableView.contentSize;
}

Ответ 8

Это должно сделать трюк

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

  self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}