一、介绍

在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大UIButton的响应范围

二、方式

下面有两个解决办法:

第一种方法:创建一个类目:UIButton+EnlargeTouchArea

.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface UIButton (EnlargeTouchArea)
  4.  
  5. - (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;
  6.  
  7. - (void)setEnlargeEdge:(CGFloat) size;
  8.  
  9. @end

.m

  1. #import "UIButton+EnlargeTouchArea.h"
  2. #import <objc/runtime.h>
  3.  
  4. @implementation UIButton (EnlargeTouchArea)
  5.  
  6. static char topNameKey;
  7. static char rightNameKey;
  8. static char bottomNameKey;
  9. static char leftNameKey;
  10.  
  11. - (void)setEnlargeEdge:(CGFloat) size
  12. {
  13. objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
  14. objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
  15. objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
  16. objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
  17. }
  18.  
  19. - (void) setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left
  20. {
  21. objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
  22. objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
  23. objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
  24. objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
  25. }
  26.  
  27. - (CGRect) enlargedRect
  28. {
  29. NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
  30. NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
  31. NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
  32. NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
  33. if (topEdge && rightEdge && bottomEdge && leftEdge)
  34. {
  35. return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
  36. self.bounds.origin.y - topEdge.floatValue,
  37. self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
  38. self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
  39. }
  40. else
  41. {
  42. return self.bounds;
  43. }
  44. }
  45.  
  46. - (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event
  47. {
  48. CGRect rect = [self enlargedRect];
  49. if (CGRectEqualToRect(rect, self.bounds))
  50. {
  51. return [super hitTest:point withEvent:event];
  52. }
  53. return CGRectContainsPoint(rect, point) ? self : nil;
  54. }
  55.  
  56. @end

使用方法:

  1. UIButton *button = [UIButton new];
  2. [button setEnlargeEdge:];
  3.  
  4. //或者
  5. [button setEnlargeEdgeWithTop: right: bottom: left:];

第二种:直接创建一个UIButton类,然后复写pointInside方法

使用时继承于此类即可

.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface BiggerClickAreaButton : UIButton
  4.  
  5. @end

.m

  1. #import "BiggerClickAreaButton.h"
  2.  
  3. @implementation BiggerClickAreaButton
  4.  
  5. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
  6. {
  7. CGRect bounds = self.bounds;
  8. //若原热区小于44x44,则放大热区,否则保持原大小不变
  9. CGFloat widthDelta = MAX(44.0 - bounds.size.width, );
  10. CGFloat heightDelta = MAX(44.0 - bounds.size.height, );
  11. bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
  12. return CGRectContainsPoint(bounds, point);
  13. }
  14.  
  15. @end

使用时直接继承创建即可

三、声明

本文转载自:https://www.cnblogs.com/rglmuselily/p/9543075.html

iOS:UIButton扩大按钮的响应区域的更多相关文章

  1. iOS之UIButton扩大按钮的响应区域

    在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大UIButton的响应范围,下面有两个解决办法: 第一种方法:创建一个类目:UIButton+EnlargeTouchArea .h文件 ...

  2. UGUI之不规则按钮的响应区域

    比如一些不规则按钮最好可以设置它的响应区域.如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域. 注意 IsRaycastLocationValid 的判断区域是RectTr ...

  3. iOS UIButton单双击处理响应不同的方法

    //显示目标 双击显示当前用户坐标位置 UIButton * btnShowDistination = [[UIButton alloc]initWithFrame:CGRectMake(, SCRE ...

  4. 扩大按钮 btn 响应区域

    方法一:类别 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0 ...

  5. iOS 禁止多按钮同时响应

    只需要对相应的按钮添加一行代码 [aButton setExclusiveTouch:YES];

  6. iOS - 扩展UIButton的响应区域

    扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...

  7. H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位

    H5微信页面开发,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,导致弹框里的按钮响应区域错位. 解决方案:给输入框(或select选择框)添加失去焦点的 ...

  8. iOS 9应用开发教程之ios9中实现按钮的响应

    iOS 9应用开发教程之ios9中实现按钮的响应 IOS9实现按钮的响应 按钮主要是实现用户交互的,即实现响应.按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应:另一 ...

  9. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

随机推荐

  1. js判断手机邮箱格式(正则)

    function fun() { var realname = document.getElementById("realname"); var telephone = docum ...

  2. Zepto的使用以及注意事项

       为什么选择Zepto.js的原因: zepto.js的语法借鉴并且兼容jQuery,会使用jquery就会使用Zepto.js.Zepto.js是移动端的js库.Zepto.js相当于PC端的j ...

  3. Codeforces 986C AND Graph dfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/9161514.html 题目传送门 - Codeforces 986C 题意 给定 $n,m (0\leq n\ ...

  4. 存储过程导入excel

    #region 导入订单        protected override string DoExcelData(System.Data.DataTable dt)        {         ...

  5. {}动态规划}记忆化dp

    先搞个模板 #include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ]; ...

  6. 052 kafka对topic的增删改查操作

    一:create 1.开始使用命令 2.创建 bin/kafka-topics.sh --create --topic beifeng --zookeeper linux-hadoop01.ibeif ...

  7. day 74ajax

    w3school地址ajax教程 ajax定义: AJAX(Asynchronous Javascript And XML) 翻译成中文就是'异步JavaScript和XML',也就是使用JavaSc ...

  8. radio按钮单选效果

    必须有name,并且是同一值,判断效果可用value值确定

  9. rock-paper-scissors

    rock-paper-scissors维护三个前缀和,然后注意顺序,最后做差来确定可行的答案,因为答案比较小,可以考虑这种暴力做法,像这种方案数可以++的题真的不多,如果想不出来特别优秀的想法,不妨简 ...

  10. 004.Ceph块设备基础使用

    一 基础准备 参考<002.Ceph安装部署>文档部署一个基础集群: 新增节点主机名及IP在deploy节点添加解析: [root@deploy ~]# echo "172.24 ...