【iOS】UIButton超出父视图点击无效(swift)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【iOS】UIButton超出父视图点击无效(swift)相关的知识,希望对你有一定的参考价值。

参考技术A

写在前面的:

有时候,我们需要将响应事件的子view视图,超出父view视图的范围。但是在默认情况下,超出去的部分,是无法响应事件的!……

对于第一种方法,很多时候是最简单粗暴,但有时我们UI设计确实需要子视图超过父视图的效果,那么就可以尝试用第二种方法!

官方定义:

官方解释:
返回视图层级结构(包括其自身)中,包含指定点的事件接收者最远的子视图。(真晦涩!)

一般会跟另一个方法结合使用:(检测当前事件触发点是否在指定视图里面)

页面定义部分

控制器使用部分

ps: 以上仅代表个人浅见,请大佬们指正! -

让超出父视图范围的子视图响应事件,在UIView范围外响应点击

//重写该方法后可以让超出父视图范围的子视图响应事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        for (UIView *subView in self.subviews) {
            CGPoint tp = [subView convertPoint:point fromView:self];
            if (CGRectContainsPoint(subView.bounds, tp)) {
                view = subView;
            }
        }
    }
    return view;
}

 

如果一个button有一部分超出父控件的范围了,这部分无法响应点击,如果想让它响应点击应该怎么做

字数536 阅读488 评论6

标题中的需求其实常常能遇到,如下图

技术分享
屏幕快照 2016-04-08 下午1.07.00.png

当按钮超出Tab bar的view后,那么其实按钮超出的部分是无法被点击的。那么先来说说解决办法

1.我们重写蓝色view的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event的方法

  - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    //if内的条件应该为,当触摸点point超出蓝色部分,但在黄色部分时
    if (.....){
     return YES;
    }
    return NO;
  }

那么以上为什么能解决方法?

这和iOS的事件分发机制 hit-Testing有关,简单的说,hit-Testing的作用就是找出你每次触摸屏幕,点到的究竟是哪个view。

比如以下这个图

技术分享
屏幕快照 2016-04-08 下午1.38.09.png

当我去点击View-C的时候,hit-Testing实际上是这样检测的
1.首先,视图会先从View-A开始检查,发现触摸点在View-A,所以检查View-A的子视图View-B。
2.发现触摸点在View-B内,好棒!看看View-B内的子视图View-C。
3.发现触摸点在View-C内,但View-C没有子视图了,所以View-C是此次触摸事件的hit-TestView了。

那么UIView中其实提供了两个方法来确定hit-TestView
1.- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event;
2.- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;//这个就是我们上面重写的方法

注意其实在每次递归去调用hitTest:(CGPoint)point withEvent:(UIEvent *)event之前,都会调用pointInside:withEvent:来确定该触摸点是否在该View内。

所以当我们重写pointInside:(CGPoint)point withEvent:(UIEvent *)event后,其实我们的点击后调用hitTest来递归的找hit-TestView的区域从这样:
技术分享
变成了这样:
技术分享

这样当我们愉快的点击上半凸起的区域时,hit-Testing便回去检查蓝色视图内的子视图,即黄色区域。从而来完成此次触摸事件。
Enjoy :)

以上是关于【iOS】UIButton超出父视图点击无效(swift)的主要内容,如果未能解决你的问题,请参考以下文章

ios 按钮点击无反应

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

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

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

无法识别 UILabel 上超出父视图范围的点击

导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS