我正在使用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
}
答案 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