ios 扩大UIButton点击范围
时间:2022-06-10
本文章向大家介绍ios 扩大UIButton点击范围,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先了解Hit-Test请看上一篇文章 https://www.jianshu.com/writer#/notebooks/4989829/notes/33140137
定义一个UIButton的Category UIButton+ClickRange.h
import <UIKit/UIKit.h>
@interface UIButton (ClickRange)
/**
自定义响应边界 UIEdgeInsetsMake(-3, -4, -5, -6). 表示扩大
例如: self.btn.hitEdgeInsets = UIEdgeInsetsMake(-3, -4, -5, -6);
*/
@property(nonatomic, assign) UIEdgeInsets hitEdgeInsets;
/**
自定义响应边界 自定义的边界的范围 范围扩大3.0
例如:self.btn.hitScale = 3.0;
*/
@property(nonatomic, assign) CGFloat hitScale;
/*
自定义响应边界 自定义的宽度的范围 范围扩大3.0
例如:self.btn.hitWidthScale = 3.0;
*/
@property(nonatomic, assign) CGFloat hitWidthScale;
/*
自定义响应边界 自定义的高度的范围 范围扩大3.0
例如:self.btn.hitHeightScale = 3.0;
*/
@property(nonatomic, assign) CGFloat hitHeightScale;
@end
UIButton+ClickRange.m
#import "UIButton+ClickRange.h"
#import <objc/runtime.h>
static const char * kHitEdgeInsets = "hitEdgeInset";
static const char * kHitScale = "hitScale";
static const char * kHitWidthScale = "hitWidthScale";
static const char * kHitHeightScale = "hitWidthScale";
@implementation UIButton (ClickRange)
#pragma mark - set Method
-(void)setHitEdgeInsets:(UIEdgeInsets)hitEdgeInsets{
NSValue *value = [NSValue value:&hitEdgeInsets withObjCType:@encode(UIEdgeInsets)];
objc_setAssociatedObject(self, kHitEdgeInsets, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setHitScale:(CGFloat)hitScale{
CGFloat width = self.bounds.size.width * hitScale;
CGFloat height = self.bounds.size.height * hitScale;
self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width,-height, -width);
objc_setAssociatedObject(self, kHitScale, @(hitScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setHitWidthScale:(CGFloat)hitScale{
CGFloat width = self.bounds.size.width;
CGFloat height = self.bounds.size.height * hitScale;
self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width, -height, -width);
objc_setAssociatedObject(self, kHitScale, @(hitScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void)setHitHeightScale:(CGFloat)hitHeightScale{
CGFloat width = self.bounds.size.width;
CGFloat height = self.bounds.size.height * hitHeightScale;
self.hitEdgeInsets = UIEdgeInsetsMake(-height, -width, -height, -width);
objc_setAssociatedObject(self, kHitHeightScale, @(kHitHeightScale), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
#pragma mark - get method
-(UIEdgeInsets)hitEdgeInsets{
NSValue *value = objc_getAssociatedObject(self, kHitEdgeInsets);
UIEdgeInsets edgeInsets;
[value getValue:&edgeInsets];
return value ? edgeInsets:UIEdgeInsetsZero;
}
-(CGFloat)hitScale{
return [objc_getAssociatedObject(self, kHitScale) floatValue];
}
-(CGFloat)hitWidthScale{
return [objc_getAssociatedObject(self, kHitWidthScale) floatValue];
}
-(CGFloat)hitHeightScale{
return [objc_getAssociatedObject(self, kHitHeightScale) floatValue];
}
#pragma mark - override super method
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
//如果 button 边界值无变化 失效 隐藏 或者透明 直接返回
if(UIEdgeInsetsEqualToEdgeInsets(self.hitEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden || self.alpha == 0 ) {
return [super pointInside:point withEvent:event];
}else{
CGRect relativeFrame = self.bounds;
CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitEdgeInsets);
return CGRectContainsPoint(hitFrame, point);
}
}
@end
调用
self.button.hitScale = 5;
demo:https://github.com/destinyzhao/UIButtonClickRange
- "开门待客"还是“送货上门”?
- 同步一个数据库要发多少个数据包?
- BP神经网络识别性别
- 为or、in平反——or、in到底能不能利用索引?
- BP神经网络续1
- 隐藏在程序旮旯中的“安全问题”
- SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
- 能自己“跑”的表单控件,思路,雏形,源码。vs2005版本
- 在SQLMAP中使用动态SQL
- 使用OQL“语言”构造ORM实体类的复杂查询条件
- AdoHelper使用MySQL存储过程示例
- 使用8位字节的编码格式将字节流安全的转换成String
- 同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题
- PDF.NET数据开发框架操作MySQL实体类操作实例
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- BootStrap应用开发学习入门1
- Python实现单链表和字典
- 关于如何做好运维管理工作的一点思考
- 2.6-Air302(NB-IOT)-基础外设-AD采集,NTC温度传感器B3950
- 2.5-Air302(NB-IOT)-基础外设-串口(485,422),CRC校验
- 2.3-Air302(NB-IOT)-基础外设-输入检测
- 2.2-Air302(NB-IOT)-基础外设-PWM输出
- API可视化管理平台YApi
- BootStrap应用开发学习入门
- 为什么要学习现代控制理论(机器人方向)?
- 2.XML之编程解析示例笔记
- XML快速入门学习笔记
- Fuzz入门以及在渗透测试中重要性
- 程序设计语言介绍及调试技巧
- 项目开发学习与总结