Я загружаю массив изображений и добавляю их в массив 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
}