UIView 和 TableView 可调整大小
UIView and TableView resizable
image 1
image 2
如你所见,我有如图 1 中的故事板,但在模拟器中它看起来像图 2 中的那样。
我该怎么做,如果包含一些数据,那就是 View 中的这个 tableView 将被全尺寸化。如果没有 - 它将被隐藏。
此时,如果它包含一些数据,UIview不会改变高度,uitableview几乎不可见。
这几行没有帮助:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableView.automaticDimension
----------------第 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
和设置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 更改它的常量,或者如果您根据设计规范有其他要求。
image 1
image 2
如你所见,我有如图 1 中的故事板,但在模拟器中它看起来像图 2 中的那样。 我该怎么做,如果包含一些数据,那就是 View 中的这个 tableView 将被全尺寸化。如果没有 - 它将被隐藏。
此时,如果它包含一些数据,UIview不会改变高度,uitableview几乎不可见。
这几行没有帮助:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableView.automaticDimension
----------------第 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
和设置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 更改它的常量,或者如果您根据设计规范有其他要求。