美文网首页swift4.0
Hit-test view扩大UIButton的响应热区

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

作者: 279cb620c509 | 来源:发表于2018-05-30 11:43 被阅读47次

    相信大家都遇到小图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; 
    
        }
    
    
    
    }
    
    

    相关文章

      网友评论

        本文标题:Hit-test view扩大UIButton的响应热区

        本文链接:https://www.haomeiwen.com/subject/imytsftx.html