Автоматическое изменение высоты UICollectionViewCell с использованием UICollectionViewFlowLayout.automaticSize, чтобы соответствовать высоте загружаемого изображения? - PullRequest
0 голосов
/ 31 января 2020

Я загружаю массив изображений и добавляю их в массив imagesArray, который используется в качестве данных для заполнения моих ячеек в представлении collectionView фотографий. Все работает, за исключением того, что я не могу правильно настроить размеры ячеек collectionView. Загружаемые изображения имеют различный формат rat ios, и я хочу, чтобы высота ячейки изменялась соответственно с фиксированной шириной (шириной экрана) при сохранении соотношения сторон.

С помощью приведенного ниже кода изображения отображаются корректно (правильная ширина и пропорции), однако в ячейке есть тонны пространства (например, сотни точек) над и под изображением.

У меня есть другой collectionView, который успешно автоматически изменяет свою высоту (сохраняя фиксированную ширину) для содержимого в нем, используя containerView в ячейке, прикрепленной ко всем краям, и все содержимое, помещенное в containerView, затем используя .automaticSize для оцененного элемента в размере моего макета потока. Я пытаюсь повторить это с моей коллекцией фотографий ViewView. В других моих ячейках collectionView я предполагаю, что автоматическое изменение размера работает нормально, потому что все компоненты в пределах имеют фиксированные высоты и ограничения для ячейки, в то время как в моих ячейках collectionView фотографий я (преднамеренно) не устанавливаю высоту imageView, потому что я хочу, чтобы это было динамично c, и это все испортило.

Есть ли способ сделать то, что я хочу, используя .automaticSize для оцененного элемента размера в моем макете потока?

** РЕДАКТИРОВАТЬ: **

Я добился некоторого прогресса, это вроде работает, но я получаю сбои и сотни строк ошибок, напечатанных в консоли. Я реализовал функцию «updateImageViewSize», которая вызывается после Я установил изображение в функции «set (image: UIImage)» в фотоэлементе. Вот функция:

func updateImageViewSize(imageView: UIImageView) {
    guard let image = imageView.image else { return }
    let aspectRatio = image.size.height / image.size.width
    imageView.heightAnchor.constraint(equalTo: imageView.widthAnchor, multiplier: aspectRatio).isActive = true
}

Любые идеи, почему я получаю сбои и так много ошибок макета?

(оригинальный пост продолжается ниже)

Соответствующий код :

UICollectionViewFlowLayout:

static func createPhotosFlowLayout(in view: UIView) -> UICollectionViewFlowLayout {
    let flowLayout = UICollectionViewFlowLayout()
    flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    return flowLayout
}

ViewController:

func configureCollectionView() {
    collectionView = UICollectionView(frame: .zero, collectionViewLayout: createPhotosFlowLayout(in: view))
    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.register(PhotoCell.self, forCellWithReuseIdentifier: PhotoCell.reuseID)

    view.addSubview(collectionView)
    collectionView.anchor(top: view.topAnchor, left: view.leftAnchor, right: view.rightAnchor, bottom: view.bottomAnchor, paddingTop: 0, paddingLeft: 0, paddingRight: 0, paddingBottom: 0, width: 0, height: 0)
}

PhotoCell:

func set(image: UIImage) {
    self.imageView.image = image
    updateImageViewSize(imageView: self.imageView) // new, added from edit
}


func configureContainerView() {
    containerView.backgroundColor = .systemRed
    addSubview(containerView)
    containerView.anchor(top: topAnchor, left: leftAnchor, right: rightAnchor, bottom: bottomAnchor, paddingTop: 0, paddingLeft: 0, paddingRight: 0, paddingBottom: 0, width: UIScreen.main.bounds.size.width, height: 0)
}


func configureImageView() {
    imageView.contentMode = .scaleAspectFit

    containerView.addSubview(imageView)
    imageView.anchor(top: containerView.topAnchor, left: containerView.leftAnchor, right: containerView.rightAnchor, bottom: containerView.bottomAnchor, paddingTop: 0, paddingLeft: 0, paddingRight: 0, paddingBottom: 0, width: 0, height: 0)
}

UICollectionViewDataSource:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return myImages.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PhotoCell.reuseID, for: indexPath) as! PhotoCell
    cell.set(image: myImages[indexPath.item])
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...