• iOS之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

    使用时直接继承创建即可

  • 相关阅读:
    LeetCode——Merge Two Sorted Lists
    【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之中的一个:WiFi UDP和TCP
    Java 中最常见的 5 个错误
    Linux 设备驱动的固件载入
    kettle的job中使用循环
    Servlet 容器对URI的处理
    友元函数友元类.
    【批量加入】-拼接sql字符串
    java JSONObject/JSONArray详解
    java 中文转化为拼音
  • 原文地址:https://www.cnblogs.com/rglmuselily/p/9543075.html
Copyright © 2020-2023  润新知