增加 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
- 增加 UIButton 的點擊範圍
- UIButton 等控件 增加事件的方法
- 为UIButton增加可传递的参数
- UIButton增加响应区域
- 键盘增加监听,UIButton随键盘位移
- Ios开发Swift自定义UIbutton增加一个能设置高亮状态下背景颜色的方法
- UIButton的使用
- UIButton的使用
- UIButton的选中功能
- 不規則形狀的UIButton
- UIButton的title设置
- UIButton 使用的感受
- 扩展UIButton的属性
- 禁用UIButton的方法
- UIButton 的accessibilityValue
- iOS UIButton的重写
- UIButton的使用
- 禁用UIButton的方法
- M3U8格式讲解及实际应用分析
- Java Swing中的透明窗体(Windows中消息提示框的制作)
- MFC控件之ListBox
- C# VB 正则表达式语法 微软官方 vs2008
- 使用SDK Manager更新时出现问题
- 增加 UIButton 的點擊範圍
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
- 非比例合约分保
- 修改MyEclipse的maven仓库路径
- SendMessage、PostMessage原理
- dom4j解析xml字符串实例
- APP开发新手应该知道的5件事
- 网络爬虫你知道多少?
- servlet 重定向(redirect)