Dynamic UITableView height in UIPopoverController (contentSizeForViewInPopover)?

☆樱花仙子☆ 提交于 2019-12-18 11:13:07

问题


I have an ipad popover that contains an UITableView. After the table is populated, it usually has a few items in it only (4-5), so I'm looking for a way to resize the popover (contentSizeForViewInPopover) to the actual table height (the summed height of all its cells).

So, I do have the height but I'm not sure where to call contentSizeForViewInPopover, I did try to call it in: viewDidAppear and viewWillAppear but with no success since it seems that the table gets populated later and the actual height is only available later.

Any thoughts on this? Thanks!

EDIT: My cells have different heights based on the content they carry, I can't pre-calculate the height with noOfRows * cellHeight.


回答1:


I wanted to change the contentSizeForViewInPopover when my view appeared to match the UITableView and also when I call reloadData as I only call this when removing or adding rows or sections.

The following method calculates the correct height and width and sets the contentSizeForViewInPopover

-(void) reloadViewHeight
{
    float currentTotal = 0;

    //Need to total each section
    for (int i = 0; i < [self.tableView numberOfSections]; i++) 
    {
        CGRect sectionRect = [self.tableView rectForSection:i];
        currentTotal += sectionRect.size.height;
    }

    //Set the contentSizeForViewInPopover
    self.contentSizeForViewInPopover = CGSizeMake(self.tableView.frame.size.width, currentTotal);
}



回答2:


This answer is courtesy of @BenLings from one of the comments above. It's a really clean solution and worth having its own answer:

- (CGSize)contentSizeForViewInPopover {
    // Currently no way to obtain the width dynamically before viewWillAppear.
    CGFloat width = 200.0; 
    CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1];
    CGFloat height = CGRectGetMaxY(rect);
    return (CGSize){width, height};
}



回答3:


Indirect Approach :

Set your custom height for your UITableViewCell using

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [indexPath row] * 40;
}

Find the total number of rows at a point of your program ... Using the numberOfRowsInSection, get the number of rows.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

return [self.yourArray count];

//yourArray is the array with which you are populating the tableView
}

If you have more than one section, multiple it with the result for the number of rows for the effective number of rows.

Now

UITableView Actual Height = Height of UITableViewCell * Total number of rows.

Updated Answer:

If the cell sizes vary, you might have to do do one of these:

  1. Force the text to a smaller size so that all cells have equal height... This can be done using

    'sizeToFit'

  2. You will have to find the height of the text using another function. Something like...

    • (float)calculatedHeight { return textLabel.frame.origin.ytextLabel.frame.size.height5; }
  3. You can look at THIS tutorial for resizing UITableViewCell for variable text.

  4. https://discussions.apple.com/thread/1525150?start=0&tstart=0




回答4:


I did it like this from controller containing a table:

- (void)updatePopoverContentSize {
    CGSize size = { CGFLOAT_MAX, CGFLOAT_MAX };
    size = [self.tableView sizeThatFits: size];
    size.width = 320; // some hard-coded value table doesn't return anything useful for width 
    size.hight = MIN(size.hight, 400); // make sure it is not too big.

    self.contentSizeForViewInPopover = size;
}



回答5:


There's no need to create an artificial hook, this works well (on iOS 7 at least):

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGSize size = self.view.bounds.size;
    size.height = fmaxf(size.height, self.tableView.contentSize.height);
    self.preferredContentSize = size;
}



回答6:


This should do the trick

override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)
 }



回答7:


An alternate way to get the height is to add the UITableViewController's view with an alpha set to 0.0 to the view hierarchy and then get the content size using the contentSize property of the table view. This is possible as the table view is a subclass of the scroll view.

Once you have the content size, set the value of contentSizeForViewInPopover and then push it onto the popover.



来源:https://stackoverflow.com/questions/6312821/dynamic-uitableview-height-in-uipopovercontroller-contentsizeforviewinpopover

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!