問題場景
為了實(shí)現(xiàn)每次點(diǎn)擊collectionView的item時刷新collectionView的數(shù)據(jù)家坎,并使collectionView自動滾動到所點(diǎn)擊item的位置.
問題代碼
在reloadData時調(diào)用了scrollToItemAtIndexPath:animated
方法,并設(shè)置animated
值為YES
[collectionView reloadData];
[collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
原因分析
reloadData是一個重新加載所有數(shù)據(jù)源并賦值的方法玷禽,賦值時對layer的屬性變化會產(chǎn)生隱式動畫查蓉,又因?yàn)閍nimated為YES時collectionView就有一個偏移的動畫乌询,而隱式動畫也剛好被同時加入了這一時間(duration)之中,就造成了肉眼可見的閃爍效果
解決方案
reloadData時禁用隱式動畫
// 禁用隱式動畫
[CATransaction setDisableActions:YES];
[collectionView reloadData];
[CATransaction commit];
[collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
結(jié)論
UITableView和UICollectionView應(yīng)該大致造成閃爍的原因是相同的豌研,都可以通過此方法解決