美文网首页
响应链(II)

响应链(II)

作者: Harely | 来源:发表于2019-10-06 20:15 被阅读0次

扩大UIButton的响应区

  通过重载UIButton的 -(BOOL) pointInside: withEvent:方法,让Point即使落在Button的Frame外围也返回YES。

创建一个UIButton的分类:

UIButton+ ExtendResponseArea.h 文件

#import <UIKit/UIKit.h>

@interface UIButton (ExtendResponseArea)

@property (nonatomic) CGFloat responseAreaWidth;
@property (nonatomic) CGFloat responseAreaHeight;

@end

UIButton+ ExtendResponseArea.m 文件

#import "UIButton+ ExtendResponseArea.h"
#import <objc/runtime.h>

@implementation UIButton (ExtendResponseArea)


- (CGFloat)minHitTestWidth {
    NSNumber * width = objc_getAssociatedObject(self, @selector(responseAreaWidth));
    return [width floatValue];
}

- (void)setMinHitTestWidth:(CGFloat) responseAreaWidth {
    objc_setAssociatedObject(self, @selector(responseAreaWidth), [NSNumber numberWithFloat: responseAreaWidth], OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)minHitTestHeight {
    NSNumber * height = objc_getAssociatedObject(self, @selector(responseAreaHeight));
    return [height floatValue];
}

- (void)setMinHitTestHeight:(CGFloat) responseAreaHeight {
    objc_setAssociatedObject(self, @selector(responseAreaHeight), [NSNumber numberWithFloat: responseAreaHeight], OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event {
    
    return CGRectContainsPoint(NewBounds(self.bounds, self. responseAreaWidth, self. responseAreaHeight), point);
}

CGRect NewBounds(CGRect bounds, CGFloat responseAreaWidth, CGFloat responseAreaHeight) {
    
    CGRect clickBounds = bounds;
    if (responseAreaWidth > bounds.size.width) {
        clickBounds.size.width = responseAreaWidth;
        clickBounds.origin.x -= (responseAreaWidth.size.width - bounds.size.width)/2;
    }
    if (responseAreaHeight > bounds.size.height) {
        clickBounds.size.height = responseAreaHeight;
        clickBounds.origin.y -= (responseAreaHeight.size.height - bounds.size.height)/2;
    }
    return hitTestingBounds;
}

@end

调用

    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 20, 20);
    button.backgroundColor = [UIColor yellowColor];
    [button addTarget:self action:@selector(testButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    button. responseAreaWidth = 80;
    button. responseAreaHeight = 80;


- (void)testButtonAction:(UIButton *)button {
    NSLog(@"我要点击了 !!!!");
}



相关文章

网友评论

      本文标题:响应链(II)

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