почему invalidateLayout не запускает sizeForItemAtIndexPath в UICollectionView? (код прилагается)

Проблема заключается в том, что количество столбцов в коллекцииView не будет оставаться на 7 (желаемая сумма) при ротации. Какое изменение кода требуется для исправления этого?

Кажется, invalidateLayout из пользовательского UICollectionViewFlowLayout НЕ запускает метод sizeForItemAtIndexPath в коллекцииView? Есть идеи? Я просто хочу, чтобы изменение размера столбца происходило через sizeForItemAtIndexPath при вращении.

ПРИМЕЧАНИЕ. Я не использую раскадровку здесь, скорее у меня есть собственное представление, в котором я бросаю в collectionView и ссылаюсь на свои собственные классы collectionView.

Следующий код работает отлично, однако при ротации он не сохраняет количество столбцов до 7, как должно. При запуске кода изначально вывод консоли показывает:

GCCalendar - init coder GCCalendar - commonInit GCCalendarLayout:invalidateLayout GCCalendarLayout:invalidateLayout ViewController:viewWillLayoutSubviews GCCalendarLayout:invalidateLayout GCCalendarLayout:prepareLayout sizeForItemAtIndexPath . . sizeForItemAtIndexPath minimumInteritemSpacingForSectionAtIndex minimumLineSpacingForSectionAtIndex GCCalendarLayout:collectionViewContentSize GCCalendarLayout:layoutAttributesForElementsInRect GCCalendarLayout:collectionViewContentSize ViewController:viewWillLayoutSubviews GCCalendarCell:drawRect . . GCCalendarCell:drawRect 

Однако при повороте экрана я вижу следующее:

 ViewController:viewWillLayoutSubviews GCCalendarLayout:shouldInvalidateLayoutForBoundsChange GCCalendarLayout:invalidateLayout GCCalendarLayout:prepareLayout GCCalendarLayout:collectionViewContentSize GCCalendarLayout:layoutAttributesForElementsInRect GCCalendarLayout:collectionViewContentSize 

Таким образом, проблема "sizeForItemAtIndexPath" никогда не вызывалась ????

Код выхода на поворот

Примечание: «sizeForItemAtIndexPath» не запускается, хотя «invalidateLayout»

ViewController: viewWillLayoutSubviews GCCalendarLayout: shouldInvalidateLayoutForBoundsChange GCCalendarLayout: invalidateLayout

** Мой пользовательский вид, в котором находится коллекция View **

 import UIKit @IBDesignable class GCCalendarView: UIView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } override init(frame: CGRect) { super.init(frame: frame) commonInit() } // Private private func commonInit() { if self.subviews.count == 0 { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "GCCalendarView", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView view.frame = bounds view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] addSubview(view) } } } 

Просмотр пользовательской коллекции

 import UIKit class GCCalendar : UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate { // Init --------------- func commonInit(coder aDecoder: NSCoder) { print("GCCalendar - commonInit") self.registerClass(GCCalendarCell.self, forCellWithReuseIdentifier: "GCCalendarCell") self.dataSource = self self.delegate = self let layout : GCCalendarLayout = GCCalendarLayout(coder: aDecoder)! self.setCollectionViewLayout(layout, animated: false) self.backgroundColor = UIColor.whiteColor() } required init?(coder aDecoder: NSCoder) { print("GCCalendar - init coder") super.init(coder: aDecoder) commonInit(coder: aDecoder) } // UICollectionViewDelegateFlowLayout ------------ func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { print("sizeForItemAtIndexPath") let w : CGFloat = floor(self.frame.size.width/7) return CGSize(width: w, height: w) } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { print("minimumInteritemSpacingForSectionAtIndex") return 0.0 } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { print("minimumLineSpacingForSectionAtIndex") return 0.0 } // UICollectionViewDataSource ------------------- func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 21 } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("GCCalendarCell", forIndexPath: indexPath) as? GCCalendarCell return cell! } } 

** Пользовательская ячейка CollectionView **

 import UIKit class GCCalendarCell: UICollectionViewCell { @IBOutlet weak var title : UITextField! @IBOutlet weak var date: UILabel! required init?(coder aDecoder: NSCoder) { print("GCCalendarCell - init:coder") super.init(coder: aDecoder) commonInit() } override init(frame: CGRect) { super.init(frame: frame) commonInit() } override func drawRect(rect: CGRect) { print("GCCalendarCell:drawRect") self.layer.borderWidth = 1 self.layer.borderColor = UIColor.grayColor().CGColor } // Private private func commonInit() { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "GCCalendarCell", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView view.frame = bounds view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] addSubview(view) } } 

Пользовательский макет

 import UIKit class GCCalendarLayout : UICollectionViewFlowLayout { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { print("GCCalendarLayout:shouldInvalidateLayoutForBoundsChange") return true } override func invalidateLayout() { print("GCCalendarLayout:invalidateLayout") super.invalidateLayout() } override func prepareForCollectionViewUpdates(updateItems: [UICollectionViewUpdateItem]) { print("GCCalendarLayout:prepareForCollectionViewUpdates") super.prepareForCollectionViewUpdates(updateItems) } override func finalizeCollectionViewUpdates() { print("GCCalendarLayout:finalizeCollectionViewUpdates") super.finalizeCollectionViewUpdates() } } 

EDIT: попробуйте это в вашем viewController:

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { (self.collectionview.collectionViewLayout).setItemSize(CGSizeMake(floor(size.width / 7), floor(size.width / 7))) self.collectionview.collectionViewLayout.invalidateLayout() } 

если вы используете раскадровку. Установите раскладку CollectionviewFlowLayout Class In в ящике Bellow

это FlowLayout

Имя класса

Решение Kujey может быть применено к UIView без доступа к UIViewController :

 func traitCollectionDidChange(previousTraitCollection : UITraitCollection) { super.traitCollectionDidChange(previousTraitCollection) self.collectionView.collectionViewLayout.invalidateLayout() } 
  • Невозможно изменить цвет фона в UICollectionView (iOS)
  • Идентификация блоков с оценкойItemSize в макете Flow View Collection - EXC_ARITHMETIC
  • 'Нет экземпляра UICollectionViewLayoutAttributes для ошибки -layoutAttributesForItemAtIndexPath с использованием пользовательского UICollectionViewLayout
  • Подкласс UICollectionViewFlowLayout заставляет некоторые ячейки не появляться
  • CollectionView + UIKit Динамика сбой на performBatchUpdates:
  • Сбой при удалении ячейки коллекции в результате «UICollectionViewLayoutAttributes»
  • Ошибка подтверждения в UICollectionViewData validateLayoutInRect на ios7
  • Переупорядочить ячейки UICollectionView
  • Выравнивание по левому краю ячеек в UICollectionView
  • UICollectionViewLayout для вкладки Google Chrome (приложение для iOS).
  • Как добавить UICollectionViews в Universal Storyboard и различные flowLayout для iPhone и iPad
  • Давайте будем гением компьютера.