Как динамически изменить contentSize для UIPopoverController?
У меня есть UIViewController
, который содержит UITableView
.
Этот UIViewController
отображается в UIPopoverController
.
Теперь дело в том, что количество элементов в tableView
не является постоянным, и я хочу, чтобы размер popover (то есть - popoverContentSize
), чтобы настроить в соответствии с количеством элементов в tableView
Наивно, я думал, что если я установлю contentSizeForViewInPopover
в viewDidLoad
после того, как я загружу tableView
со всеми элементами - он сделает это.
Это не так.
Итак, сделайте это коротко, мой вопрос: как я могу изменить popoverContentSize
непосредственно из contentViewController
- после его представления?
Приложение:
![enter image description here]()
Ответы
Ответ 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 и встроенное в контроллер навигации, то есть что-то вроде UINavigationController
→ TopMenuViewController
→ SubMenuViewController
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)}