文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-05-17 03:32

关注

在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大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

使用时直接继承创建即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯