iOS hitTest让UIScrollView更多变
之前在公司的项目上遇到了一个让人很难受的需求,一个类似于banner图的轮播,但是当前页面要求显示为上一个图片的一半、当前图片 和 下一个图片的一半,如果直接使用pagingEnabled=YES的话,范围不容易 控制,反之,则会造成滑动的时候不能达到翻页的效果。
在网上多方查找方法之后找到一个很奇妙的方法,设置ScrollView的frame为当前图片的大小,同时设置clipsToBounds=NO可以将其他部分的视图展示出来,这样看起来就和正常的翻页效果是一样的了。那么,问题又来了,两边的图片没办法获得焦点,无法响应ScrollView的滑动事件。于是又在网上查了大量的技术贴,发现了一个很神奇的方法:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
hitTest是UIView的系统方法,可以直接调用重写,于是着手重写ScrollView的父视图的hitTest方法,注意是父视图的,重写ScrollView的hitTest是没有任何作用的,hitTest是点击在某个点上的时候,将该View的某个子视图作为第一焦点返回,这样就可以达到该视图的响应事件了。下面是重写hitTest的代码,仅供参考:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if ([view isEqual:self]){
for (UIView *subview in scrollView.subviews){
CGPoint offset = CGPointMake(point.x - scrollView.frame.origin.x + scrollView.contentOffset.x - subview.frame.origin.x, point.y - scrollView.frame.origin.y + scrollView.contentOffset.y - subview.frame.origin.y);
if ((view = [subview hitTest:offset withEvent:event])){
return view;
}
}
return scrollView;
}
return view;
}