给UIButton 建立一个Category
--UIButton+EnlargeEdge.h
#import <objc/runtime.h>
@interface UIButton (EnlargeEdge)
- (void)setEnlargeEdge:(CGFloat) size;
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;
@end
--UIButton+EnlargeEdge.m
#import "UIButton+EnlargeEdge.h"
@implementation UIButton (EnlargeEdge)
static char topNameKey;
static char rightNameKey;
static char bottomNameKey;
static char leftNameKey;
- (void)setEnlargeEdge:(CGFloat) size
{
objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left
{
objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);
objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (CGRect)enlargedRect
{
NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);
NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);
NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);
NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);
if (topEdge && rightEdge && bottomEdge && leftEdge)
{
return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,
self.bounds.origin.y - topEdge.floatValue,
self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,
self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);
}
else
{
return self.bounds;
}
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect rect = [self enlargedRect];
if (CGRectEqualToRect(rect, self.bounds))
{
return [super pointInside:point withEvent:event];
}
return CGRectContainsPoint(rect, point) ? YES : NO;
}
/*
- (UIView*)hitTest:(CGPoint) point withEvent:(UIEvent*) event
{
CGRect rect = [self enlargedRect];
if (CGRectEqualToRect(rect, self.bounds))
{
return [super hitTest:point withEvent:event];
}
return CGRectContainsPoint(rect, point) ? self : nil;
}*/
@end
原理
利用 objective-c 中的 objc_setAssociatedObject 來記錄要變大的範圍。
objc_setAssociatedObject 是 objective-c runtime library 裡面的 function。
需要#import <objc/runtime.h>
最后,最重要的是去 override - (UIView) hitTest:(CGPoint) point withEvent:(UIEvent) event
用新设定的 Rect 来当着点击范围。
使用
[enlargeButton setEnlargeEdge:20.0];
或者[enlargeButton setEnlargeEdgeWithTop:20 right:20 bottom:20 left:10];
相关推荐
借鉴相关资料,整理了一个很有意思的button动画效果,iOS自定义UIButton点击动画特效 先看一下效果图: 下面贴上代码: ViewController: #import @interface ViewController : UIViewController @end #import ...
iOS UIButton扩大按钮响应区域的解决方法 iOS UIButton扩大按钮响应区域的解决方法是iOS开发中一个常见的问题。在开发中,我们经常会遇到设计图中的按钮设计特别小,这时我们需要手动扩大UIButton的响应范围。扩大...
`UIButton`是Apple提供的一个基础UI组件,用于展示文本、图像或者两者结合,并响应用户的触摸事件。本文将深入探讨如何自定义`UIButton`,并结合项目`BAButton-master`进行实例解析。 首先,自定义`UIButton`的基本...
应用场景:向服务器提交数据时(发表动态,上传个人信息....) 优点:防止发表同一样帖子,并且减少服务器的负担.
IOS购物车UIButton版本备忘笔录UIButton代码://别忘了调用父类的layoutSubviews方法//设置图片及文字的位置大小//获取数据进按钮
在iOS开发中,`UIButton` 是一个常用的控件,用于创建用户交互按钮。本文将详细讲解如何实现`UIButton`左边显示图片,图片后面紧接着显示文字的效果,类似于微信“发现”功能中的样式。这个效果通过调整`UIButton`的...
总结一下,本篇文章主要介绍了如何在iOS开发中对`UIButton`进行自定义,包括设置部分圆角、扩大响应范围以及实现发送验证码的倒计时功能。通过这些技巧,开发者可以为用户提供更加丰富和人性化的交互体验。在实际...
* 自定义图片上下左右位置 * 自定义文字和图片间距 * 自定义角标动画 * 支持CocoaPods github地址: https://github.com/JunAILiang/JMButton 简书地址: https://www.jianshu.com/p/ba8e986cdd0c ...
大家都知道UIButton按钮是IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用。 一、iOS设置UIButton的字体大小 btn.frame = CGRectMake(x, y, width, ...
项目中经常遇到要增大button点击面积的场景,用swift的runtime实现了一个,直接给button的enlarge属性赋值就可以GitHub地址:https://github.com/Yamyee/UIButton-TouchArea
在iOS开发中,UIButton是用户界面中非常常见且重要的组件,用于接收用户的点击操作并触发相应的事件处理。然而,有时可能会遇到UIButton点击时出现卡顿或延迟的现象,这会极大地影响用户体验。本篇文章将深入探讨这...
分享一个小demo
在iOS应用开发中,UI设计和交互是至关重要的部分,其中按钮(UIButton)是最常见的交互元素之一。在某些场景下,比如用户注册或找回密码时,我们常常需要一个具有倒计时功能的按钮,以便在用户点击获取验证码后,...
测试时候 按钮连续点击的时候 会出现问题,前期没做好处理,最好 只能runtime hook了一下,category 拖进项目即可,简单粗暴。修复了不能设置间隔时间的bug,由于直接使用,就没有效果图啦。。。
在iOS开发中,`UIButton` 是一个非常常用的控件,用于创建用户交互的按钮。它允许我们添加文本和图像,并且可以根据需要自定义其布局和样式。本篇将深入讲解如何利用 `UIEdgeInsets` 来实现 `UIButton` 上的文字和...
相信每位iOS开发者都知道在UIButton中可以设置图片和文字,也经常见到同时设置有图片和下方提示文字的按钮,但是当我自己去对图片按钮添加提示文字的时候,却发现这并不是想象中的那么简单。怎么不简单呢?下面来...
在iOS应用开发中,UIButton是实现用户交互的重要组件,但有时可能会遇到按钮点击无响应的情况。这通常是由于几个常见的原因导致的,以下是一些解决此类问题的策略。 首先,检查按钮是否添加到了一个未开启用户交互...