当前位置: 首页 > news >正文

太原市住房和城乡建设局的网站曼联目前积分榜

太原市住房和城乡建设局的网站,曼联目前积分榜,外贸新手入门必读,网站优化系统在iOS开发中,有时会将一个UIButton的外观设置成很小,从而使其点按操作变得很不容易,因为点按的区域是根据UIButton的frame决定的。解决这个问题的办法一般是把button的frame放大,然后把里面的内容缩小,但是这样做总是感…


  在iOS开发中,有时会将一个UIButton的外观设置成很小,从而使其点按操作变得很不容易,因为点按的区域是根据UIButton的frame决定的。解决这个问题的办法一般是把button的frame放大,然后把里面的内容缩小,但是这样做总是感觉不伦不类,还需要分别重新调整Button的frame和显示内容的frame,比较麻烦。今天笔者在外国网站总结了一种方法,通过OC创建类别的方式,运用Runtime关联对象的方法,对UIButton进行了扩展 ,创建一个方法直接用于扩大Button的点按区域,而不改变它的显示内容,使代码的可读性大大增强。

       其执行原理为:OC中创建类别(Categroy)的方式,并不允许给已有的类扩展属性,只可以给其扩展方法。所以,需要使用Runtime“黑魔法”中的关联对象(Associative Object)的一些方法,动态地为某个button对象添加扩展距离的属性,然后检测UITouch事件的触摸点是否在我们扩展距离后Rect内,从而达到想要的效果。

       首先,创建一个UIButton的Category,起名为EnlargeTouchArea,设置一个外界可访问的方法setEnlaEdgeWithTop:right:bottom:left,在使用时也只需使用这个方法即可,传入的四个参数分别是上、右、下、左的扩展距离。

[objc] view plaincopy
  1. //  UIButton+EnlargeTouchArea.h  
  2.   
  3. #import <Foundation/Foundation.h>  
  4. #import <UIKit/UIKit.h>  
  5.   
  6. @interface UIButton (EnlargeTouchArea)  
  7.   
  8. - (void)setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left;  
  9.   
  10. @end  
 

        然后导入<objc/runtime.h>,所有Runtime的黑魔法都在这里

[objc] view plaincopy
  1. //  UIButton+EnlargeTouchArea.m  
  2.   
  3. #import "UIButton+EnlargeTouchArea.h"  
  4.   
  5. #import <objc/runtime.h>  
  6. @implementation UIButton (EnlargeTouchArea)  
  7.   
  8.   
  9. static char topNameKey;  
  10. static char rightNameKey;  
  11. static char bottomNameKey;  
  12. static char leftNameKey;  


        objc_setAssociatedObject是一个C语言函数,这个函数被称之为“关联API”,它的作用是把top、right、bottom、left这四个从外界获取到的值与本类(self)关联起来,然后设置一个static char作为能够找到他们的Key

[objc] view plaincopy
  1. - (void) setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left  
  2. {  
  3.     objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);  
  4.     objc_setAssociatedObject(self, &rightNameKey, [NSNumber numberWithFloat:right], OBJC_ASSOCIATION_COPY_NONATOMIC);  
  5.     objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:bottom], OBJC_ASSOCIATION_COPY_NONATOMIC);  
  6.     objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:left], OBJC_ASSOCIATION_COPY_NONATOMIC);  
  7. }  


       objc_getAssociatedObject同样也是一个关联API(c语言函数),它可以通过刚刚设置的Key找到上个方法中从外界传入的top、right、bottom、left,这个api和obj_setAssociatedObject一起使用就可以达到给已有类扩展属性的效果。最后我们通过self.bounds设置一个新的CGRect,作为扩大后的点按区域,并且返回

[objc] view plaincopy
  1. - (CGRect) enlargedRect  
  2. {  
  3.     NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);  
  4.     NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);  
  5.     NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);  
  6.     NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);  
  7.     if (topEdge && rightEdge && bottomEdge && leftEdge)  
  8.     {  
  9.         return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,  
  10.                           self.bounds.origin.y - topEdge.floatValue,  
  11.                           self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,  
  12.                           self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);  
  13.     }  
  14.     else  
  15.     {  
  16.         return self.bounds;  
  17.     }  
  18. }  

        

       这个方法UIView的一个实例方法,作用是,捕获当前的UITouch事件中的触摸点,检测它是否在最上层的子视图内,如果不是的话就递归检测其父视图。这样的话,我们就只是将当前某一个触摸的point与某一个rect进行比较,并没有改变Button真实的frame,从而真正的从逻辑上达到了只是扩大点按区域的效果。

[objc] view plaincopy
  1. - (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event  
  2. {  
  3.     CGRect rect = [self enlargedRect];  
  4.     if (CGRectEqualToRect(rect, self.bounds))  
  5.     {  
  6.         return [super hitTest:point withEvent:event];  
  7.     }  
  8.     return CGRectContainsPoint(rect, point) ? self : nil;  
  9. }  

        总结一下,为什么要用runtime去为已有类达到一个扩展属性的效果呢,正是因为上面这个方法,这个系统提供的方法并没有提供接受其他参数的地方,而我们却必须要指定一个扩大的区域作为参数,所以就必须为这个类扩展一个新的属性。



http://www.lbrq.cn/news/2762839.html

相关文章:

  • 政府门户网站建设的意义东营网站建设
  • EDI许可证需要的网站怎么做上海网站建设费用
  • 厦门高端网站建设广州今天新闻
  • 汕头网站优化系统今日热点头条
  • 网站改版 更换域名网络运营推广是做什么的
  • 金华网站制作教育培训机构推荐
  • 上海网站建设公司如何创建微信小程序
  • 在线网站建设询问报价爱站seo工具
  • 网站后台编辑器无法显示南宁在哪里推广网站
  • 西部数据网站助手十大小说网站排名
  • 企业网站怎么做跟淘宝链接介绍产品的营销推文
  • 怎么查看网站谁做的如何使用免费b站推广网站
  • 单页式网站补肾壮阳吃什么药效果好
  • 如何让人帮忙做网站新闻发稿发布平台
  • wordpress 后台攻击seo优化网站百度技术
  • 牟平建设局网站北留德庄株洲最新今日头条
  • 洪山区建设局网站网站seo关键词排名查询
  • 沈阳制作网站的公司网推一手单渠道
  • 男女做的羞羞事的网站添加友情链接的技巧
  • 在常州 做兼职上什么网站百度首页百度
  • 嘉祥网站建设哪家好舆情危机公关公司
  • 专业做甜点的网站广告公司经营范围
  • 编程 给别人做网站中国万网登录入口
  • 做高端企业网站哪家网站优化公司好
  • 自己制作网站该怎么做乔拓云网站建设
  • 免费做视频网站如何创造一个自己的网站
  • 网站搜索引擎优化起名最好的网站排名
  • wordpress 修改版权台州网站建设优化
  • wordpress图标居中江阴网站优化公司
  • 天猫网站建设分析公司网站推广
  • go语言条件语if …else语句
  • 数据结构:查找表
  • 生成模型实战 | InfoGAN详解与实现
  • 模拟实现 useEffect 功能
  • 软件的终极:为70亿人编写70亿个不同的软件
  • 什么是微前端?