2015-10-30 3 views
3

Я использую UICollectionrView для показа видео. Все работает отлично, за исключением того, что я получаю предупреждение:Swift 2 - поведение UICollectionViewFlowLayout не определено, потому что:

2015-10-30 14:00:39.893 test[6451:90574] the behavior of the UICollectionViewFlowLayout is not defined because:

2015-10-30 14:00:39.893 test[6451:90574] the item width must be less than the width of the UICollectionView minus the section insets left and right values, minus the content insets left and right values.

2015-10-30 14:00:39.893 test[6451:90574] The relevant UICollectionViewFlowLayout instance is , and it is attached to ; layer = ; contentOffset: {0, 0}; contentSize: {320, 0}> collection view layout: .

2015-10-30 14:00:39.894 test[6451:90574] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

Это предупреждение появляется только при перезагрузке данных внутри моей коллекцииView.

Я попытался изменить ширину, но там все еще есть предупреждения.

Что я делаю неправильно?

var UserVideosInfo = [[String]]() 

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     NSNotificationCenter.defaultCenter().addObserver(self, 
      selector: "reloadCollectionVideoView:", 
      name: "ReloadCollectionVideoView", 
      object: nil) 
    } 

@objc func reloadCollectionVideoView(notification: NSNotification) { 
     UserVideosInfo = NSUserDefaults.standardUserDefaults().objectForKey("UserVideosJSON") as! [[String]] 
     print(UserVideosInfo) 
     collectionView?.reloadData() 

    } 

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

     if UserVideosInfo.count == 0 { 
      return 0 
     }else{ 
     return UserVideosInfo.count 
     } 

    } 



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

     let videoCell = collectionView.dequeueReusableCellWithReuseIdentifier("VideoCell", forIndexPath: indexPath) as UICollectionViewCell 
     let communityViewController = storyboard?.instantiateViewControllerWithIdentifier("community_id") 

     videoCell.frame.size.width = (communityViewController?.view.frame.size.width)! 
     videoCell.center.x = (communityViewController?.view.center.x)! 

     return videoCell 
    } 
+0

Любое обновление по этому вопросу? –

+0

Это сообщение объясняет, почему это происходит, а также дает решение: https://stackoverflow.com/a/39497850/4218640 – ElectroBuddha

ответ

4

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

Try недействительности текущей схемы перед загрузкой ваших данных:

self.collectionView.collectionViewLayout.invalidateLayout() 

Если это не сработает, попробуйте установить ширину клетки для определенного размера (например, 300) и работать оттуда. Вы можете обнаружить, что есть поля или края, которые занимают пространство, которого вы не ожидали, и поэтому ваши элементы больше, чем ширина вашего UICollectionView. Если это так, то попробуйте установить self.collectionView.contentInset в UIEdgeInsetsZero

+0

У меня была эта проблема, но только на iPhone 5S/iPhone SE и недействительности макет работал для меня, спасибо! – Livio

1

Я до сих пор исследования эту ошибку, «uicollectionviewflowlayout не определен, потому что.» И я не могу понять решение, но (я получу вам ошибку!), Но я точно сузил то, что вызывает мою проблему, значение contentOffset устанавливается с плохими значениями и вызывает ошибку:

contentOffset: {0, -64};

Я использую AKPickerView-Swift, я преобразовал его в Swift 3. Я получаю сообщение об ошибке, когда я вставляю UIView, содержащий AKPickerView, в навигационном контроллере (UINavigationController) на раскадровке.

Так простой временный решение и просто работа вокруг, не встраивать UIView в навигации контроллера. :) Я вернусь позже и исправлю это правильно и выясню, почему UICollectionViewFlowLayout запускается для навигационного контроллера, а не UIViewController.

Если у кого есть свободное время, чтобы понять это, прежде чем я это сделаю, спасибо в Advance, и это очень ценится.

0

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

Во всяком случае, у меня также был contentOffset: {0, -64}, поэтому я дважды проверил ограничения, и я обнаружил, что мои ограничения были установлены на супервизор (контроллер навигации), а не на представление. Я удалил ограничения в супервизор и снова добавил их, на этот раз к представлению. Теперь contentOffset - {0, 0}, и ошибка исчезла.

0
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
let videoCell = collectionView.dequeueReusableCellWithReuseIdentifier("VideoCell", forIndexPath: indexPath) as UICollectionViewCell 
(........) 
} 

Ваш UICollectionView имя розетка CollectionView как вы указали здесь ???

Если вы используете «UICollectionView» в раскадровке, то выходное имя, заданное для этого в классе необходимости использовать здесь. Пример:

пусть videoCell = myCollectionViewOutletName .dequeueReusableCellWithReuseIdentifier ("VideoCell", forIndexPath: indexPath) как MyCollectionViewCellClassName

+0

ПОЖАЛУЙСТА, НЕ ПИШИТЕ С КАПСАМИ –