iOS

iOS hitTest让UIScrollView更多变

2018-03-05  本文已影响8人  骑单车de小飞侠

        之前在公司的项目上遇到了一个让人很难受的需求,一个类似于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;

}

上一篇下一篇

猜你喜欢

热点阅读