`

ios 扩大uibutton的响应区域

    博客分类:
  • ios
 
阅读更多

给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];

分享到:
评论

相关推荐

    iOS自定义UIButton点击动画特效

    借鉴相关资料,整理了一个很有意思的button动画效果,iOS自定义UIButton点击动画特效 先看一下效果图: 下面贴上代码: ViewController: #import @interface ViewController : UIViewController @end #import ...

    iOS UIButton扩大按钮响应区域的解决方法

    iOS UIButton扩大按钮响应区域的解决方法 iOS UIButton扩大按钮响应区域的解决方法是iOS开发中一个常见的问题。在开发中,我们经常会遇到设计图中的按钮设计特别小,这时我们需要手动扩大UIButton的响应范围。扩大...

    ios 自定义uibutton

    `UIButton`是Apple提供的一个基础UI组件,用于展示文本、图像或者两者结合,并响应用户的触摸事件。本文将深入探讨如何自定义`UIButton`,并结合项目`BAButton-master`进行实例解析。 首先,自定义`UIButton`的基本...

    ios-UIButton-响应延迟.zip

    应用场景:向服务器提交数据时(发表动态,上传个人信息....) 优点:防止发表同一样帖子,并且减少服务器的负担.

    zhengjie19901102#Objective-C#IOS购物车UIButton版本1

    IOS购物车UIButton版本备忘笔录UIButton代码://别忘了调用父类的layoutSubviews方法//设置图片及文字的位置大小//获取数据进按钮

    IOS开发UIButton(左边图片右边文字效果)

    在iOS开发中,`UIButton` 是一个常用的控件,用于创建用户交互按钮。本文将详细讲解如何实现`UIButton`左边显示图片,图片后面紧接着显示文字的效果,类似于微信“发现”功能中的样式。这个效果通过调整`UIButton`的...

    uibutton设置部分圆角,扩大响应范围,发送验证码倒计时

    总结一下,本篇文章主要介绍了如何在iOS开发中对`UIButton`进行自定义,包括设置部分圆角、扩大响应范围以及实现发送验证码的倒计时功能。通过这些技巧,开发者可以为用户提供更加丰富和人性化的交互体验。在实际...

    ios-超强UIButton封装(持续更新中....).zip

    * 自定义图片上下左右位置 * 自定义文字和图片间距 * 自定义角标动画 * 支持CocoaPods github地址: https://github.com/JunAILiang/JMButton 简书地址: https://www.jianshu.com/p/ba8e986cdd0c ...

    iOS设置UIButton文字显示位置和字体大小、颜色的方法

    大家都知道UIButton按钮是IOS开发中最常用的控件,作为IOS基础学习教程知识 ,初学者需要了解其基本定义和常用设置,以便在开发在熟练运用。 一、iOS设置UIButton的字体大小 btn.frame = CGRectMake(x, y, width, ...

    ios-UIButton TouchArea.zip

    项目中经常遇到要增大button点击面积的场景,用swift的runtime实现了一个,直接给button的enlarge属性赋值就可以GitHub地址:https://github.com/Yamyee/UIButton-TouchArea

    IOS 解决UIButton 点击卡顿/延迟的问题

    在iOS开发中,UIButton是用户界面中非常常见且重要的组件,用于接收用户的点击操作并触发相应的事件处理。然而,有时可能会遇到UIButton点击时出现卡顿或延迟的现象,这会极大地影响用户体验。本篇文章将深入探讨这...

    ios-UIButton Indicator.zip

    分享一个小demo

    swift-DFCountDownButton继承UIButton实现IOS倒计时按钮

    在iOS应用开发中,UI设计和交互是至关重要的部分,其中按钮(UIButton)是最常见的交互元素之一。在某些场景下,比如用户注册或找回密码时,我们常常需要一个具有倒计时功能的按钮,以便在用户点击获取验证码后,...

    ios-UIButton防止连续点击.zip

    测试时候 按钮连续点击的时候 会出现问题,前期没做好处理,最好 只能runtime hook了一下,category 拖进项目即可,简单粗暴。修复了不能设置间隔时间的bug,由于直接使用,就没有效果图啦。。。

    iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片上下垂直居中对齐

    在iOS开发中,`UIButton` 是一个非常常用的控件,用于创建用户交互的按钮。它允许我们添加文本和图像,并且可以根据需要自定义其布局和样式。本篇将深入讲解如何利用 `UIEdgeInsets` 来实现 `UIButton` 上的文字和...

    iOS如何将UIButton中的图片与文字上下对齐详解

    相信每位iOS开发者都知道在UIButton中可以设置图片和文字,也经常见到同时设置有图片和下方提示文字的按钮,但是当我自己去对图片按钮添加提示文字的时候,却发现这并不是想象中的那么简单。怎么不简单呢?下面来...

    iOS UIButton 点击无响应的解决办法

    在iOS应用开发中,UIButton是实现用户交互的重要组件,但有时可能会遇到按钮点击无响应的情况。这通常是由于几个常见的原因导致的,以下是一些解决此类问题的策略。 首先,检查按钮是否添加到了一个未开启用户交互...

Global site tag (gtag.js) - Google Analytics