У меня есть UICollectionView с кнопкой для создания ячеек, которые должны появляться в порядке создания (1,2,3,4 в ширину и вправо, как позволяет пространство). Представления текста ограничены гибкой шириной для заполнения ячейки. Размер ячейки зависит от устройства и вращения, чтобы 1, 2, 3 или 4 клеток на строку следующим образом:UICollectionView ячейки не горизонтальные после вращения
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
var size = collectionView.bounds.size // size of collection view
switch size.width
{
case 0...450:
println(size.width)
return CGSize(width: (size.width - 10), height: 145)
case 451..<768:
println(size.width)
return CGSize(width: ((size.width - 10)/2), height: 145)
case 768:
println(size.width)
return CGSize(width: ((size.width - 10)/3), height: 145)
default:
println(size.width)
return CGSize(width: 248, height: 150) // in case there is no size
}
}
С левой и правой вставках установлен в 0, этот вид работ - но только если Я вращаю устройство и добавляю ячейку. Подробнее:
- Имитация iPhone 5, если клетки будут добавлены в портретном они появляются друг под другом, как и предполагалось, но когда устройство вращается, клетки остаются в вертикальном столбе вместо двух ячеек в строке. Если я добавлю ячейку в ландшафт, ячейки затем упорядочивают две ячейки в строке, что является правильным (за исключением того, что нужно добавить ячейку, чтобы это произошло).
- Имитация iPad, если ячейки добавлены в портрет, вместо трех, только две ячейки добавляются в строку с пространством для третьей ячейки между ними.
- Продолжение на iPad, если устройство повернуто, а не четыре, только три ячейки отображаются в каждой строке с пространством между ними. Подобно iPhone, если в ландшафтном режиме добавляется еще одна ячейка, четыре ячейки отображаются в каждой строке, как ожидалось, И если устройство повернуто назад к портрету, три ячейки расположены в строке, что является правильным (за исключением того, что нужно повернуть устройство, добавьте ячейку и поверните ее назад).
Я зову reloadData при добавлении клеток, и если я правильно понимаю, я не должен вызвать перезагрузку при повороте устройства (так называемый автоматически). Почему мне нужно повернуть устройство в альбомную и добавить ячейку для правильного отображения макетов в обеих ориентациях?
В соответствии с запросом, здесь вырезана версия исходного кода для VC. С помощью простого элемента (244 * 150 с текстовым полем 228) и кнопками в футере, это не должно повторять эту проблему:
import UIKit
class CountCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
{
private var reuseIdentifier = "CountCell"
var cells = 1
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
}
@IBAction func addCount(sender: AnyObject)
{
cells += 1
self.collectionView?.reloadData()
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
{
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
return cells
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell
return cell
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView
{
switch kind // the kind of supplimentary view provided by layout
{
case UICollectionElementKindSectionFooter: // section header was selected in storyboard
let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "CountFooterView", forIndexPath: indexPath) as UICollectionReusableView // deque and select correct header
return footerView
default:
assert(false, "Unexpected element kind")
}
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
var size = collectionView.bounds.size
switch size.width
{
case 0...450:
return CGSize(width: (size.width - 20), height: 145)
case 451..<768:
return CGSize(width: ((size.width - 20)/2), height: 145)
case 768:
return CGSize(width: ((size.width - 20)/3), height: 145)
default:
return CGSize(width: 248, height: 150)
}
}
private let sectionInsets = UIEdgeInsets(top: 20.0, left: 0, bottom: 50.0, right: 0.0)
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
{
return sectionInsets
}
}
Не могли бы вы предоставить исходный код и, возможно, объяснить, почему это работает? –
Да, разделы 1 указаны. Я добавил полный код VC в нижней части исходного сообщения. – DrWhat