私はtableViewにカスタムビューを表示しようとしていて、iOSは各ローの高さをUITableViewAutomaticDimension
で計算させようとしています。不幸にも、私のセルのサイズが適切ではありません。高さと幅が固定されたビューのintrinsictContentSizeをオーバーライドする方法はありますか?
は私のカスタムビューは、(私は多くの理由のため、この部分のための自動レイアウトを使用していない、と私はそれを使用する必要はありません)以下のように定義されます。
class MyView : UIView {
var label: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
func setupView() {
label = UILabel()
label.numberOfLines = 0
addSubview(label)
}
func setText(text: String) {
label.text = text
setNeedsLayout()
}
override func layoutSubviews() {
super.layoutSubviews()
label.frame = bounds
invalidateIntrinsicContentSize()
}
override var intrinsicContentSize: CGSize {
guard let text = label.text else { return .zero }
let width = bounds.width
let height = text.heightWithConstrainedWidth(width: width, font: label.font)
return CGSize(width: width, height: height)
}
}
は今、私はこのカスタムビューを包んUITableView
で使用するUITableViewCell
ここで私は、自動レイアウトを使用しています:
class MyCell : UITableViewCell {
var myView: MyView!
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupCell()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupCell()
}
func setupCell() {
myView = MyView()
contentView.addSubview(myView)
myView.snp.makeConstraints { make in
make.edges.equalTo(contentView)
}
}
}
は今、次のViewControllerを使用して、私はその高さが自動的に計算されますかどうかを確認するために、大きな文字でセルを表示:
生憎class ViewController: UIViewController {
var tableView: UITableView!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView = UITableView()
view.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.edges.equalTo(view)
}
tableView.register(MyCell.self, forCellReuseIdentifier: "MyCell")
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 30
tableView.dataSource = self
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell") as! MyCell
cell.myView.setText(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur")
return cell
}
}
、セルの高さがありますMyView
の最後intrinsicContentSize
の呼び出しによって返された高さはここで143であっても、21に等しく、これは、結果のスクリーンショットです:
セルが正しいサイズであります私はMyView
のintrinsictContentSize
は、そのフレームを使用していることを知っていて、それがいけない
が、私は持っているUIViewのサブクラスを設計する方法については考えている。それがリサイクルされている場合(私は画面外のセルをスクロール)固定幅を指定した柔軟な高さ。私はinvalidateIntrinsicContentSize()
をMyViewのlayoutSubviews()
と呼ぶという事実を考えればうまくいくと思った。
このコードを変更して、セルの高さを最初から高く設定するにはどうすればよいですか?
ここでAutolayoutを使用しない理由を詳しく説明できますか?これはまさにそれが素晴らしいことです。 – Ben
私の実際の使用例では、単にUILabelの代わりに何か他のものがあります。私はたくさんのサブビューで構成された非常に豊富なUIViewを持っています。私がこのすべてのために自動レイアウトをしていたなら、私は最終的にはtableViewsでパフォーマンスの問題が発生するでしょう。 – MartinMoizard