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;
}
}