前言
最近在重構某個模塊,以后別人封裝的所謂的基類就像一坨死一樣,看見就惡心,相信同行的你們能夠明白那種心情。為什么要重構?並不是真的因為它像一坨死,而是因為這個模塊是用戶使用最頻繁的,而且出現了不少bug,最重要的是這bug還是p1級別的致命bug。
曾經經過了幾天的壓力測試都沒有復現出來,但是用戶卻頻繁反饋,這就是決定重構的原因了。重構的界面是這樣的:

當UICollectionView中的每個cell放的是一個controller.view而這個controller.view又放一個UITableVIew時,這時候將collectionView的滾動方向設置為橫向就可以了。
但是,如果我們設置了bounces為YES,那么右滑返回手勢就沒有了,怎么辦?
實現思路
共使用了四個控制器類:
- ContentController:手勢沖突當前所在的控制器,使用UICollectionView,每個cell對應於一個控制器的view
- SiteController1:標簽一對應的控制器
- SiteController2:標簽二對應的控制器
- SiteController3:標簽三對應的控制器
配置UICollectioView
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// config collection view
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(kScreenWidth, kScreenHeight - 64 - tabViewHeight);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 64 + tabViewHeight, kScreenWidth, kScreenHeight - 64 - tabViewHeight)
collectionViewLayout:layout];
[self.view addSubview:self.collectionView];
self.collectionView.backgroundColor = kWColor;
self.collectionView.pagingEnabled = YES;
self.collectionView.showsHorizontalScrollIndicator = NO;
[self.collectionView registerClass:[UICollectionViewCell class]
forCellWithReuseIdentifier:kPatientCellIdentifier];
[self.collectionView registerClass:[UICollectionViewCell class]
forCellWithReuseIdentifier:kUnreadCellIdentifier];
[self.collectionView registerClass:[UICollectionViewCell class]
forCellWithReuseIdentifier:kAllCellIdentifier];
// 不能將bounces設置為NO,否則右滑返回手勢就沒有了
// self.collectionView.bounces = NO;
|
當我們滾動到標簽三時,再滑動就會超出范圍,此時會顯示部分空白,這體驗不太好,不希望可以再滑動了。同樣,當滑動到標簽一時,再右滑時,不希望顯示空白部分,而是觸發右滑返回手勢。
解決方案
解決方案就是實現UIScrollView的代理方法,當超出屏寬*2時,限制在屏寬*2的位置處。同樣,當小於0時,就限制在0處,這樣就解決了出現空白的問題。同時,這樣就不會關閉用戶響應,因此系統的右滑返回手勢仍然可以觸發。
經過這么一折騰,大家明白如何解決的了嗎?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#pragma mark -- UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
// 限制不能超出屏寬*2
if (scrollView.contentOffset.x > 2 * kScreenWidth) {
[scrollView setContentOffset:CGPointMake(2 * kScreenWidth, 0)];
return;
}
// 限制不能超過0
if (scrollView.contentOffset.x < 0) {
[scrollView setContentOffset:CGPointMake(0, 0)];
return;
}
int itemIndex = (scrollView.contentOffset.x +
self.collectionView.hdf_width * 0.5) / self.collectionView.hdf_width;
itemIndex = itemIndex % [self collectionView:self.collectionView numberOfItemsInSection:0];
CGFloat x = scrollView.contentOffset.x - self.collectionView.hdf_width;
NSUInteger index = fabs(x) / self.collectionView.hdf_width;
CGFloat fIndex = fabs(x) / self.collectionView.hdf_width;
if (fabs(fIndex - (CGFloat)index) <= 0.00001) {
// ....切換按鈕
}
}
|
