本文主要是介绍UIButton 扩大按钮的响应区域,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大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
使用时直接继承创建即可
这篇关于UIButton 扩大按钮的响应区域的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!