为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
iOS

在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大UIButton的响应范围,下面有两个解决办法:

 

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

.h文件


#import <UIKit/UIKit.h> 
@interface UIButton (EnlargeTouchArea) 
- (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left; 
- (void)setEnlargeEdge:(CGFloat) size; 
@end


.m文件

//
//  UIButton+EnlargeTouchArea.m
//  HeBeiFM////  Created by Apple on 16/4/27.
//  Copyright © 2016年 Apple. All rights reserved.
// #import "UIButton+EnlargeTouchArea.h"#import <objc/runtime.h> 
@implementation UIButton (EnlargeTouchArea) 
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;
    }
} 
- (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



使用方法:

    UIButton *button = [UIButton new];
    [button setEnlargeEdge:20];    //或者
    [button setEnlargeEdgeWithTop:20 right:20 bottom:20 left:20];

 

 

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

使用时继承于此类即可

.h文件

#import <UIKit/UIKit.h> 
@interface BiggerClickAreaButton : UIButton 
@end

.m文件

#import "BiggerClickAreaButton.h"
 @implementation BiggerClickAreaButton 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event{
    CGRect bounds = self.bounds;    //若原热区小于44x44,则放大热区,否则保持原大小不变
    CGFloat widthDelta = MAX(44.0 - bounds.size.width, 0);
    CGFloat heightDelta = MAX(44.0 - bounds.size.height, 0);
    bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);    
    return CGRectContainsPoint(bounds, point);
} 
 
@end

使用时直接继承创建即可

作者:Jaycee麦子

原文链接:https://www.cnblogs.com/rglmuselily/p/9543075.html

 


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消