How To Dynamically change the contentSize of UIPopoverController?
Solution 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.
Solution 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.
Solution 3
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;
}
Solution 4
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.
Solution 5
This should do the trick
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
Related videos on Youtube
Avi Shukron
Updated on March 02, 2020Comments
-
Avi Shukron about 4 years
I have a
UIViewController
that contains aUITableView
. ThisUIViewController
is being displayed in aUIPopoverController
.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 - thepopoverContentSize
), to adjust according to the number of items in thetableView
Naively, I was thinking that if I'll set the
contentSizeForViewInPopover
inviewDidLoad
after I'm loading thetableView
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 thecontentViewController
- after it's been presented?Appendix:
-
Sulthan over 12 yearsI use the same mechanism. I am adding method
createPopover
to the UIViewControllers which are used as popover contents. The methods creates a popover fromself
and then saves the popover instance for further access. -
Julian Osorio over 10 yearsHello @Avraham Your answer was the one i used and it is working great. I have a question about your solution: why did you set the contentsize of the view in the will appear method and the popover size in the did appear? Why can't it be done in just one of the two methods, because i tried and it didn't work?
-
nh32rg about 10 yearsthis may work better in ViewWillAppear, as it happens before the view appears.
-
Hassy almost 10 yearsif you are using navigationController inside popover and problem is occurring even after setting preferredContentSize. Try [self.parentPopOverController setPopoverContentSize:CGSizeMake(250, 400) animated:YES]; before pushing the UIViewController
-
Avi Shukron over 9 yearsAccepted your answer because it more up-to-date. Thanks!
-
amergin over 9 yearsCheck out @Robert's answer below - nice and clean
-
DenVog over 9 yearsJust a note for others that try Robert's approach. It's very clean and works for this question. It may not work for you however, if you're presenting a UITableView inside a UINavigationController. Avinash's seems to work in that case.
-
Robert over 9 years@DenVog - Good spot. I would still prefer to subclass
UINavigationController
to get its preferred status bar from it's topViewController. Generally I find the approach of declaring what you require better than setting a value as it prevents bugs where 2 different classes can trample over the same property with different values which can lead to different results depending on the order you do things. This is similar to whypreferredStatusBarStyle
was created in iOS 7. -
kvn over 9 yearsYou might also need to [myTableView sizeToFit]; If the table has a default size. And this too should go in the viewWillAppear rather than viewDidAppear method.
-
Satyam about 9 yearsIts deprecated, use "preferredContentSize" from iOS7 and later.
-
pls almost 9 yearsThis was the only solution that worked for me. Setting self.preferredContentSize had no effect.
-
Mojo66 almost 9 yearsOn iOS 8 this has to go into
viewDidAppear
because self.tableView isn't properly laid out yet whenviewWillAppear
is being called, i.e. it's height is zero. -
Mojo66 about 8 yearsthis grows the view but never shrinks it if embedded in a
UINavigationController
hierarchy.