我找遍了整個論壇,嘗試了所有的解決方案,但到目前為止,沒有任何效果。我注意到我的UIImageView覆寫了多個單元格,這意味著該單元格沒有自動調整其高度。以下是我在控制臺中發現的約束條件,它抱怨說:
。"<NSLayoutConstraint:0x600001970f50 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f86a4813dd0.height ==44(active)>"
在我的tableViewController中,我有如下內容
tableView.rowHeight = UITableView.automaticDimension
tableView.improvedRowHeight = 300
這是我的整個單元格,應該自定大小。
import UIKit
class UserConnectionCell。UITableViewCell {
fileprivate let leftImageView。UIImageView = {
let uiImageView = UIImageView()
uiImageView.translatesAutoresizingMaskIntoConstraints = false
return uiImageView
}()
fileprivate let leftLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
fileprivate let middleLabel: UILabel = {
let label = UILabel()
label.numberOfLines = 0 ()
label.font = UIFont(name: "Ariel", size: 10)
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
fileprivate let rightImageView: UIImageView = {
let uiImageView = UIImageView()
uiImageView.translatesAutoresizingMaskIntoConstraints = false
return uiImageView
}()
fileprivate let rightLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
fileprivate let stackViewLeft: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
fileprivate let stackViewRight: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
fileprivate let stackViewMain: UIStackView = {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.alignment = .fill
stackView.spacing = 0
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
//
override init(style: UITableViewCell.CellStyle, reuseIdentifier。String?) {
super.init(style: style, reuseIdentifier:reuseIdentifier)
stackViewLeft.addArrangedSubview(leftImageView)
stackViewLeft.addArrangedSubview(leftLabel)
stackViewRight.addArrangedSubview(rightImageView)
stackViewRight.addArrangedSubview(rightLabel)
stackViewMain.addArrangedSubview(stackViewLeft)
stackViewMain.addArrangedSubview(middleLabel)
stackViewMain.addArrangedSubview(stackViewRight)
contentView.addSubview(stackViewMain)
}
//在試圖布局子視圖時被呼叫。
override func layoutSubviews() {
super.layoutSubviews()
stackViewLeft.addConstraint(NSLayoutConstraint(item: leftImageView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: 100)
stackViewLeft.addConstraint(NSLayoutConstraint(item: leftImageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 100)
stackViewRight.addConstraint(NSLayoutConstraint(item: rightImageView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 100)
stackViewRight.addConstraint(NSLayoutConstraint(item: rightImageView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: 100)
NSLayoutConstraint.activated(
[stackViewMain.topAnchor.constraint(equalTo: contentView.topAnchor,constant: 0) 。
stackViewMain.leadingAnchor.constraint(equalTo: contentView.leadingAnchor,constant: 0)。)
stackViewMain.trailingAnchor.constraint(equalTo: contentView.trailingAnchor,constant: 0)。)
stackViewMain.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented"/span>)
}
var viewModel : UserConnectionViewModel? {
didSet {
//將此移至視圖模型。
if let profileUrl = viewModel? .leftImageUrl {
leftImageView.loadImageFromURL(url: profileUrl)
} else {
leftImageView.image = UIImage(named: "defaultprofile"/span>)
}
if let profileUrl = viewModel? /span>.rightImageUrl {
rightImageView.loadImageFromURL(url: profileUrl)
} else {
rightImageView.image = UIImage(named: "defaultprofile"/span>)
}
leftLabel.text = viewModel?.leftLabel
middleLabel.text = viewModel?.mediumLabel
rightLabel.text = viewModel?.rightlabel
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.contentView.autoresizingMask = .flexibleHeight
///初始化代碼。
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
//為選定狀態配置視圖。
}
}
對于單元格不能自定大小的原因有什么想法嗎?
uj5u.com熱心網友回復:
首先,單元格的contentView是一個 "特殊 "的視圖,其屬性與表視圖的操作密不可分。
因此,不要這樣做:
self.contentView.autoresizingMask = .flexibleHeight
第二,layoutSubviews()在一個單元格/視圖的生命周期中可以(而且通常是)多次呼叫。你的約束設定應該在init中完成:
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String? ) {
super.init(style: style, reuseIdentifier:reuseIdentifier)
stackViewLeft.addArrangedSubview(leftImageView)
stackViewLeft.addArrangedSubview(leftLabel)
stackViewRight.addArrangedSubview(rightImageView)
stackViewRight.addArrangedSubview(rightLabel)
stackViewMain.addArrangedSubview(stackViewLeft)
stackViewMain.addArrangedSubview(midLabel)
stackViewMain.addArrangedSubview(stackViewRight)
contentView.addSubview(stackViewMain)
NSLayoutConstraint.activated([
//約束主堆疊視圖到contentView的所有4邊。
stackViewMain.topAnchor.constraint(equalTo: contentView.topAnchor,constant: 0) 。
stackViewMain.leadingAnchor.constraint(equalTo: contentView.leadingAnchor,constant: 0)。)
stackViewMain.trailingAnchor.constraint(equalTo: contentView.trailingAnchor,constant: 0)。)
stackViewMain.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0)。)
//constraint left image view Width: 100-pts,。
//高度等于寬度(1:1比例)。
leftImageView.widthAnchor.constraint(equalToConstant: 100.0)。
leftImageView.heightAnchor.constraint(equalTo: leftImageView.widthAnchor)。
// constrain right image view Width: 100-pts,.
//高度等于寬度(1:1比例)。
rightImageView.widthAnchor.constraint(equalToConstant: 100.0)。
rightImageView.heightAnchor.constraint(equalTo: rightImageView.widthAnchor)。
])
}
所以...用上面的代碼替換你的init,并且完全洗掉你的awakeFromNib()和layoutSubviews()函式。
你應該得到這樣的結果:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311726.html
標籤:
上一篇:如何在segmentedController中保存tableView中選中的行的狀態?
下一篇:分隔線UITableView

