iOS UIButton改变区域或超出父视图响应
2021-10-11 本文已影响0人
東玖零
1.UIButton改变区域响应
a.当我们为了显示美观,按钮比较小时,希望响应区域大一点,更容易点击。
b.当我们写一个较大圆按钮,不希望圆以外的四个边角来响应,这里也可以使用layer.cornerRadius和layer.masksToBounds配合实现。
这时候我们可以继承UIButton自定义按钮,重写用来判断触摸点是否在控件上方法来实现。
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(CGRectInset(self.bounds, -20, -20), point)) {
return YES;
}
return NO;
}
2.UIButton超出父视图响应
a.当我们自定义tabbar并放一个异形按钮在上面,这个按钮有一部分又超出了tabbar,超出的部分点击就没有响应,这时候可以用判断控件是否接受事件以及找到最合适的view的方法来实现
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event {
UIView * view = [super hitTest:point withEvent:event];
if (view == nil) {
for (UIView * subView in self.subviews) {
// 将坐标系转化为自己的坐标系
CGPoint pt = [subView convertPoint:point fromView:self];
if (CGRectContainsPoint(subView.bounds, pt)) {
view = subView;
}
}
}
return view;
}
如果上面方法无效,可能是你的按钮并不是直接添加在tabbar,这时候来个暴力一点,当找不到view时直接判断那个超出父视图按钮。
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event {
UIView * view = [super hitTest:point withEvent:event];
if (view == nil) {
// 将坐标系转化为自己的坐标系
CGPoint pt = [self.scanButton convertPoint:point fromView:self];
if (CGRectContainsPoint(self.scanButton.bounds, pt)) {
view = subView;
}
}
return view;
}
WX20211011-184815@2x.png
WX20211011-184935@2x.png