今天測試提了一個bug赁咙,說點擊下一題的時候,界面沒有刷新題目,還在老題目那里彼水,我說不可能啊崔拥,我這邊好好的,后來一看凤覆,她的機子是iOS 14的链瓦,我說那我適配一下好了。
我的界面層級是一個大的collectionView
占據(jù)頁面盯桦,里面的cell的大小跟collectionview
的bounds
一樣大慈俯。
下面是我的collectionview創(chuàng)建代碼
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: SCREEN_WIDTH, height: SCREEN_HEIGHT - NavigationContentTop - SafeAreaInsetsConstantForDeviceWithNotch.bottom - 60)
layout.sectionInset = UIEdgeInsets.zero
layout.scrollDirection = .horizontal
let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
collectionView.xh_register(XHOEWebParentCollectionViewCell.self)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.backgroundColor = .clear
collectionView.showsHorizontalScrollIndicator = false
collectionView.isPagingEnabled = true
collectionView.isScrollEnabled = false
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
} else {
self.automaticallyAdjustsScrollViewInsets = false
}
return collectionView
}()
我滾動頁面調(diào)用的代碼
self.collectionView.scrollToItem(at: IndexPath(item: collectionViewIndex, section: 0), at: .right, animated: true)
結(jié)果找了半天原因沒找到,因為看起來很正常拥峦,查閱網(wǎng)上的資料贴膘,發(fā)現(xiàn)調(diào)用無效大多是在collectionView
尚未布局的時候就調(diào)用了scrollToItem(at: _, at: _, animated: _),跟我的情況不符合
后來想著先用setContentOffset(_, animated: _)試試略号,后來發(fā)現(xiàn)確實可以刑峡,但是滾動的頁數(shù)越多,發(fā)現(xiàn)cell偏移也越厲害璃哟,查看View hierarchy,發(fā)現(xiàn)是cell之間有10的間距氛琢,應(yīng)該是沒有設(shè)置flowLayout
的minimumLineSpacing屬性。調(diào)整為0后随闪,重新運行阳似,正常了
但是按理來說沒有設(shè)置minimumLineSpacing不該影響collectionView
的跳轉(zhuǎn)才對,于是繼續(xù)檢查collectionView
的設(shè)置铐伴,發(fā)現(xiàn)一句可能會影響的代碼
collectionView.isPagingEnabled = true
我們查看isPagingEnabled的文檔
Discussion
If the value of this property is true, the scroll view stops on multiples of the scroll view’s bounds when the user scrolls. The default value is false.
文檔中解釋說scroll view會停止在scroll view的bounds的整數(shù)倍的位置
那么如果沒有設(shè)置minimumLineSpacing(這里我的collectionView
是水平滾動的撮奏,所以應(yīng)該只用設(shè)置這個屬性就可以了),那么collectionView
在通過scrollToItem(at: _, at: _, animated: _)
滾動到指定頁的時候,實際上并沒有滾動整數(shù)倍的scroll view’s bounds 当宴,和isPagingEnabled屬性相違背畜吊,所以說到這里,這個bug其實有兩個解決方式
- collectionView.isPagingEnabled = false
- 設(shè)置minimumLineSpacing為0即可
我把minimumLineSpacing的設(shè)置取消掉户矢,單改為isPagingEnabled = false
玲献,測試通過,說明推論是應(yīng)該正確的梯浪。
2020.11.16 更新
最新發(fā)現(xiàn)在iPad上有collectionview
在設(shè)置了minimumLineSpacing = 0
后調(diào)用scrollToItem(at: _, at: _, animated: _)仍然無效捌年,建議設(shè)置了collectionView.isPagingEnabled = true
的改用setContentOffset
進行跳轉(zhuǎn)。