How To Dynamically change the contentSize of UIPop

2020-02-08 11:01发布

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: enter image description here

8条回答
对你真心纯属浪费
2楼-- · 2020-02-08 11:24

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;
}
查看更多
地球回转人心会变
3楼-- · 2020-02-08 11:28

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楼-- · 2020-02-08 11:30

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楼-- · 2020-02-08 11:32

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.

查看更多
smile是对你的礼貌
6楼-- · 2020-02-08 11:39

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.

查看更多
Bombasti
7楼-- · 2020-02-08 11:39

My app has a menu with sub-menus originating from a popover and embedded in a navigation controller, i.e. something like UINavigationController -> TopMenuViewController -> SubMenuViewControllerxN.

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;
}
查看更多
登录 后发表回答