CollectionView 單個選項卡的滑動

c4ibD3發表於2018-12-12

前言

最近在做一個旅行類的專案,裡面喲孤兒橫向滑動的選項卡功能,乍一看設計圖,感覺很簡單。橫向滑動,CollectionView的flowLayout有這個設定屬性,分分鐘搞定。後來需求要每次滑動一個選項卡。這就讓我有點棘手了,因為心裡知道這個應該是要自己去計算偏移量的問題了

正題

實現這個功能,主要就是呼叫了一個UIScrollView的代理方法- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

不說別的了,直接上程式碼

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 
float pageWidth = 200 + 10;
float currentOffset = _collectionView.contentOffset.x;
float targetOffset = targetContentOffset->
x;
float newTargetOffset = 0;
if (targetOffset+ 20 >
currentOffset) {
newTargetOffset = ceilf(currentOffset/pageWidth) * pageWidth;

}else{
newTargetOffset = floorf(currentOffset/ pageWidth) * pageWidth;

} if (newTargetOffset <
0) {
newTargetOffset = 0;

}else if (ABS(scrollView.contentSize.width - (newTargetOffset + pageWidth))<
pageWidth){
newTargetOffset = scrollView.contentSize.width - _collectionView.bounds.size.width ;

} newTargetOffset = ceilf(newTargetOffset);
targetContentOffset->
x = currentOffset;
[scrollView setContentOffset:CGPointMake(newTargetOffset, 0) animated:YES];

}複製程式碼

這裡面pageWidth的值是一個item的寬度加間距,之後對於滑到最後一個item的時候不足一個item的寬度做了相應的處理。

如果你們的設計是兩邊都有留白的情況,你可以設定flowLayout.sectionInset,相應的collectionViewcontentInset屬性也要做相應的處理

OS:

大神們有什麼好的建議多給我提出來

傳送門

Demo

來源:https://juejin.im/post/5c0f8f57e51d45434572ed37#comment

相關文章