可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a UIViewController
that contains a UITableView
.
This UIViewController
is being displayed in a UIPopoverController
.
Now, the things is that the number of items in the tableView
is not constant, and I want the size of the popover (that is - the popoverContentSize
), to adjust according to the number of items in the tableView
Naively, I was thinking that if I'll set the contentSizeForViewInPopover
in viewDidLoad
after I'm loading the tableView
with all the items - It'll do it.
It didn't.
So the make it short, my question is: How can I change the popoverContentSize
directly from the contentViewController
- after it's been presented?
Appendix:
回答1:
I might be very late to answer but for new user from iOS 7
please use the following line in your UIViewController i,e contentViewController of your UIPopOverViewConotroller
-(void) viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
self.preferredContentSize=myTableView.contentSize;
}
Hope this will help for iOS 7 user.
回答2:
Well, In the end i did something that I'm not sure if it's the right thing to do, but it is working.
I added a reference in my contentViewController to the popoverController:
@property (nonatomic , assign) UIPopoverController *popoverControllerContainer;
Then, I added the resizing code to viewWillAppear and 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];
}
So, keeping a reference to the popover is kind of hack-ish, so I'm open to hear better ideas.
回答3:
A UIViewController class has the property
self.contentSizeForViewInPopover
which will resize the pop over w/out needing to adding a reference to it.
And to expand on a solution, i used the method rectForSection: to get the size of the section (mine only has 1 section, so easy enough to get) and then added the height of the navigation bar (it seems to be 20). so i'm able to create the popover the size of the finished table view:
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;
might prove more difficult with multiple sections, i didn't try it. should just be able to sum up the section heights, but there might be some spacing issues that i don't know about.
回答4:
For iOS 7 or above.
- (CGSize)preferredContentSize {
return CGSizeMake(320, 550);
}
If you are a child of a container, re-direct the content size to yourself. E.g. In a UINavigationController
subclass:
- (CGSize)preferredContentSize {
return self.topViewController.preferredContentSize;
}
回答5:
My app has a menu with sub-menus originating from a popover and embedded in a navigation controller, i.e. something like UINavigationController
-> TopMenuViewController
-> SubMenuViewController
xN.
None of the above solutions worked for me.
My solution: In my root menu view controller class, from which all other menu view controllers inherit, add the following code:
- (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:
I was having this same problem and none of the answers I found worked. I cobbled together that I think works well.
I have an array in my initWithCoder that holds my values. I simply run this code:
- (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 solution - just override preferredContentSize
and force the table view to layout prior to returning it's contentSize
.
- (CGSize)preferredContentSize {
[self.tableView layoutIfNeeded];
return self.tableView.contentSize;
}
回答8:
This should do the trick
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}