1. 程式人生 > >Runtime實現UIButton擴大點選區(Swift)

Runtime實現UIButton擴大點選區(Swift)

問題:按鈕點選區域過小,想自己控制按鈕的點選區域大小。(採用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)