增加 UIButton 的點擊範圍

来源:互联网 发布:淘宝供销平台一件代发 编辑:程序博客网 时间:2024/05/01 03:22

有時候我們希望讓 UIButton 的點擊範圍比視覺上還要大

此時可以對 UIButton 建立一個 Category

新增一些 method 來設定點擊範圍

實作

最理想狀況是可以分別控制上下左右的延長範圍

@interface UIButton(EnlargeTouchArea)@end@implementation UIButton(EnlargeTouchArea)static char topNameKey;static char rightNameKey;static char bottomNameKey;static char leftNameKey;- (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

原理

利用 objective-c 中的 objc_setAssociatedObject 來記錄要變大的範圍。

objc_setAssociatedObject 是 objective-c runtime library 裡面的 function。

要使用需要import:

#import <objc/runtime.h>

最後,最重要的是去 override - (UIView) hitTest:(CGPoint) point withEvent:(UIEvent) event

用新設定的 Rect 來當做點擊範圍。

How to use

在建立 Button 時,就可以直接設定 Button 的點擊範圍

UIButton* enlargeButton1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    [enlargeButton1 setTitle:@"Enlarge Button" forState:UIControlStateNormal];    [enlargeButton1 setFrame:CGRectMake(90, 150, 100, 50)];    [enlargeButton1 addTarget:self action:@selector(onButtonTap:) forControlEvents:UIControlEventTouchUpInside];    [enlargeButton1 sizeToFit];    [self.view addSubview:enlargeButton1];    // 增加 button 的點擊範圍    [enlargeButton1 setEnlargeEdgeWithTop:20 right:20 bottom:20                                     left:0];


0 0
原创粉丝点击