美文网首页
iOS UIButton改变区域或超出父视图响应

iOS UIButton改变区域或超出父视图响应

作者: 東玖零 | 来源:发表于2021-10-11 18:52 被阅读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

    相关文章

      网友评论

          本文标题:iOS UIButton改变区域或超出父视图响应

          本文链接:https://www.haomeiwen.com/subject/ohxroltx.html