UIButton实现区域外点击
今天项目开发中偶然需要这个功能,一个按钮区域大小外也要能够点击响应
因为项目是很早就开发的就项目,所以没有必要因为这个小的需求来修改按钮的大小,重新制定约束,或者frame等等,因为可能会影响到其他控件的约束或者响应等,
那么如何能够实现这个功能呢?
其实最简单的方法就是创建一个那么大的按钮,然后按钮的图片设置小一点的,让人看上去按钮就那么大,但是其实要比我们看到的要大.
这样的实现相信每一个人都会,至于我为什么没有用,上面也提到了
于是第一时间想到了touchBegin,我们可以获取点击的坐标
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
CGPoint location = [[touches allObjects][0] locationInView:self.view];
//...
}
然后根据坐标判断是否响应某一个方法,来达到目的
这样确实能够实现,但是如果一个界面有很多按钮都需要这样判断,那么是不是就很麻烦了呢?
有没有什么比较好的解决方案呢?
一个按钮的点击范围,那么最好的方案肯定是在这个按钮内做判断.
选择自定义一个按钮?
外层是按钮,中间是一个小的图片?那么和开始提到的一样了
所以我应该试着在touch,或者简单的在point上面做点文章
UIButton很简单,从头阅读到尾,也没有看到可用的信息.
那么进入其父类UIControl,很显然,也很失望,这个类里面都是响应的属性或者方法,能够判断点击的执行或者取消等等,但是诸如范围大小的字眼,很难看到,
于是继续深入,找到UIView
终于,没有过几行,我就发现了一个好东西
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds
这个是什么方法呢?
这个函数的用处是判断当前的点击或者触摸事件的点是否在当前的view中。默认是当点在视图大小的范围内返回yes,之外则返回no
这正是我们想要的不是么?
我们可以重写这个方法.在范围外的某一片区域内,我们都返回YES,
那么其判定就是当前的点击或者触摸时间的点就在当前的view中