UIView 和 TableView 可调整大小

UIView and TableView resizable

image 1

image 2

如你所见,我有如图 1 中的故事板,但在模拟器中它看起来像图 2 中的那样。 我该怎么做,如果包含一些数据,那就是 View 中的这个 tableView 将被全尺寸化。如果没有 - 它将被隐藏。

此时,如果它包含一些数据,UIview不会改变高度,uitableview几乎不可见。

这几行没有帮助:

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableView.automaticDimension

----------------第 2 部分--------这里是 viewController 的代码-------- -

import UIKit

class DetailsViewController: UIViewController {

    @IBOutlet weak var image: UIImageView!
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var price: UILabel!
    @IBOutlet weak var details: UILabel!
    @IBOutlet weak var buttonAdd: UIButton!
    @IBOutlet weak var variation: AutoSizingTableView!
    
    
    var selectedImage: UIImage?
    var selectedName: String?
    var selectedPrice: String?
    var selectedDetails: String?
    var selectedVariation: NSDictionary?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        variation.delegate = self
        variation.dataSource = self
        variation.invalidateIntrinsicContentSize()
        view.frame.size = variation.intrinsicContentSize
//        view.frame.size = variation.intrinsicContentSize
        variation.reloadData()
//        variation.layoutIfNeeded()
//        variation.frame.size = variation.intrinsicContentSize
//        variation.translatesAutoresizingMaskIntoConstraints = false
        variation.rowHeight = UITableView.automaticDimension
        variation.isScrollEnabled = false
        variation.isHidden = false
        buttonAdd.layer.cornerRadius = 5
        view.layer.cornerRadius = 20
        view.clipsToBounds = true
        image.layer.cornerRadius = 20
        image.image = selectedImage
        name.text = selectedName
        price.text = selectedPrice
        details.text = selectedDetails
        
        

        // Do any additional setup after loading the view.
    }
    
    @IBAction func buttonTapped(_ sender: Any) {
        
        print(selectedVariation?.allKeys.count)
    
    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

extension DetailsViewController: UITableViewDelegate, UITableViewDataSource {
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return selectedVariation?.allKeys.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Variation", for: indexPath)
//        if selectedVariation != nil {
//            for i in selectedVariation {
        cell.textLabel?.text = "test test"
        return cell
        }
  
    
}
class AutoSizingTableView: UITableView {
    
      override var intrinsicContentSize: CGSize {
          self.layoutIfNeeded()
          return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
      }
      
      override var contentSize: CGSize {
          didSet{
              self.invalidateIntrinsicContentSize()
          }
      }
      
      override func reloadData() {
          super.reloadData()
          self.invalidateIntrinsicContentSize()
      }
    
  }

tableView的estimatedRowHeight和设置rowHeight的作用是设置tableView单元格的高度,不是tableView本身的高度.

当您在 tableView 中插入或删除单元格时,tableView 的 contentSize 会发生变化。

解决方案 1: 您可以使用 UITableView 的以下子类,它会自动更改它的 intrinsicContentSize 因为它 contentSize 发生变化,因此 AutoLayout 可以处理其余部分。在您的视图控制器中使用此子类而不是 UITableView。 如果您的 tableView 没有单元格,intrinsicContentSize 高度可以设置为 0。

我建议您阅读有关视图的固有内容大小的更多信息 here

class AutoSizingTableView: UITableView{
    override var intrinsicContentSize: CGSize {
        self.layoutIfNeeded()
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }
    
    override var contentSize: CGSize {
        didSet{
            self.invalidateIntrinsicContentSize()
        }
    }
    
    override func reloadData() {
        super.reloadData()
        self.invalidateIntrinsicContentSize()
    }
}

解决方案 2: 您可以手动添加 高度约束 到您的 tableView 并根据需要根据 contentSize 更改它的常量,或者如果您根据设计规范有其他要求。