zoukankan      html  css  js  c++  java
  • iOS-扩大按钮点击范围

    更新记录

    • 2020年3月28日,初稿

    文章背景

    近日,接到头头突然让我改一个东西,让我马上把某个按钮的点击相应区域扩大一点。作为一个iOS三个月的新人,还真不了解要怎么做。随后,头头说只要加一行代码就行了,然后让某位前辈直接把参考代码发给我。
    后来,我加了一行类似于如下的代码:

    [button setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];
    

    就使得按钮点击区域扩大了。但是,我不明白其中的原理。于是乎,想要一探究竟。

    探索过程

    • 网上搜索iOS扩展按钮点击区域,发现有一个千篇一律的方法:
      增加UIButton的点击范围,那么从中也可以窥探出,这个方法大概率就是业界常用的,扩大按钮点击区域的方法。
    • 上述链接可以优化的一点的是:不要重写UIButton类的pointInside:withEvent:方法,使用swizzle交换IMP
    • 具体源码如下:
    + (void)load {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSError *error = nil;
            [self jr_swizzleMethod:@selector(pointInside:withEvent:) withMethod:@selector(hitTest_pointInside:withEvent:) error:&error];
            NSAssert(!error, @"UIView+HitTest.h swizzling failed: error = %@", error);
        });
    }
    
    - (BOOL)hitTest_pointInside:(CGPoint)point withEvent:(UIEvent *)event {
        if (UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero)) {
            return [self hitTest_pointInside:point withEvent:event];
        }
        CGRect relativeFrame = self.bounds;
        CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);
        return CGRectContainsPoint(hitFrame, point);
    }
    

    探索其中的知识点

    dispatch_once

    • 源码及原理可参考玩转dispatch_once
    • 原理还是挺深入的,在此不便深入。仅知道可以保证只初始化一次,且保证多线程安全。(可和Java中的单例模式Double CheckLock初始化比较一下)

    关联对象(如何给分类添加属性)

    CGRectInset

    事件响应链

    • 在这个例子中的使用还是很简单的。通过pointInside:withEvent:函数判断,该点击点是否在该view的点击范围内,否则就往时间响应链的下游传递。

    写在后面的话

    • 因为刚入门iOS,而且工作的大多时间都花在业务逻辑上,对iOS基础知识这一块还很不熟悉。本例中的很多知识点,我也是解除了这个例子之后我才了解得到。
    • 所以这篇文章也是比较水,没有什么深度,仅作为自己初级学习过程中的一个总结。
    • 这里的不少知识点,没有过多地写个人总结,因为本身也是比较简单的知识,网上搜索已经有一大堆的参考了。
  • 相关阅读:
    Html.RenderPartial和Html.Partial区别
    SQL Server事务处理
    为什么要使用消息队列(一)
    消息队列的优缺点(三)
    消息队列消息顺序性
    分布式事务之消息队列解决方案
    Solr与tomcat整合,并添加中文分词器
    Solr设置高亮
    Solr执行查询操作
    Lucene使用Filter搜索过滤
  • 原文地址:https://www.cnblogs.com/HelloGreen/p/12586669.html
Copyright © 2011-2022 走看看