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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS UIButton改变区域或超出父视图响应相关的知识,希望对你有一定的参考价值。

参考技术A a.当我们为了显示美观,按钮比较小时,希望响应区域大一点,更容易点击。
b.当我们写一个较大圆按钮,不希望圆以外的四个边角来响应,这里也可以使用layer.cornerRadius和layer.masksToBounds配合实现。

这时候我们可以继承UIButton自定义按钮,重写用来判断触摸点是否在控件上方法来实现。

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

a.当我们自定义tabbar并放一个异形按钮在上面,这个按钮有一部分又超出了tabbar,超出的部分点击就没有响应,这时候可以用判断控件是否接受事件以及找到最合适的view的方法来实现

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

如果上面方法无效,可能是你的按钮并不是直接添加在tabbar,这时候来个暴力一点,当找不到view时直接判断那个超出父视图按钮。

在ios中如果按钮的位置超出父视图无法响应.如何处理?

在按钮所在的父视图中重写以下方法.

以下例子中我在父视图外添加了二个按钮callBtn和detailBtn;

以下例子应用场景为.高德地图中的自定义泡泡视图.因为泡泡视图默认添加在大头针视图上.而一般情况下大头针视图的尺寸远远小于泡泡视图导致泡泡视图整个都在大头针视图外.无法响应点击事件.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    UIView *view = [super hitTest:point withEvent:event];  // 先按正常方法获取响应事件的视图

    if (view == nil) {

        CGPoint tempointcallBtn = [self.calloutView.callBtn convertPoint:point fromView:self]; // 将点击的点坐标转换成我们想要响应的视图的对应坐标系中的坐标.(坐标系转换)

        CGPoint tempointdetailBtn = [self.calloutView.detailBtn convertPoint:point fromView:self]; // 如果要判断多个按钮,则根据此规则多次添加对应点.关在if语句后添加对应else if判断.

        if (CGRectContainsPoint(self.calloutView.callBtn.bounds, tempointcallBtn)) // 判断当前点击的位置是否在我们要响应的视图中.

        {

            view = self.calloutView.callBtn; // 如果判断为真则返回我们要响应的视图.

        } else if (CGRectContainsPoint(self.calloutView.detailBtn.bounds, tempointdetailBtn)) {

            view = self.calloutView.detailBtn;

        }

    }

    return view;

}

以上是关于iOS UIButton改变区域或超出父视图响应的主要内容,如果未能解决你的问题,请参考以下文章

UIButton按钮点击无响应处理方法

ios 按钮点击无反应

UIButton 超出范围 - 它应该工作吗?

在ios中如果按钮的位置超出父视图无法响应.如何处理?

iOS UIButton 点击无响应的解决办法

如果 UIButton 的位置超出其父视图但它是可见的,它可以响应触摸事件吗?