Runtime實現UIButton擴大點選區(Swift)
阿新 • • 發佈:2019-01-08
問題:按鈕點選區域過小,想自己控制按鈕的點選區域大小。(採用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)