ios - UIView 和 TableView 可调整大小
问题描述
如您所见,我有图 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()
}
}
解决方案
tableView的功能estimatedRowHeight
和设置arowHeight
是设置tableView 单元格的高度,而不是设置tableView 本身的高度。
当您在 tableView 中插入或删除单元格contentSize
时,tableView 会发生变化。
解决方案 1:您可以使用 UITableView 的以下子类,它会在更改时自动更改,intrinsicContentSize
以便contentSize
AutoLayout 可以处理其余部分。在视图控制器中使用这个子类而不是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 的需要更改它的常量,或者如果您根据设计规范有其他要求。
推荐阅读
- android - 在第三列之后动态添加下一行
- java - 在获取默认 SSL 上下文之前以编程方式设置密钥库
- mongodb - 在 MongoDB 中获取具有 n 个最新评论的帖子
- polymer - polymer 3 starter kit:在此服务器上找不到请求的 URL /view1。但只是在互联网上
- php - 将 php 数组值排序或显示为钟形曲线
- php - Mac中PHP Slim框架中的DB连接错误连接失败:SQLSTATE [HY000] [2002]连接超时
- php - 选项索引的 PHP 查询 apache 值
- javascript - 无法通过对象名称作为字符串访问对象
- java - Spring Boot 应用配置问题
- tensorflow - tensorflow hub的问题:表未初始化