无论你定义什么控件,最原始也最自由的实现方式就是继承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事件即可。
经过调试发现,此方式可以定义任意形状的控件和响应方式,只要你能想到的,呵呵。。。 后续不断更新。。。