Переменная ширина и высота 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
}
}