美文网首页iOS
iOS 扩大点击区域

iOS 扩大点击区域

作者: yizhaorong | 来源:发表于2017-04-07 15:52 被阅读11次

UIControl+OMTExtension.h

//
//  UIControl+OMTExtension.h
//  OneMTDemo
//
//  Created by yizhaorong on 2017/4/7.
//  Copyright © 2017年 onemt. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIControl (OMTExtension)

@property (nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;

@property (nonatomic, assign) BOOL debugHitTestEdgeInsets;

@end

UIControl+OMTExtension.m

//
//  UIControl+OMTExtension.m
//  OneMTDemo
//
//  Created by yizhaorong on 2017/4/7.
//  Copyright © 2017年 onemt. All rights reserved.
//

#import "UIControl+OMTExtension.h"
#import <objc/runtime.h>

static NSString *const kHitTestEdgeInsetsKey = @"hitTestEdgeInsets";

static NSString *const kDebugHitTestEdgeInsetsKey = @"debugHitTestEdgeInsets";

static NSString *const kDebugLayerName = @"kDebugLayerName";

@implementation UIControl (OMTExtension)

- (void)setHitTestEdgeInsets:(UIEdgeInsets)hitTestEdgeInsets {
    NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];
    objc_setAssociatedObject(self, &kHitTestEdgeInsetsKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIEdgeInsets)hitTestEdgeInsets {
    NSValue *value = objc_getAssociatedObject(self, &kHitTestEdgeInsetsKey);
    if(value) {
        UIEdgeInsets edgeInsets;
        [value getValue:&edgeInsets];
        return edgeInsets;
    }else {
        return UIEdgeInsetsZero;
    }
}

- (void)setDebugHitTestEdgeInsets:(BOOL)debugHitTestEdgeInsets {
    NSValue *value = [NSValue value:&debugHitTestEdgeInsets withObjCType:@encode(BOOL)];
    objc_setAssociatedObject(self, &kDebugHitTestEdgeInsetsKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)debugHitTestEdgeInsets {
    NSValue *value = objc_getAssociatedObject(self, &kDebugHitTestEdgeInsetsKey);
    if(value) {
        BOOL debugEdgeInsets;
        [value getValue:&debugEdgeInsets];
        return debugEdgeInsets;
    }else {
        return NO;
    }
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden) {
        return [super pointInside:point withEvent:event];
    }
    
    CGRect relativeFrame = self.bounds;
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);
    
    if (self.debugHitTestEdgeInsets) {
        CALayer *layer = [self debugLayer];
        [layer removeFromSuperlayer];
        layer.frame = hitFrame;
        [self.layer insertSublayer:layer atIndex:0];
    }
    return CGRectContainsPoint(hitFrame, point);
}

- (CALayer *)debugLayer {
    CALayer *layer = nil;
    for (CALayer *subLayer in self.layer.sublayers) {
        if ([subLayer.name isEqualToString:kDebugLayerName]) {
            layer = subLayer;
            break;
        }
    }
    if (layer) return layer;
    layer = [CALayer layer];
    CGFloat red = arc4random_uniform(255) / 255.0;
    CGFloat green = arc4random_uniform(255) / 255.0;
    CGFloat blue = arc4random_uniform(255) / 255.0;
    layer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:0.5].CGColor;
    layer.name = kDebugLayerName;
    return layer;
}

@end

相关文章

  • iOS 扩大点击区域

    UIControl+OMTExtension.h UIControl+OMTExtension.m

  • iOS 扩大点击区域

    创建分类,使用objc运行时交换 - (BOOL)pointInside:(CGPoint)point withE...

  • 点击区域扩大

    之前有个需求,按钮很小会很难点到,于是就需要扩大点击区域,一个UIButton的分类和runtime能很好解决问题...

  • ios 扩大button的点击区域

    当UI设计图上的给出按钮尺寸较小,我们将对应的资源文件放入UIButton中,在真机调试中会发现难以点到按钮。这时...

  • ios扩大按钮的点击区域

    面试的时候,有一次被问到怎样扩大Button的点击区域,当时回答的不是让面试官很满意,现在来总结一下。在网上看了很...

  • UIButton扩大默认点击区域

    在iOS开发中,经常遇到按钮的点击区域太小,无法达到一个良好的交互效果,通过如下方式扩大点击区域:

  • 扩大按钮点击区域

    参考自印第安的老斑鸠 参考了很多的文章,主要是有三个方法: 例如:按钮的大小是25pt * 25pt,想要的点击范...

  • 扩大视图点击区域

    导语 在工作中,经常创建一些视图(比如button),这时button很小,点击时,总感到不精准,有时我们会在这个...

  • 扩大UIButton点击区域

    当设计图上的给出按钮尺寸较小,我们将对应的资源文件放入UIButton中,比如只有12x12pt,在真机调试中会发...

  • 扩大button点击区域

网友评论

    本文标题:iOS 扩大点击区域

    本文链接:https://www.haomeiwen.com/subject/rdmhattx.html