有关自定义控件(继承于uivew)触摸事件处理的感想

来源:互联网 发布:淘宝联盟二维码分享 编辑:程序博客网 时间:2024/05/16 17:28

http://blog.csdn.net/zaitianaoxiang/article/details/7554490


无论你定义什么控件,最原始也最自由的实现方式就是继承UIView,绘制自己想要的控件,但若要响应点击等事件而且自己的控件还比较异形那自然要响应touch事件。

当控件被点击时,若控件可见度(alpha值)小与0.01,则控件默认是不响应ouch事件的。

当控件中有个别subview显示在控件外部(即subview的frame不在控件区域内),该subview默认也不响应touch事件,但自己偏偏又想处理怎么办? 经过测试调试阅读文档将此问题解决。


解决方案:

   让控件复写 -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法。 只有控件存在无论可见度是什么uikit框架会递归回调此接口。

   若要subview响应touch事件,只需判断point是否在subview控件区域内,若在则返回此subview。若不在则返回nil。



-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL isinView = NO;
    UIView *clickView = nil;
    for (UIView *showView in self.currentShowItemViewArray)
    {
        CGRect rect = showView.frame;
        if ([showView isKindOfClass:[MyTabBarView class]])
            rect = showView.bounds;
         
        isinView = CGRectContainsPoint(rect , point);
        if (isinView)
        {
            clickView = showView;
            break;
        }
    }
    
    if (isinView)
        return clickView;
    return nil;
}


subview 实现touch的回调函数接口响应touch事件即可。



经过调试发现,此方式可以定义任意形状的控件和响应方式,只要你能想到的,呵呵。。。 

原创粉丝点击