UIView 和 TableView 可调整大小

Posted

技术标签:

【中文标题】UIView 和 TableView 可调整大小【英文标题】:UIView and TableView resizable 【发布时间】:2020-07-04 14:35:07 【问题描述】:

image 1

image 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()
      
    
  

【问题讨论】:

【参考方案1】:

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

【讨论】:

我认为您给出了正确的建议,但我学习 swift 仅几个月,不完全确定如何正确使用它。起初我写了这行代码。将情节提要中的 tableview 类更改为 AutoSizingTableView 类。制作了一个@IBOutlet 弱变量表视图:AutoSizingTableView!在我的视图控制器中。以及我究竟如何调用自动调整大小的方法? 需要你的帮助)我卡在那里,但应该移动 只要将您的 tableView 作为 AutoSizingTableView 的一个实例就足够了,前提是没有其他限制/修改其高度的约束。换班后得到什么结果? 我的图像视图只有一个高度限制。否则它的所有图像都有不同的大小。没有图像的高度限制,我可以看到所有数据只是因为它使照片更小,但视图的大小是相同的 如果您可以分享一个示例项目,以便我检查约束条件,那就太好了。如果不查看您为视图设置的约束,我将无法对此进行调试。另外,tableView 上的invalidateIntrinsicContentSize 方法不需要在viewDidLoad 中调用。

以上是关于UIView 和 TableView 可调整大小的主要内容,如果未能解决你的问题,请参考以下文章

可调整大小的居中圆形 UIView

如何在 IOS 中修整可调整大小的 UIView 的一个角?

使 QML TreeView 可调整大小

为啥手动调整 Visjs 时间线图的高度(可调整大小)不起作用?

在可拖动和可调整大小的 Jquery div 中删除

如何在使用 jQuery(可拖动和可调整大小)拖动光标时调整图像大小