簡體   English   中英

如何使 UITableView 適合內容的大小

[英]How to make UITableView fit to content's size

我在表格視圖單元格中有一個UITableView (我們稱之為 tbl_A),它的高度是動態的並由UITableViewAutomaticDimension設置。 tbl_A 的單元格高度也是動態的,我知道 tbl_A 的數據不會太多。 所以我希望 tbl_A 被禁用滾動並且它的frame.size 等於它的 content size 我試着設置tbl_A的frame.size.height = tbl_A.contentSize.height,不幸的是,高度不對。

順便說一句,我不必使用UITableView來完成這個任務。 我只是想要一種顯示所有數據的方法。 有什么建議?

這是我想要達到的效果: 在此處輸入圖片說明

簡單的 ;)

override var intrinsicContentSize: CGSize {
    return contentSize
}

基於@Emad 的回答,但如果 contentSize 發生變化,那么重要的補充是使內在內容大小無效。

class ContentWrappingTableView: UITableView {

  override var intrinsicContentSize: CGSize {
    return self.contentSize
  }

  override var contentSize: CGSize {
    didSet {
        self.invalidateIntrinsicContentSize()
    }
  }
}

只要滾動被鎖定,您就可以使用以下內容來動態匹配 tableView 的布局。:

    let size = actionsViewController.view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
    actionsViewController.view.frame.size = size
    actionsViewController.preferredContentSize = size

下面介紹了一種讓自動布局為您計算高度並根據您傳入的限制為您提供尺寸的方法。另一種方法可能如下:

    CGFloat leftViewHeight = 0;
    if (self.isExpanded) {
        [self.lineItemLineNumberListTableViewController.tableView layoutIfNeeded];
        UITableView *tableView = self.lineItemLineNumberListTableViewController.tableView;
        CGSize tableViewContentSize = tableView.contentSize;
        leftViewHeight = tableViewContentSize.height;
    }

self.leftViewHeightConstraint.constant = leftViewHeight;

我之前曾使用上述方法來擴展動態調整大小的單元格,其中包含動態子視圖。 這將根據重新加載 tableView 內容后的內容大小配置高度約束,以確保在調整大小之前加載內容。

  1. 對於您的情況,您還可以使用 scrollView。
  2. 在該 scrollView 中添加每個子單元格時通過添加每個子單元格的高度來跟蹤每個子單元格(將變量作為 referenceHeight )
  3. 最后通過計算高度(referenceHeight)設置滾動視圖高度

下面是查找 tableView 內容大小的方法。

- (CGFloat)tableViewHeightOfTable:(UITableView *)table
{
   [table layoutIfNeeded];
   return [table contentSize].height;
}

確保在重新加載表格后調用此方法,如下面的代碼。

[YourTable reloadData];
YourTable.frame.size.height = [self tableViewHeightOfTable:YourTable];

1)添加到您的類引用約束:

var heightC: NSLayoutConstraint!

2)禁用滾動並添加高度約束:

tableView.scrollEnabled = false
heightC = tableView.autoSetDimension(.Height, toSize: 20) // using PureLayout library

3) 覆蓋控制器的 viewDidLayoutSubviews:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    heightC.constant = tableView.contentSize.height
}

並將高度約束“常量”屬性設置為 tableview 內容高度。

4) 在數據刷新時(例如當項目數從 0 變為更多時)只需強制主控制器視圖布局:

view.setNeedsLayout()

在您的情況下 tableview 是最好的解決方案,您可以使用不同的 uitableviewcells 和部分,並且可以在 cellForRowAtIndexPath 中加載它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM