UITableView ограничения на автоматическое расположение ячеек - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть две проблемы, но я надеюсь, что они связаны!У меня есть следующий шаблон UITableView, который я пытаюсь настроить: -

App Layout

  • Белая область - фон таблицы
  • Фиолетовый - это заголовок категории (он может использовать столько же или столько же, сколько фиолетовая область)
  • Красный - кнопка «Просмотреть все», которую следует закрепить вправо.
  • Зеленый - горизонтальныйUICollectionView, но каждая строка таблицы может иметь различную высоту представления коллекции (обратите внимание на разницу между строками 1 и 2; строка 3 обрезана внизу экрана)
  • Розовая линия - это разделитель строк

Итак, я создал следующий класс

import UIKit

class CategoryRowCell: UITableViewCell {
    let gradient = GradientView()
    let titleLbl = UILabel()
    let viewAllBtn = UIButton(type: .custom)
    let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: UICollectionViewFlowLayout())

    override func awakeFromNib() {
        super.awakeFromNib()
    }

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

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func prepareForReuse() {
        titleLbl.text = ""
        viewAllBtn.removeTarget(nil, action: nil, for: .allEvents)
        collectionView.setContentOffset(.zero, animated: false)
    }

    func setupCategoryViews() {
        //Title
        titleLbl.textColor = .white
        titleLbl.numberOfLines = 1
        titleLbl.textAlignment = .left
        titleLbl.translatesAutoresizingMaskIntoConstraints = false
        addSubview(titleLbl)

        //View All
        viewAllBtn.titleLabel?.textColor = .white
        viewAllBtn.setTitle("View All", for: .normal)
        viewAllBtn.translatesAutoresizingMaskIntoConstraints = false
        addSubview(viewAllBtn)

        //Collection View
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.showsVerticalScrollIndicator = false
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.bounces = false
        collectionView.collectionViewLayout = layout
        collectionView.isScrollEnabled = true
        collectionView.backgroundColor = .clear
        addSubview(collectionView)


        let titleConstraints = [
            titleLbl.topAnchor.constraint(equalTo: topAnchor, constant: 16),
            titleLbl.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
            titleLbl.trailingAnchor.constraint(equalTo: viewAllBtn.leadingAnchor)
        ]
        NSLayoutConstraint.activate(titleConstraints)

        let viewAllBtnConstraints = [
            viewAllBtn.leadingAnchor.constraint(equalTo: titleLbl.trailingAnchor, constant: 16),
            viewAllBtn.centerYAnchor.constraint(equalTo: titleLbl.centerYAnchor)
        ]
        NSLayoutConstraint.activate(viewAllBtnConstraints)

        let collectionViewConstraints = [
            collectionView.topAnchor.constraint(equalTo: titleLbl.bottomAnchor, constant: 16),
            collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            collectionView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -16),
            collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            collectionView.heightAnchor.constraint(equalToConstant: 150)
        ]
        NSLayoutConstraint.activate(collectionViewConstraints)
    }

    func setCollectionViewDataSourceDelegate<D: UICollectionViewDelegate & UICollectionViewDataSource>(_ dataSourceDelegate: D, forRow row: Int) {
        collectionView.delegate = dataSourceDelegate
        collectionView.dataSource = dataSourceDelegate
        collectionView.tag = row
        collectionView.reloadData()
    }
}

Хорошо, поэтому у меня есть следующие проблемы: -

Красный вид всей области не прикреплен ксправа от экрана.Вместо этого он прикреплен к правому краю фиолетового вида (без зазора).Я ожидаю, что фиолетовая текстовая область будет иметь такую ​​же ширину (без указания ширины или процента), даже если длина текста короткая.

Что бы я ни делал, чтобы попытаться получить эту работу, я получаю конфликты ограничений, и журналымне не очень понятно.

Вторая проблема (ну, не такая уж большая проблема) заключалась в том, чтобы узнать, есть ли что-то конкретное, что мне, возможно, нужно рассмотреть или сделать для представления таблицы и сбора.чтобы настроить их высоту в соответствии с его содержанием !?Вы увидите, что в данный момент я использую фиксированное ограничение по высоте, а это не то, что нужно.

collectionView.heightAnchor.constraint(equalToConstant: 150)

Вот пример того, что я сейчас вижу WrongLayout

1 Ответ

0 голосов
/ 01 марта 2019

Я понял это.Мне пришлось изменить titleConstraints и viewAllBtnConstraints на следующие

    let titleConstraints = [
        titleLbl.topAnchor.constraint(equalTo: topAnchor, constant: 16),
        titleLbl.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16)
    ]
    NSLayoutConstraint.activate(titleConstraints)

    let viewAllBtnConstraints = [
        viewAllBtn.leadingAnchor.constraint(equalTo: titleLbl.trailingAnchor, constant: 16),
        viewAllBtn.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16),
        viewAllBtn.centerYAnchor.constraint(equalTo: titleLbl.centerYAnchor)
    ]
    NSLayoutConstraint.activate(viewAllBtnConstraints)
...