首页 > 解决方案 > UIView 和 TableView 可调整大小

问题描述

图 1

图 2

如您所见,我有图 1 中的情节提要,但在模拟器中它看起来像图 2。我怎样才能做到这一点,如果包含一些数据,View 中的这个 tableView 将是完整的。如果没有 - 它将被隐藏。

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

这行没有帮助:

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

------------------part 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()
      }
    
  }

在此处输入图像描述

标签: iosswiftuiviewtableview

解决方案


tableView的功能estimatedRowHeight和设置arowHeight是设置tableView 单元格的高度,而不是设置tableView 本身的高度

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

解决方案 1:您可以使用 UITableView 的以下子类,它会在更改时自动更改,intrinsicContentSize以便contentSizeAutoLayout 可以处理其余部分。在视图控制器中使用这个子类而不是UITableView 。如果您的 tableView 没有单元格,则intrinsicContentSize可以将高度设置为 0。

我建议您在此处阅读有关视图的内在内容大小的更多信息。

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 的需要更改它的常量,或者如果您根据设计规范有其他要求。


推荐阅读