private func buildCollectionView() {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.sectionInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
layout.minimumLineSpacing = 10
layout.minimumInteritemSpacing = 10
layout.itemSize = CGSize(width: 130, height: 176 )
layout.headerReferenceSize = CGSize(width: 130 , height: 176)
let cvFrame = CGRect(x: 0, y: 0, width: ScreenWidth, height: 176)
collectionView = UICollectionView(frame: cvFrame, collectionViewLayout: layout)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(ProductCell.self, forCellWithReuseIdentifier: "cell")
collectionView.register(TitleHeaderView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header")
collectionView.contentInset = UIEdgeInsets(top: 0, left: 23, bottom: 0, right: 23)
collectionView.showsHorizontalScrollIndicator = false
addSubview(collectionView)
}
UICollectionView的崩溃经常在Debug环境也无法定位,因为Xcode不能提示你正确的崩溃位置在哪?(通常在外部或者main方法)
-
这里有个小的Tip:
Add Exception Breakpoint.png
添加异常断点
-
加了Exception Breakpoint后,得到的信息如下
iOS9 崩溃栈信息 和 汇编代码 .png -
导致崩溃的代码所在:
layout.headerReferenceSize = CGSize(width: 130 , height: 176)
- 原因:
一般UICollectionView的数据由网络请求返回,通常做法是在viewDidLoad()内布局UICollectionView,并且发送网络请求,在网络请求回调时collectionView.reloadData()刷新数据,但是如果你的HeaderView也是在网络请求时返回,而非初始化就有。就会导致这个的崩溃!
即,给定了HeaderView的size,但是并没有返回headerView。ios9中这是个必然会Crash的Bug,在ios10以后的版本已经优化了,不会出现Crash。
- 建议
不要用layout.headerReferenceSize的方法返回HeaderViewSize,而是实现UICollectionViewDelegateFlowLayout这个协议中的方法,这样更灵活!
网友评论