前言

最近在重构某个模块,以后别人封装的所谓的基类就像一坨死一样,看见就恶心,相信同行的你们能够明白那种心情。为什么要重构?并不是真的因为它像一坨死,而是因为这个模块是用户使用最频繁的,而且出现了不少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) {
    // ....切换按钮
  }
}
 

UICollectionView与UITableView混用手势冲突的更多相关文章

  1. 拖拽手势和清扫手势冲突时(UIPanGestureRecognizer和UISwipeGestureRecognizer冲突时)

    故事发生在这样的情境上:给整个控制器添加了一个拖拽手势,然后又在控制上的每个Cell上加了左滑清扫手势,然后问题来了:只有拖拽手势起作用,而左滑手势没有效果了,然后怎么解决这个问题呢!先上图: 当给整 ...

  2. 捉襟见肘之TableView的手势(删除、编辑等)与转场动画手势冲突

    在使用PresentModel的方式进行转场动画时,出现UIPercentDrivenInteractiveTransition和 UITableView的自带手势冲突,问题需要总结,今天系统复习和总 ...

  3. iOS手势冲突问题

    今天在做一个效果的时候,由于子视图和父视图都有响应的事件,子视图的事件理所当然被父视图拦截掉了,接下来就做分析解决 1.  tableviewcell可以触发点击,同时tableview的父视图有点击 ...

  4. 解决iOS手势冲突问题

    今天在做一个效果的时候,由于子视图和父视图都有响应的事件,子视图的事件理所当然被父视图拦截掉了,接下来就做分析解决 1.  tableviewcell可以触发点击,同时tableview的父视图有点击 ...

  5. iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)

    简单说下关于开发中容易遇到的父试图添加手势与子试图点击事件冲突,UIScrollView 嵌套 UIScrollView . UIScrollView 嵌套 UITableView的情况手势冲突问题: ...

  6. UIScrollView,UICollectionView 和UITableView的属性和方法

    UIScrollView,UICollectionView 和UITableView 三者之间的关系:UIScrollView是 UICollectionView 和 UITableView 的父类. ...

  7. 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?

    有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...

  8. swift - 根试图控制器的手势返回冲突 - push 新的tabbar控制器手势冲突

    1. 禁用手势 和开启手势 extension JYRTSShopListController: UIGestureRecognizerDelegate { /// 禁止使用手势返回 func for ...

  9. iOS自定义全屏返回与tableView左划删除手势冲突解决

    当自定义一个navigationController实现全屏右划返回时, 使用起来是不是很爽, 代码如下: - (void)viewDidLoad { [super viewDidLoad]; UIG ...

随机推荐

  1. xtu summer individual 1 D - Round Numbers

    D - Round Numbers Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u D ...

  2. zoj 1383 Binary Numbers

    Binary Numbers Time Limit: 2 Seconds      Memory Limit: 65536 KB Given a positive integer n, print o ...

  3. [luoguP2962] [USACO09NOV]灯Lights(高斯消元 + dfs)

    传送门 先进行高斯消元 因为要求最少的开关次数,那么: 对于关键元,我们可以通过带入消元求出, 对于自由元,我们暴力枚举,进行dfs,因为只有开关两种状态,0或1 #include <cmath ...

  4. Codevs 1497 取余运算== 洛谷P 1226

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k ...

  5. JavaScript 将行结构数据转化为树结构数据源(高效转化方案)

    js接收到后台的数据如下 /// 部门信息 var departRows = [{ parentDepartId: 'root', departId: 'DC', departName: '集团' } ...

  6. WKWebView的了解

    1. http://blog.csdn.net/chenyong05314/article/details/53735215 2. http://www.jianshu.com/p/6ba250744 ...

  7. 2887 Big String

    splay瞎搞一下,正解是分块数组或分块链表,但是学不会啊! #include<cstdio> #include<cstdlib> #include<iostream&g ...

  8. HDU 4279 Number(找规律)

    Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. [BLE--Physical Layer]

    简述 BLE的物理层,可能做IC或板极硬件RF測试的会比較关注. 是偏硬件层面的. 频率带宽和信道分配 BLE工作于2.4 GHz ISM频段2400-2483.5 MHz,ISM频段是公用的,不须要 ...

  10. win8系统 如何不显示这台电脑的文件夹

    在win8系统中,默认有下面这种文件夹   只要打开注册表编辑器,找到下面所示的项目,删除所有子文件夹即可(最后剩下一个DelegateFolders不用管) [HKEY_LOCAL_MACHINE\ ...