swift4.0

Hit-test view扩大UIButton的响应热区

2018-05-30  本文已影响47人  279cb620c509

相信大家都遇到小图button点击热区太小问题,各种计算不说,写出的代码还很难看不便于维护,如果我们用用hit-test view的知识你就能轻松地解决这个问题。

直接上代码 我用的extension UIButton ,也可自行调整到自定义button中


extension UIButton {   

    struct RuntimeKey {

        static let minimumHitTestWidth = UnsafeRawPointer.init(bitPattern: "minimumHitTestWidth".hashValue)

        static let minimumHitTestHeight = UnsafeRawPointer.init(bitPattern: "minimumHitTestHeight".hashValue)     

    }

    var minimumHitTestWidth:CGFloat {

        set {

            objc_setAssociatedObject(self, UIButton.RuntimeKey.minimumHitTestWidth!, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)

        }



        get {



            return  objc_getAssociatedObject(self, UIButton.RuntimeKey.minimumHitTestWidth!) as? CGFloat ?? 40

        }

    }

    var minimumHitTestHeight:CGFloat {

        set {

            objc_setAssociatedObject(self, UIButton.RuntimeKey.minimumHitTestHeight!, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)

        }       

        get {

            return  objc_getAssociatedObject(self, UIButton.RuntimeKey.minimumHitTestHeight!) as? CGFloat ?? 40

        }

    }   

    override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        return hitTestingBounds(self.bounds, self.minimumHitTestWidth, self.minimumHitTestHeight).contains(point)

    }

    func hitTestingBounds(_ bounds:CGRect,_ minimumHitTestWidth:CGFloat,_ minimumHitTestHeight:CGFloat) -> CGRect {

        var hitTestingBounds : CGRect = bounds;

        if (minimumHitTestWidth > bounds.size.width) {

            hitTestingBounds.size.width = minimumHitTestWidth;

            hitTestingBounds.origin.x -= (hitTestingBounds.size.width - bounds.size.width)/2;

        }

        if (minimumHitTestHeight > bounds.size.height) {

            hitTestingBounds.size.height = minimumHitTestHeight;

            hitTestingBounds.origin.y -= (hitTestingBounds.size.height - bounds.size.height)/2;

        }

        return hitTestingBounds; 

    }



}

上一篇 下一篇

猜你喜欢

热点阅读