9

我有一個包含UITableView的ipad popover。表填充完後,它通常只包含一些項目(4-5),所以我正在尋找一種方法將彈出窗口(contentSizeForViewInPopover)調整爲實際表格高度(所有單元格的總計高度) 。UIPopoverController(contentSizeForViewInPopover)中的動態UITableView高度?

所以,我有高度,但我不知道在哪裏打電話contentSizeForViewInPopover,我曾嘗試調用它:viewDidAppearviewWillAppear,但沒有成功,因爲它似乎是表被填充後,實際高度僅在以後可用。

對此有何看法?謝謝!

編輯:我的細胞根據它們攜帶的內容有不同的高度,我不能用noOfRows * cellHeight預先計算高度。

回答

1

間接的方法:使用

設置你的UITableViewCell的自定義高度

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

找到行的程序點總數...使用numberOfRowsInSection,得到數的行。

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

return [self.yourArray count]; 

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

如果您有多個節,請將其與有效行數的行數結果相乘。

現在

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

更新答:

如果單元格大小各不相同,你可能需要做執行下列操作之一:

  1. 強制文本到一個較小的使所有細胞具有相同的高度...這可以使用

    'sizeToFit'

  2. 您將不得不使用另一個函數來查找文本的高度。喜歡的東西...

    • (浮動)calculatedHeight { 回報textLabel.frame.origin.ytextLabel.frame.size.height5; }
  3. 你可以看一下THIS教程調整UITableViewCell的可變文本。

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

+0

不幸的是,我的單元格根據它們攜帶的內容而具有不同的高度,我無法用'noOfRows * cellHeight'預先計算高度。 – 2011-06-10 23:05:39

+0

檢查更新的答案。 – Legolas 2011-06-10 23:15:26

0

的另一種方法來獲得高度是與alpha集添加UITableViewController的視圖0.0到視圖層級結構,然後使用的所述contentSize屬性獲取內容大小表視圖。這是可能的,因爲表格視圖是滾動視圖的子類。

獲得內容大小後,將值設置爲contentSizeForViewInPopover,然後將其推送到彈出窗口。

+0

好吧,這很有道理,但我應該在哪裏調用'contentSize'?它必須在表填充後​​調用(在'tableView:cellForRowAtIndexPath:'之後又名') – 2011-06-10 23:29:31

+0

在將不可見表視圖添加到視圖層次結構後獲取它。它應該是'addSubview:',接着是'tableView.contentSize'。 – 2011-06-10 23:31:00

18

我想更改contentSizeForViewInPopover,當我的視圖與UITableView相匹配時,以及我撥打reloadData時,我只在刪除或添加行或部分時調用此選項。

下面的方法計算正確的高度和寬度,並設置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); 
} 
+4

Squeeeeeeeeeee! – 2012-02-15 14:03:35

+5

您可以通過執行'CGRectGetMaxY([self.tableView rectForSection:[self.tableView numberOfSections] - 1])簡化計算'' - 您只需要知道最後一部分的底部邊緣 – 2012-07-06 13:38:53

+0

感謝Ben Lings,那確實很多簡單。 – k107 2013-01-19 01:08:56

11

這個答案是從上述評論中的一個的@BenLings禮貌。這是一個非常乾淨的解決方案和值得擁有它自己的答案:

- (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}; 
} 
+1

這對我很好,我還必須包含表頭或頁腳的高度(如果存在)。 – tapi 2013-09-05 16:07:14

+0

我應該在哪裏調用這個方法? – Isuru 2015-02-04 15:14:47

1

我沒有像這樣從控制器包含一個表:

- (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; 
} 
1

有沒有必要建立一個人工鉤,這個效果很好(在iOS 7至少):

- (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; 
} 
0

這應該做的伎倆

override func viewWillLayoutSubviews() { 
     super.viewWillLayoutSubviews() 

     self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height) 
} 
相關問題