iOS scrollView自定义分页大小及subViews点击事件处理

本篇主要解决以下需求场景:


iOS scrollView自定义分页大小及subViews点击事件处理_第1张图片
每次滚动距离 < 展示宽度

代码结构的设计:

1,外层UIView,用来整体封装。包含计时器、子视图scrollView的代理方法等。
同时如果要求scrollView整体滚动展示区域设置背景色时,由于在自定义分页大小时,改小了scrollView的宽度。这时可以直接在外层View上操作。
2,[UIView addSubview:scrollView]
3,在scrollView上根据数据源,循环创建UIImageView并add到scrollView上


实现自定义分页大小的主要思路:

1,UIScrollView的contentSize属性,决定整体滚动展示区域的大小

scrollView.contentSize = CGSizeMake(展示区域宽度, 展示区域高度);
scrollView.pagingEnabled = YES;//启动分页效果

2,UIScrollView的frame宽度,决定分页page的大小,即手每滑一次,滚动的距离

scrollView.frame = 设置为实际想要分页的宽度(小于整体展示区域宽度)

3,设置scrollView的clipsToBounds属性为NO:不裁剪子视图超出父视图的部分
属性详细介绍见:https://www.jianshu.com/p/1f94bed28b93

scrollView.clipsToBounds = NO;

4,解决自定义分页大小后,内部子view 点击事件/手势 不响应的问题。
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 系统的Hit-Testing方法,触摸屏幕时,探测由哪个对象最先响应,决定scrollView内部子view的点击事件or手势的响应

//重写外层UIView的触摸手势响应链方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        //触摸点在外层UIView的范围中,都优先响应子视图scrollView
        return scrollView;
    }
    return nil;
}

响应链、Hit-Testing,详细介绍:https://www.jianshu.com/p/77139b374313?open_source=weibo_search
【注意!】如果scrollView中,每个UIImageView都有点击跳转事件,则要转换相对坐标系,加多一层判断:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        for (UIView *view in self.adScrollView.subviews) {
            //转换坐标系为imageView,进行对比
            CGPoint pointInImageView = [self convertPoint:point toView:view];
            if ([view pointInside:pointInImageView withEvent:event] && [view isKindOfClass:[UIImageView class]]) {
                //优先响应imageView的点击事件
                return view;
            }
        }
        //其次响应scrollView
        return self.scrollView;
    }
    return nil;
}

转换坐标系convertPoint、及判断点在范围内 详细介绍:http://www.cocoachina.com/ios/20161206/18297.html

以上,希望其他人能少踩坑吧hhh

你可能感兴趣的:(iOS scrollView自定义分页大小及subViews点击事件处理)