【问题标题】:UIButton to not be clickable but to receive gesturesUIButton 不可点击但接收手势
【发布时间】:2018-04-04 13:53:39
【问题描述】:

我有一个 UIButton,我希望能够使用 pan gesture 移动它,但无法单击它。我想要的是当用户点击按钮的按钮时不会改变它的外观,就像你只是点击一个视图一样。将isEnabled 设置为false 并将userInteractionIsEnabled 设置为false 会导致按钮均未收到pan events。我可以使用自定义视图来达到预期的效果,但我可以用按钮以某种方式做到这一点。 按要求发布带有按钮创建的代码 sn-p:

func createAnswerButton() {
    let width : CGFloat = 154
    let height : CGFloat = 60
    let originX = (view.frame.size.width - width) / 2
    let originY = startOverButton.frame.origin.y + collectionView.frame.size.height
    let frame = CGRect(x: originX, y: originY, width: width, height: height)
    let button = UIButton(frame: frame)
    answerButton = button
    button.backgroundColor = .clear
    self.answerButton.setTitleColor(.white, for: .normal)
    let image = UIImage(named: "item_neutral")
    button.setBackgroundImage(image, for: .normal)
    view.addSubview(button)

    let panGesture = UIPanGestureRecognizer(target: self, action: (#selector(MoviesViewController.didPanButton(_:))))
    button.addGestureRecognizer(panGesture)
}

【问题讨论】:

  • 您是否有特殊原因要使用UIButton 而不是UIView
  • 我想继续使用 title 和 imageView 属性 - 在按钮还附加一个动作之前,但不再需要它了。但我想这不是一个很好的理由,只是懒惰,我会顺其自然。
  • 能提供sn-p的代码吗?
  • @Aditya 提供了用于创建按钮的代码 sn-p
  • 您希望 no 按钮在被点击时淡出,但仍接收点击手势和平移手势?

标签: ios uibutton uipangesturerecognizer


【解决方案1】:

为此,您必须将按钮的adjustsImageWhenHighlighted 设置为false(如果您想以编程方式进行)。在界面生成器中,您可以将按钮 type 更改为 custom

这是以编程方式执行此操作的代码:

 override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let width : CGFloat = 154
    let height : CGFloat = 60
    let originX = (view.frame.size.width - width) / 2
    let originY = (view.frame.size.height - width) / 2
    let frame = CGRect(x: originX, y: originY, width: width, height: height)

    let button = UIButton(type: .custom)
    button.adjustsImageWhenHighlighted = false
    button.frame = frame

    button.addTarget(self, action: #selector(buttonInCodeTapped), for: .touchUpInside)
    button.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(panForButtonInCode(recognizer:))))
    button.setBackgroundImage(UIImage(named: "X"), for: .normal)
    view.addSubview(button)
}

这是将该属性设置为false 时的结果:

这是将该属性设置为true 时的结果(您可以看到,当点击X 时会突出显示):

【讨论】:

    【解决方案2】:

    几乎你必须说按钮更喜欢一种手势而不是另一种手势

    例如:

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
          shouldRequireFailureOf otherGestureRecognizer:  UIGestureRecognizer) -> Bool {
        // Don't recognize a single tap until a double-tap fails.
         if gestureRecognizer == self.tapGesture && 
          otherGestureRecognizer == self.doubleTapGesture {
      return true
    

    } 返回假 }

    更多信息请点击链接:

    https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another

    【讨论】:

      【解决方案3】:

      试试这个,

      func createAnswerButton() {
              let width : CGFloat = 154
              let height : CGFloat = 60
              let originX = (view.frame.size.width - width) / 2
              let originY = startOverButton.frame.origin.y + collectionView.frame.size.height
              let frame = CGRect(x: originX, y: originY, width: width, height: height)
              let button = UIButton(frame: frame)
              answerButton = button
              button.backgroundColor = .clear
              self.answerButton.setTitleColor(.white, for: .normal)
              let image = UIImage(named: "item_neutral")
              button.setBackgroundImage(image, for: .normal)
              button.addTarget(self, action: #selector(self.buttonClicked(_:)), for: .touchUpInside)
              view.addSubview(button)
      
              let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture))
              button.addGestureRecognizer(panGesture)
          }
          @objc func handlePanGesture(sender: UIPanGestureRecognizer? = nil) {
              print("Pan Gesture detected")
              var buttonCenter : CGPoint = button.center
              if sender?.state == .began {
                  buttonCenter = button.center
              } else if sender?.state == .ended || sender?.state == .failed || sender?.state == .cancelled {
                  button.center = buttonCenter
              } else {
                  let location = sender?.location(in: view)
                  button.center = location!
              }
              print("\(buttonCenter)")
          }
          @objc func buttonClicked(_ sender: UIButton){
              print("Button Click detected")
          }
      

      【讨论】:

        猜你喜欢
        • 2014-09-29
        • 2013-06-23
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        相关资源
        最近更新 更多