我的UIViewController
包含UITableView
。
此UIViewController
显示在UIPopoverController
。
现在,问题是tableView
中的项目数量不是常数,我希望弹出窗口的大小(即popoverContentSize
)根据数量进行调整tableView
天真地,我想,如果我在contentSizeForViewInPopover
加载所有项目之后将viewDidLoad
设置在tableView
中,它就会这样做。
没有。
所以简而言之,我的问题是:如何在popoverContentSize
之后直接更改contentViewController
?
附录:
答案 0 :(得分:47)
对于来自iOS 7的新用户,我可能很晚才回答 请使用 UIViewController 中的以下行, UIPopOverViewConotroller contentViewController
-(void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
self.preferredContentSize=myTableView.contentSize;
}
希望这对iOS 7用户有所帮助。
答案 1 :(得分:9)
嗯,最后我做了一些事我不确定这是否正确,但是它正在发挥作用。
我在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的引用有点像hack-ish,所以我愿意听到更好的想法。
答案 2 :(得分:7)
UIViewController类具有属性
self.contentSizeForViewInPopover
这将调整pop的大小,而不需要添加对它的引用。
为了扩展解决方案,我使用方法rectForSection:来获取部分的大小(我的只有1个部分,很容易得到),然后添加了导航栏的高度(它似乎是20)。所以我能够创建完成的表视图大小的弹出窗口:
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;
对于多个部分,可能会更加困难,我没有尝试过。应该能够总结一段高度,但可能会有一些我不知道的间距问题。
答案 3 :(得分:7)
适用于iOS 7或更高版本。
- (CGSize)preferredContentSize {
return CGSizeMake(320, 550);
}
如果您是容器的孩子,请将内容大小重定向给自己。例如。在UINavigationController
子类中:
- (CGSize)preferredContentSize {
return self.topViewController.preferredContentSize;
}
答案 4 :(得分:1)
我的应用程序有一个菜单,其子菜单源自弹出窗口并嵌入在导航控制器中,例如UINavigationController
- &gt; TopMenuViewController
- &gt; 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;
}
答案 5 :(得分:0)
我遇到了同样的问题,但我找不到任何答案。我拼凑起来认为效果很好。
我的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;
}
答案 6 :(得分:0)
iOS8 / 9解决方案 - 只需覆盖preferredContentSize
并在返回表contentSize
之前强制将表格视图布局。
- (CGSize)preferredContentSize {
[self.tableView layoutIfNeeded];
return self.tableView.contentSize;
}
答案 7 :(得分:0)
这应该可以解决问题
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}