Swift 2 - 未定义UICollectionViewFlowLayout的行为,因为:

时间:2015-10-30 14:10:20

标签: ios xcode uicollectionview swift2

我正在使用UICollectionrView来显示视频。一切正常,除了我收到警告说:

  

2015-10-30 14:00:39.893测试[6451:90574]的行为   未定义UICollectionViewFlowLayout,因为:

     

2015-10-30 14:00:39.893 test [6451:90574]项目宽度必须小于   比UICollectionView的宽度减去左边的插图   和正确的值,减去内容的左右值。

     

2015-10-30 14:00:39.893测试[6451:90574]相关   UICollectionViewFlowLayout实例是,它附加到; layer =; contentOffset:{0,0}; contentSize:{320,0}>采集   视图布局:。

     

2015-10-30 14:00:39.894 test [6451:90574]在符号断点处   UICollectionViewFlowLayoutBreakForInvalidSizes来捕获它   调试器。

当我在collectionView中重新加载数据时,会出现此警告。

我试图改变宽度,但警告仍在那里。

我做错了什么?

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
    }

4 个答案:

答案 0 :(得分:4)

重新加载数据后,您的某个元素会超出UICollectionView的大小。我从旋转到纵向旋转时发生了这种警告,我的景观细胞显然不适合纵向UICollectionView。

在重新加载数据之前尝试使当前布局无效:

self.collectionView.collectionViewLayout.invalidateLayout()

如果这不起作用,请尝试将单元格的宽度设置为特定大小(例如300)并从那里开始工作。您可能会发现边缘或边缘占用了您不期望的空间,这就是您的元素大于UICollectionView宽度的原因。 如果是这种情况,请尝试将self.collectionView.contentInset设置为UIEdgeInsetsZero

答案 1 :(得分:1)

我仍在研究此错误," uicollectionviewflowlayout未定义,因为 。"而且我无法找到解决方案,但是(我会告诉你错误的!),但我确实缩小了导致我的问题的原因,contentOffset被设置为错误的值并导致错误:

  

contentOffset:{0,-64};

我正在使用AKPickerView-Swift,我将其转换为Swift 3.当我在故事板上的导航控制器(UINavigationController)中嵌入包含AKPickerView的UIView时,我才会收到错误。

所以简单的 临时 解决方案只是一个解决方法,不要将UIView嵌入到导航控制器中。 :)我稍后会回来并正确地纠正这个问题并找出为什么UICollectionViewFlowLayout正在为导航控制器而不是UIViewController启动。

如果有人有空闲时间在我之前搞清楚,请在此先感谢,非常感谢。

答案 2 :(得分:0)

我清除所有构建并重建项目后,我刚收到此错误。我做了几个其他的更改,在此之前一切都正常“正常”,或者至少它似乎是(可能是由于视图以某种方式缓存 - 不确定)。

无论如何,我也有contentOffset:{0,-64}所以我仔细检查了约束,发现我的约束是在superview(导航控制器)上设置的,而不是视图。我删除了超级视图的约束并重新添加它们,这次是视图。现在contentOffset为{0,0},错误消失了。

答案 3 :(得分:0)

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

您的 UICollectionView 插座名称 collectionview 是否与您在此处指定一样???

如果您在故事板中使用“UICollectionView”,则应在此处使用为类中指定的插座名称。 例如:

let videoCell = myCollectionViewOutletName.dequeueReusableCellWithReuseIdentifier("VideoCell", forIndexPath: indexPath) as MyCollectionViewCellClassName