Неверная высота представления коллекции при использовании с 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 3

2 ответа:

Первопричина:

  • неверный расчет высоты ячейки вида коллекции
  • высота ячейки была неправильной, потому что высота представления коллекции была неправильной
  • высота представления коллекции была неправильной, потому что UIPageControl была равна нулю, в то время как представление коллекции было заполнено. И гораздо позже была вычислена высота UIPageControl.
  • UIPageControl использовал свой собственный размер.

Это причина, почему это случилось только в первый раз.

Решение:

Добавить высоту ограничение, так что оно не должно зависеть от его собственного вычисления высоты:

pageControl.heightAnchor.constraintEqualToConstant(38).active = true

==> Высота неправильная, поэтому установите ограничение....

Эта ссылка поможет вам решить все ваши проблемы, связанные с высотами и ограничениями
 https://www.youtube.com/watch?v=6KImie4ZMwk

Спасибо, что поделились своими проблемами

.