2015-01-22 4 views
1

У меня есть 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, этот вид работ - но только если Я вращаю устройство и добавляю ячейку. Подробнее:

  1. Имитация iPhone 5, если клетки будут добавлены в портретном они появляются друг под другом, как и предполагалось, но когда устройство вращается, клетки остаются в вертикальном столбе вместо двух ячеек в строке. Если я добавлю ячейку в ландшафт, ячейки затем упорядочивают две ячейки в строке, что является правильным (за исключением того, что нужно добавить ячейку, чтобы это произошло).
  2. Имитация iPad, если ячейки добавлены в портрет, вместо трех, только две ячейки добавляются в строку с пространством для третьей ячейки между ними.
  3. Продолжение на iPad, если устройство повернуто, а не четыре, только три ячейки отображаются в каждой строке с пространством между ними. Подобно iPhone, если в ландшафтном режиме добавляется еще одна ячейка, четыре ячейки отображаются в каждой строке, как ожидалось, И если устройство повернуто назад к портрету, три ячейки расположены в строке, что является правильным (за исключением того, что нужно повернуть устройство, добавьте ячейку и поверните ее назад).

layout problems

Я зову 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 
} 

}

ответ

0

настраивает Вам не разделы, как 1, если не установлено это как 1 и повторите попытку.

+0

Не могли бы вы предоставить исходный код и, возможно, объяснить, почему это работает? –

+0

Да, разделы 1 указаны. Я добавил полный код VC в нижней части исходного сообщения. – DrWhat

5

Номер 33 = количество предметов! Вы можете настроить его независимо от общего количества пунктов, чтобы соответствовать более или менее элементам экрана! Например,/(Double (33)) на iPhone 4 будет соответствовать 33 элементам в 4 столбцах и 4 элементах в строке! в iPhone 6 Plus вы увидите, что одни и те же камеры будут масштабироваться с учетом 4 столбцов!

// ...........returning cell size based on device screen size by calculating square roo 

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

      let deviceSize = UIScreen.mainScreen().bounds.size 
      let cellSize = sqrt(Double(deviceSize.width * deviceSize.height)/(Double(33))) 

       return CGSize(width: cellSize , height: cellSize) 

     } 
+0

Hi Ruso, хороший код, чтобы увеличить размер квадратных ячеек, а затем сжимать их, поскольку добавляется больше. Мои ячейки являются постоянным размером для данного устройства и вращения. Моя проблема в том, что настройки размера не кажутся правильными, если я не добавляю ячейки, пока устройство находится в ландшафтном положении! – DrWhat

Смежные вопросы