Runtime实现UIButton扩大点击区(Swift)
程序员文章站
2022-06-01 15:01:59
...
问题:按钮点击区域过小,想自己控制按钮的点击区域大小。(采用Runtime运行时)
解决:
import UIKit
import ObjectiveC.runtime
extension UIButton {
///提供多个运行时的key
struct RuntimeKey {
static let btnKey = UnsafeRawPointer.init(bitPattern: "BTNKey".hashValue)
}
///提供属性供外部设置
var hitTestEdgeInsets: UIEdgeInsets? {
set {
objc_setAssociatedObject(self, RuntimeKey.btnKey!, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY)
}
get {
return (objc_getAssociatedObject(self, RuntimeKey.btnKey!) as? UIEdgeInsets) ?? UIEdgeInsets.zero
}
}
///重写点是否包含在view的区域内
open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
if UIEdgeInsetsEqualToEdgeInsets(hitTestEdgeInsets!, UIEdgeInsets.zero) || !isEnabled || isHidden {
return super.point(inside: point, with: event)
}
let relativeFrame = bounds
let hitFrame = UIEdgeInsetsInsetRect(relativeFrame, hitTestEdgeInsets!)
return hitFrame.contains(point)
}
}
用法如下:
btn.hitTestEdgeInsets = UIEdgeInsets(top: -100, left: -100, bottom: -100, right: -100)