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基础知识这一块还很不熟悉。本例中的很多知识点,我也是解除了这个例子之后我才了解得到。
  • 所以这篇文章也是比较水,没有什么深度,仅作为自己初级学习过程中的一个总结。
  • 这里的不少知识点,没有过多地写个人总结,因为本身也是比较简单的知识,网上搜索已经有一大堆的参考了。

原文地址:https://www.cnblogs.com/HelloGreen/p/12586669.html

时间: 2024-11-13 09:43:26

iOS-扩大按钮点击范围的相关文章

iOS并排按钮点击联动效果封装

#import <UIKit/UIKit.h> typedef void(^SelectedBlock)(id viewPager, NSInteger index); @interface YFViewPager : UIView<UIScrollViewDelegate> { NSArray *_titleArray; /**< 菜单标题 */ NSArray *_views; /**< 视图 */ NSArray *_titleIconsArray; /**<

ios上有时候提交按钮点击两次才可以取消输入框软键盘

ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出现 输入框消失后 软键盘又弹出来了,得手动关闭软键盘才可以,这个时候给输入框一个主动取消焦点的事件就可以解决 $("..").blur();

【IOS】iOS 如何放大按钮点击热区

Apple的iOS人机交互设计指南中指出,按钮点击热区应不小于44x44pt,否则这个按钮就会让用户觉得"很难用",因为明明点击上去了,却没有任何响应. 但我们有时做自定义Button的时候,设计图上的给出按钮尺寸明显要小于这个数.例如我之前做过的自定义Slider上的Thumb只有12x12pt,做出来后我发现自己根本点不到按钮-- 这个问题在WWDC 2012 Session 216视频中提到了一种解决方式.它重写了按钮中的pointInside方法,使得按钮热区不够44×44大小

iOS 防止按钮快速点击造成多次响应的避免方法

有时候有些操作是防止用户在一次响应结束中再响应下一个.但有些测试用户就要猛点,狂点.像这种恶意就要进行防止. 当然有些异步操作时,可以在调用前enable 掉.等CallBACK 后再enable起来.过程中按钮是不能点的. 1.可以使用: - (void) timeEnough { UIButton *btn=(UIButton*)[self.view viewWithTag:33]; btn.selected=NO; [timer invalidate]; timer=nil; } - (v

iOS 获取UIWebView上面的按钮点击事件

UIWebView的一些用法总结的网址 http://blog.csdn.net/zhaoweixing1989/article/details/13021513 在网上看到很多文章都说iOS的UIWebView比较耗内存,在我的项目中,最开始我也是用UIWebView来加载网页的.刚开始加载的是自己拼接成的Html,后来在Html中加入一个按钮,点击之后用当前的UIWebView去加载网络上的网页.程序跑起来发现非常耗内存,加载几个网上的网页之后就爆内存警告了,不处理的话很容易被评估拒掉app

iOS解决按钮短时间内多次点击只触发一次事件方法

在上家公司做项目的时候,做了个60秒获取验证码的功能,当时做了个定时器,按钮触发定时器,逻辑来讲都是没问题的,但是实际操作的时候,恶意的在短时间内多次点击那个获取验证码按钮,按钮的点击事件被调用了多次,定时器从而也调用多次,本来一秒减一的事件变成了一秒减多,并且减到0后继续调用方法,直到响应点击次数调用完,这完全不符合我们的心意. 时隔2月,我在新公司工作了,回头来看这个问题,为了解决这个问题,我在百度上查了许多资料,解决后将解决办法写入自己的博客,和大家分享自己的技术,也为自己一直想写博客做个

开发第一个IOS小程序 - 点击按钮文字变色

1. 题目:实现点击按钮切换文字对应的颜色 2.分析大致的开发步骤是 •添加所需要的UI元素:3个按钮(UIButton).1个文本标签(UILabel) •监听3个按钮的点击事件 •改变文本标签的文字颜色 3.具体实现步骤 3.1 在storyboard文件中,拖拽相应控件器上,布局好以上显示页面效果 3.2 然后利用Xcode右端上的“圆圈”按钮,将代码区分割成 “Main.storyboard”与“viewController.m”文件,两个可以按住control键,不要放开,将以上元素拖

IOS第四天(6:答题区按钮点击和乱序)

#pragma mark - 答题区按钮点击方法 - (void)answerClick:(UIButton *)button { // 1. 如果按钮没有字,直接返回 if (button.currentTitle.length == 0) return; // 2. 如果有字,清除文字,候选区按钮显示 // 1> 使用button的title去查找候选区中对应的按钮 UIButton *btn = [self optionButtonWithTilte:button.currentTitle

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

收集购物信息  iOS项目 倒计时:588 步骤 /.panel-heading 项目需求 设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话.并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击. #import "TableViewController.h" @interface TableViewController ()<UIAlertViewDelegate> @property (nonatomic, strong)