【问题标题】:Detecting UIButton tap for button inside of tappable view检测可点击视图内的按钮的 UIButton 点击
【发布时间】:2017-11-06 04:16:47
【问题描述】:

我有一个容器视图,上面有一个按钮,可以隐藏和显示视图。在显示的视图中,有 N 个具有操作的迷你按钮。

我遇到的问题是,当我点击迷你按钮时,这些目标会被忽略,而较大的视图按钮是接收操作的对象。

如何进行配置,以便视图上较大的可点击按钮在大多数地方仍然有效,但在存在迷你按钮的地方,这些点击操作也会注册?

谢谢!

【问题讨论】:

  • 当你已经添加了一个包含迷你按钮的子视图时,为什么你仍然需要一个大按钮而不是容器视图?
  • 因为大多数时候用户需要能够点击来显示/隐藏视图,但其他时候,他们需要点击较小的按钮来完成诸如显示 WKWebview 之类的操作
  • 我会尝试这样做,但我认为使用按钮仍然行不通我会尝试这样做,在 containerView 上使用手势而不是 UIButton 怎么样?
  • 必须有一种方法可以在两个按钮都起作用的按钮中拥有一个按钮......

标签: swift uiview uibutton


【解决方案1】:

有两种可能的解决方案 首先

更改 uibutton 的视图层次结构(在堆栈顶部大 界面生成器)

喜欢

-大按钮

-迷你按钮1

-迷你按钮1

' '

-小按钮

第二个

在容器视图上使用 手势,例如

    let hideViewGesture = UITapGestureRecognizer(target: self, action: "hideView")

    containerView.addGestureRecognizer(hideViewGesture)


func hideView() {
    containerView.isHidden = true
}

【讨论】:

    【解决方案2】:

    不仅可以让按钮动作在按钮中起作用

    1) 在 ContainerView 上添加一个按钮 [大按钮] 将导致始终检测大按钮操作,并且不允许您检测其中的按钮

    2) 如果在层的情况下看到大按钮层在顶部所以逻辑上总是大按钮将首先出现在操作而不是 containerView 的视图中

    可能的解决方案:

    1) 尝试在 ContainerView 上使用手势

    2)您可以使用分段控件作为显示和隐藏或放置在 containerView 一侧而不是其上方的 UIButton,因此您将能够执行所有必需的操作

    【讨论】:

      【解决方案3】:

      这是一个老问题,但实际上有一个简单的解决方案,通过覆盖hitTest(_ point: CGPoint, with event: UIEvent?)

      在您的外部按钮内:

      override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
          if self.innerButton.frame.contains(point) {
              return self.innerButton
          }
          else if self.bounds.contains(point) {
              return self
          }
          else {
              return super.hitTest(point, with: event)
          }
      }
      

      它测试触摸点是否在内部按钮内(或者你可以有几个内部按钮),如果是,它会返回它并且触摸仅由内部按钮注册,如果不是,它会转到外部视图.如果两个视图都不包含它,它会调用super,以便其他视图正确处理触摸。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多