【问题标题】:UIView and TableView resizableUIView 和 TableView 可调整大小
【发布时间】: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()
      }
    
  }

【问题讨论】:

    标签: ios swift uiview tableview


    【解决方案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 中调用。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多