iOS扩大按钮的点击范围

2021-03-16  本文已影响0人  小荣袁

前言

/// 返回视图层次结构(包括它自己)中包含指定点的接收方的最远后代。
func hitTest(_ point: CGPoint, 
        with event: UIEvent?) -> UIView?

实现方案

open class EnlargeEdgeButton: UIButton {
    
    open var enlargeEdge: UIEdgeInsets = .zero
    
    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if alpha == 0 || isHidden == true || enlargeEdge == .zero {
            return super.hitTest(point, with: event)
        }
        let rect = bounds.enlargeRect(edgeInsets: enlargeEdge)
        return rect.contains(point) ? self : nil
    }
}

extension CGRect {
    public func enlargeRect(edgeInsets: UIEdgeInsets) -> CGRect {
        return CGRect(x: minX - edgeInsets.left, y: minY - edgeInsets.top, width: width + (edgeInsets.left + edgeInsets.right), height: height + (edgeInsets.top + edgeInsets.bottom))
    }
}
  1. alpha == 0,透明度为0时,相当是按钮是看不见的,那么这时,我们的期望时按钮是隐藏状态的,如果这里加了扩大按钮点击范围的代码,会导致虽然按钮是隐藏的,但是点击按钮的放大区域,还是会响应事件,这会出现一个非常奇怪的bug,而且bug还不好找,本人在工作中就出现过这个失误
    2.isHidden == true,同理,隐藏状态时更不应该去扩大点击范围了
    3.enlargeEdge == .zero,扩大区域的edge为.zero,相当于是没有加点击范围,那就可以直接调用父类方法,不做额外处理

分类 VS 子类化

上一篇 下一篇

猜你喜欢

热点阅读