如何让UIButton响应触摸PNG图像的透明区域?

时间:2013-06-28 15:52:58

标签: ios uibutton uiimage uikit

如果你触摸没有图像alpha的地方,UIButton会忽略触摸。我可以更改它以响应其整个范围的触摸吗?

4 个答案:

答案 0 :(得分:9)

我实际上是这样做的,我将带有透明背景的图片放入UIImageView,然后将UIButton的{​​{1}}设置为backgroundColor。图像。这样,特别是对于小图像,我可以使“隐形”按钮更大,更容易为用户按下。

答案 1 :(得分:6)

  

如果你触摸没有图像alpha的地方,UIButton会忽略触摸。我可以更改它以响应其整个范围的触摸吗?

我认为一种简单的方法是将背景颜色设置为仅 透明的颜色。一个非常小但仍然大于0.1的alpha应该看起来透明,但仍然会对触摸做出反应。

否则,是的,您可以覆盖-hitTest:withEvent:,即使触摸的区域是透明的,也会返回YES。

答案 2 :(得分:0)

只需遵循Caleb的建议来覆盖hitTest并从Soroush Khanlou中汲取灵感,这可以使任何UIButton子类对框架上发生的任何触摸做出响应:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    guard
        isUserInteractionEnabled,
        !isHidden,
        alpha >= 0.01,
        self.point(inside: point, with: event)
    else {return nil}

    for subview in subviews.reversed() {
        let convertedPoint = subview.convert(point, from: self)
        if let candidate = subview.hitTest(convertedPoint, with: event) {
            return candidate
        }
    }

    return self
}

答案 3 :(得分:0)

我有一个UIView扩展名会有所帮助。只需让您的按钮调用此方法即可。

extension UIView {
    public func makeBackgroundAlpha002() {
        backgroundColor = UIColor(white: 0, alpha: 0.02)
    }
}

为什么使用alpha 0.02?如果您阅读Apple Documentation,他们会在命中测试期间解释魔术

  

此方法将忽略隐藏的视图对象,禁用的用户交互或alpha级别小于0.01的视图对象。