欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

Runtime实现UIButton扩大点击区(Swift)