UIButtonのコツ---クリックイベントの範囲


UIButtonのテクニック-クリックイベントの範囲
の原因となる
開発中にUIbuttonのクリックイベントに対して、ボタンが小さすぎて簡単にクリックできない場合があり、クリックの範囲を拡大したい.
ソリューション
Categoryを追加することにより,pointInside: withEvent:メソッドを書き換え,クリックした位置が応答したいイベントのある範囲にあるか否かを判断することにより,所望の範囲内でイベントに応答し,二度と応答しない.
コード#コード#
#import 

@interface UIButton (TouchScope)

- (void)expandTouchScope:(UIEdgeInsets)edgeInsets;

@end
#import "UIButton+TouchScope.h"
#import 

static NSString *expandRectXKey = @"expandRectX";
static NSString *expandRectYKey = @"expandRectY";
static NSString *expandRectWidthKey = @"expandRectWidthKey";
static NSString *expandRectHeightKey = @"expandRectHeightKey";

@implementation UIButton (TouchScope)

- (void)expandTouchScope:(UIEdgeInsets)edgeInsets {
    objc_setAssociatedObject(self,
                             &expandRectYKey,
                             [NSNumber numberWithFloat:self.bounds.origin.y - edgeInsets.top],
                             OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self,
                             &expandRectXKey,
                             [NSNumber numberWithFloat:self.bounds.origin.x - edgeInsets.left],
                             OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self,
                             &expandRectWidthKey,
                             [NSNumber numberWithFloat:self.frame.size.width + edgeInsets.left + edgeInsets.right],
                             OBJC_ASSOCIATION_COPY_NONATOMIC);
    objc_setAssociatedObject(self,
                             &expandRectHeightKey,
                             [NSNumber numberWithFloat:self.frame.size.height + edgeInsets.top + edgeInsets.bottom],
                             OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (CGRect)expandRect {
    NSNumber *expandRectX = objc_getAssociatedObject(self, &expandRectXKey);
    NSNumber *expandRectY = objc_getAssociatedObject(self, &expandRectYKey);
    NSNumber *expandRectWidth = objc_getAssociatedObject(self, &expandRectWidthKey);
    NSNumber *expandRectHeight = objc_getAssociatedObject(self, &expandRectHeightKey);
    return CGRectMake(expandRectX.floatValue,
                      expandRectY.floatValue,
                      expandRectWidth.floatValue,
                      expandRectHeight.floatValue);
}

//          
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    CGRect buttonRect = [self expandRect];
    if (CGRectEqualToRect(buttonRect, self.bounds)) {
        return [super pointInside:point withEvent:event];
    }
    return CGRectContainsPoint(buttonRect, point) ? YES : NO;
}

@end

適用
 [button expandTouchScope:UIEdgeInsetsMake(20, 20, 20, 20)];

赤いエリアはButton、青いエリアは外に広がる20のクリック範囲です.青、赤の範囲でイベントに応答できるように設定します.