zoukankan      html  css  js  c++  java
  • 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

    #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

    使用时直接继承创建即可

    三、声明

    本文转载自:https://www.cnblogs.com/rglmuselily/p/9543075.html

  • 相关阅读:
    php 文件直接下载
    公钥、私钥与数字签名
    php swoole 安装与使用
    06-Ubuntu18.04&16.04安装PHP(7.0|7.1|7.2|7.3)
    解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)错误
    浏览器禁用返回按钮
    js 鼠标放上选中
    vue 组件切换
    VSCode常用设置
    How to use electron-builder in a Vue project
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/9590599.html
Copyright © 2011-2022 走看看