iOS 扩大UIButton的点击范围

148 阅读1分钟

给UIButton添加一个扩展

extension UIButton {
    private struct customEdgeInset {
        static var top: String = "topkey"
        static var left: String = "leftkey"
        static var right: String = "rightkey"
        static var bottom: String = "bottomkey"
    }
    
    func setClcikEdgeInset(_ top: CGFloat, _ left: CGFloat, _ right: CGFloat, _ bottom: CGFloat) {
        objc_setAssociatedObject(self, &customEdgeInset.top, top, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        objc_setAssociatedObject(self, &customEdgeInset.left, left, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        objc_setAssociatedObject(self, &customEdgeInset.right, right, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        objc_setAssociatedObject(self, &customEdgeInset.bottom, bottom, .OBJC_ASSOCIATION_COPY_NONATOMIC)
    }

     func getCurrentRect() -> CGRect {
        let top = objc_getAssociatedObject(self, &customEdgeInset.top) as? CGFloat ?? 0
        let left = objc_getAssociatedObject(self, &customEdgeInset.left) as? CGFloat ?? 0
        let right = objc_getAssociatedObject(self, &customEdgeInset.right) as? CGFloat ?? 0
        let bottom = objc_getAssociatedObject(self, &customEdgeInset.bottom) as? CGFloat ?? 0

        if top > 0 || left > 0 || right > 0 || bottom > 0 {
            return CGRect(x: self.bounds.origin.x - left, y: self.bounds.origin.y - top, width: self.bounds.size.width + left + right, height: self.bounds.size.height + top + bottom)
        }else{
            return self.bounds
        }
    }

    open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        return getCurrentRect().contains(point)
    }

//    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
//        let rect = getCurrentRect()
//        if rect.contains(point) {
//            return self
//        }
//        return nil
//    }
}

在控制器中用到的地方调用

        let btn = UIButton()
        btn.backgroundColor = UIColor.red
        btn.frame = CGRect(x: 100, y: 200, width: 50, height: 50)
        view.addSubview(btn)
        btn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
        btn.setClcikEdgeInset(30, 30, 30, 30)