iOS 扩大点击区域

UIControl+OMTExtension.h

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

#import 

@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 

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 扩大点击区域)