iOS扩大UIButton的点击的响应范围

栏目: IOS · 发布时间: 8年前

内容简介:开发过程中经常遇到今天的文章和大家分享一下解决这种问题的代码注意:

开发过程中经常遇到 UIButton 点击区域太小 又不想 改动按钮的大小.

今天的文章和大家分享一下解决这种问题的代码

实现思路

hitTest:

第一种方式

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
 let biggerButtonFrame = theButton.frame.insetBy(dx: -30, dy: -30) // 1
 if biggerButtonFrame.contains(point) { // 2
 return theButton // 3
 } 
 return super.hitTest(point, with: event) // 4
}
    1. 让theButton的 x 扩大 30, y 扩大 30 (正数为缩小 负数为放大. 然后宽高 分别是2 30和 2 30)
    1. 判断点击的位置是否在放大完的frame内.
    1. 如果是 就返回button
    1. 不是的话让事件继续传递

注意: 这里没判断 theButton.alpha == 0 和 theButton.userInterface.. == YES 还有它是否可见之类的,请自行判断

第二种方式

复写UIView的point:方法

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
 let biggerFrame = bounds.insetBy(dx: -30, dy: -30)

 return biggerFrame.contains(point)
}

OC的版本是这样

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
 //这里写上
 
 CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>)
 ...
}

但是 第二种方式 其实 是 hitTest:方法调用之前UIView的判断,它判断当前点击的point是否在这个UIView上.

不过 还是推荐第一种方式

核心代码

其实 最核心的代码是

CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>)

CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy)是以rect为中心,根据dx和dy来实现缩小。

如果dx 和 dy是负数 则放大 ,正数则缩小

但是大家可能很疑惑 那宽度和高度怎么 缩小放大

首先: 我们明确 这个API的含义 只要传入正数 它就缩放 那么 宽高也会适当前传入的dx和dy来决定 缩放比

因为是中心点缩放 所以宽高 要 X 2 ,因为有两侧嘛,左侧缩小30右侧也需要缩小30,上部和底部是一样的.

大家可自行查阅google看下

全文完


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

生命3.0

生命3.0

[美] 迈克斯·泰格马克 / 汪婕舒 / 浙江教育出版社 / 2018-6 / 99.90元

《生命3.0》一书中,作者迈克斯·泰格马克对人类的终极未来进行了全方位的畅想,从我们能活到的近未来穿行至1万年乃至10 亿年及其以后,从可见的智能潜入不可见的意识,重新定义了“生命”“智能”“目标”“意识”,并澄清了常见的对人工智能的误解,将帮你构建起应对人工智能时代动态的全新思维框架,抓住人类与人工智能共生演化的焦点。 迈克斯·泰格马克不仅以全景视角探讨了近未来人工智能对法律、战争、就业和......一起来看看 《生命3.0》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试