本篇主要解决以下需求场景:
代码结构的设计:
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