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 可调整大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS 中修整可调整大小的 UIView 的一个角?