Неверная высота представления коллекции при использовании с UIPageControl
Обзор
Есть UICollectionViewCell
, который содержит imageView.
Над видом коллекции есть UIPageControl
Изображение извлекается из фотобиблиотеки и выводится на экран.
Задача
- в первый раз только изображение в виде коллекции превышает верхнюю границу.
-
UIPageControl
высота не определяется при загрузке вида коллекции. -
Я получаю следующее: ошибка:
Ошибка:
the behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
Указывает на Примечание:
- Этот
UICollectionViewController
добавляется в качестве дочернего контроллера кUIStackView
. - вышеуказанная проблема возникает только в первый раз, когда я удаляю из дочернего контроллера вида и добавляю снова, проблема решена.
Вопрос:
- почему изображение выходит за свои границы, несмотря на установленные ограничения и использование подгонки по размеру ?
- Как исправить эту проблему ?
Коллекция Ячейка Просмотра:
class PhotoBrowserCell : UICollectionViewCell {
let imageView = UIImageView()
//MARK: Initializers
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
//MARK: Setup
private func setup() {
setupBaseView()
setupImageView()
}
private func setupBaseView() {
backgroundColor = UIColor.blueColor()
}
private func setupImageView() {
imageView.image = UIImage(named: "PlaceHolder")
imageView.contentMode = .ScaleAspectFit
imageView.clipsToBounds = true
imageView.setContentHuggingPriority(1000, forAxis: .Vertical)
contentView.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
let insets = UIEdgeInsets(top: 10, left: 20, bottom: 30, right: 20)
imageView.leadingAnchor.constraintEqualToAnchor(contentView.leadingAnchor, constant: insets.left).active = true
imageView.trailingAnchor.constraintEqualToAnchor(contentView.trailingAnchor, constant: -insets.right).active = true
imageView.topAnchor.constraintEqualToAnchor(contentView.topAnchor, constant: insets.top).active = true
imageView.bottomAnchor.constraintEqualToAnchor(contentView.bottomAnchor, constant: -insets.bottom).active = true
}
}
Запросить ресурс из библиотеки фотографий:
private func requestAssetSelected() {
let size = imageViewSize
if let assetSelected = assetSelected {
cachingManager.requestImageForAsset(assetSelected,
targetSize: size,
contentMode: .AspectFit,
options: nil) { [weak self] image, info in
//This completion handler might be called multiple times
//First time it provides a temporary image and then shows a full size image
//So ensure it is not a temporary (degraded) image
if let image = image,
isDegraded = info?[PHImageResultIsDegradedKey] as? Int where isDegraded == 0 {
self?.imagesToUpload.append(image)
self?.photoBrowser.reload()
}
}
}
else {
photoBrowser.reload()
}
}
2 ответа:
Первопричина:
- неверный расчет высоты ячейки вида коллекции
- высота ячейки была неправильной, потому что высота представления коллекции была неправильной
- высота представления коллекции была неправильной, потому что
UIPageControl
была равна нулю, в то время как представление коллекции было заполнено. И гораздо позже была вычислена высотаUIPageControl
.UIPageControl
использовал свой собственный размер.Это причина, почему это случилось только в первый раз.
Решение:
Добавить высоту ограничение, так что оно не должно зависеть от его собственного вычисления высоты:
pageControl.heightAnchor.constraintEqualToConstant(38).active = true