Автоматическое макетирование с помощью пользовательского UITableViewCell без раскадровки программно (Swift 5) - PullRequest
0 голосов
/ 06 апреля 2020

У меня возникли некоторые трудности с автоматическим размещением в пределах UITableViewCell. Я довольно новичок в Swift, поэтому любая помощь будет оценена. Я пытаюсь создать пользовательскую ячейку, в которой ячейка содержит три объекта UIImageView, расположенных как показано.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  +----------------------------------+   +-----------------------------------+
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |               view2               |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   +-----------------------------------+
  |               view1              |
  |                                  |   +-----------------------------------+
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |               view3               |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  +----------------------------------+   +-----------------------------------+
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Но на самом деле я получаю следующее, где view1, view2 и view3 правильно выровнены, но они не привязываются к contentView ячейки внизу, и поскольку это ячейка с изменяемым размером и ничего не прикреплено к нижней части, она игнорирует содержимое и фиксирует себя на предполагаемой 44 высокой расчетной высоте ячейки.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  +----------------------------------+   +-----------------------------------+
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  |                                  |   |               view2               |
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  |                                  |   +-----------------------------------+
  |               view1              |
  |                                  |   +-----------------------------------+
  |                                  |   |                                   |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |               view3               |
  |                                  |   |                                   |
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  |                                  |   |                                   |
  |                                  |   |                                   |
  |                                  |   |                                   |
  +----------------------------------+   +-----------------------------------+
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Приведенный ниже код включает метод .anchor в качестве расширения UIView для более эффективной обработки якорей, но в противном случае вы получите точку.

import UIKit

class GalleryTableCell: UITableViewCell, SelfConfiguringCell {

    lazy var view1: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    lazy var view2: UIView = {
        let view = UIView()
        view.backgroundColor = .blue
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    lazy var view3: UIView = {
        let view = UIView()
        view.backgroundColor = .green
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    static var identifier: String {
        return String(describing: self)
    }

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupCellView()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupCellView() {
        backgroundColor = .systemBackground
        [view1, view2, view3].forEach { ( addSubview($0) ) }

        view1.anchor(top: topAnchor, bottom: nil, leading: nil, trailing: trailingAnchor, with: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 6), size: CGSize(width: 175, height: 0))

        view1.heightAnchor.constraint(equalTo: view1.widthAnchor).isActive = true

        view2.anchor(top: view1.bottomAnchor, bottom: nil, leading: nil, trailing: view1.trailingAnchor, with: UIEdgeInsets(top: 6, left: 0, bottom: 0, right: 0))
        view2.resize(to: view1)

        view3.anchor(top: topAnchor, bottom: view2.bottomAnchor, leading: leadingAnchor, trailing: view1.leadingAnchor, with: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 6))

    }

    func configure(with app: Any) {}

}

Поскольку я использую автоматическое измерение для автоматического изменения размера ячейки выше требуется ограничить представление в ячейке, в противном случае размер ячейки будет соответствовать предполагаемой высоте (44), и три вида расширятся, охватывая несколько ячеек под ней.

Помогите понять, что я делаю неправильно будет высоко ценится.

1 Ответ

0 голосов
/ 07 апреля 2020

Чтобы получить автоматическое c определение размера, вам нужно сделать 3 вещи:

  1. Установить estimatedRowHeight в соответствии с вашим размером. Оно не должно быть точным, но оно помогает с производительностью.
  2. Установите rowHeight на UITableView.automaticDimension.
  3. Установите top & bottom ограничения view а также ограничение height.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...