Переменная ширина и высота UICollectionViewCell с использованием AutoLayout с раскадровкой (без XIB)

Вот проблема дизайна в приложении, которое использует AutoLayout, UICollectionView и UICollectionViewCell, которое имеет автоматически изменяемые размеры ширины и высоты в зависимости от ограничений AutoLayout и его содержимого (некоторый текст).

Это похоже на список UITableView, каждая ячейка которого имеет собственную ширину и высоту, рассчитанную отдельно для каждой строки в зависимости от ее содержимого. Это больше похоже на iOS сообщения, встроенные в приложение (или WhatsUp).

Очевидно, что приложение должно использоватьfunc collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize.

Проблема в том, что в этом методе приложение не может вызватьfunc collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell ниdequeueReusableCellWithReuseIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath!) -> AnyObject чтобы создать экземпляр ячейки, заполните ее определенным содержимым и вычислите ее ширину и высоту. Попытка сделать это приведет к неопределенным вызовам рекурсии или к другому типу сбоя приложения (по крайней мере, в iOS 8.3).

Ближайший способ исправить эту ситуацию, кажется, скопировать определение ячейки в иерархию представления, чтобы позволить Auto-layout автоматически изменять размер «ячейки» (например, ячейка должна иметь ту же ширину, что и родительское представление коллекции), поэтому приложение может настроить ячейку с определенным содержимым и рассчитать его размер. Это определенно не должно быть единственным способом исправить это из-за дублированных ресурсов.

Все это связано с установкой для UILabel.preferredMaxLayoutWidth некоторого значения, которое должно быть управляемым (не жестко запрограммированным) для Auto-Layout, которое может зависеть от ширины и высоты экрана или, по крайней мере, настраиваться с помощью определения ограничения Auto-layout, чтобы приложение могло получить многострочную UILabel внутреннюю Размер рассчитан.

Я не хотел бы создавать экземпляры ячеек из файла XIB, поскольку раскадровки должны быть сегодняшним отраслевым стандартом, и я хотел бы иметь как можно меньше вмешательства в код.

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

Основной код, который не может быть запущен, указан ниже. Таким образом, только создание экземпляра переменной cellProbe (не используется) приводит к сбою приложения. Без этого вызова приложение работает без сбоев.

var onceToken: dispatch_once_t = 0

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        dispatch_once(&onceToken) {

            let cellProbe = collectionView.dequeueReusableCellWithReuseIdentifier("first", forIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! UICollectionViewCell
        }

        return CGSize(width: 200,height: 50)
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("first", forIndexPath: NSIndexPath(forRow: 0, inSection: 0)) as! UICollectionViewCell

        return cell
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос