【问题标题】:How can I make UIButton respond to touch on the transparent areas of a PNG image?如何让 UIButton 响应触摸 PNG 图像的透明区域?
【发布时间】:2013-06-26 11:15:03
【问题描述】:

如果您在没有图像 Alpha 的地方触摸它,UIButton 会忽略触摸。我可以更改它以响应触摸它的整个边界吗?

【问题讨论】:

    标签: ios uibutton uiimage uikit


    【解决方案1】:

    我有一个UIView 分机可以提供帮助。只需让您的按钮调用此方法即可。

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

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

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

    【讨论】:

      【解决方案2】:

      只是按照 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
      }
      

      【讨论】:

      • 您好 Franco,您能解释一下您如何使用 hit 功能或在哪里实现它吗?我试图用它来忽略按钮的透明部分。
      • 你必须继承 UIButton 并在你的子类实现中覆盖 hitTest 方法。如果您使用情节提要,则将您的 UIButton 子类分配给 Interface Builder 中的按钮,或者如果您在代码中构建 UI,则只需实例化您的子类的副本。
      • 谢谢佛朗哥!
      【解决方案3】:

      我实际上一直这样做,我将具有透明背景的图像放入UIImageView,然后将UIButton 及其backgroundColor 设置为[UIColor clearColor] 放在图像顶部。这样,尤其是对于小图像,我可以使“不可见”按钮更大,更易于用户按下。

      【讨论】:

        【解决方案4】:

        如果您在没有图像 Alpha 的地方触摸它,UIButton 会忽略触摸。我可以更改它以响应触摸它的整个边界吗?

        我认为仍然有效的一种简单方法是将背景颜色设置为仅大部分透明的颜色。一个非常小但仍大于 0.1 的 alpha 应该看起来透明但仍能响应触摸。

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

        【讨论】:

        • 我可以简单地为 hitTest 返回一个常量 YES 吗?
        • 您可能至少要检查该点是否在按钮的范围内。
        • 好的,谢谢。现在,透明度解决方法似乎工作正常。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多