Распространение события касания через иерархию представления (UIButton внутри UIView) - PullRequest
1 голос
/ 07 марта 2019

Уверен, что это легко, но до сих пор не нашел ничего похожего в Интернете - еще одна причина полагать, что это не проблема.В любом случае!

Как я могу поместить UIButton внутри UIView и добавить UITapGestureRecognizer к представлению, вызывающему функцию в этом представлении, в то же время выполняя кнопкудействие одновременно?

Что у меня есть:

  • Нажатие внутри кнопки выполняет только действие кнопки.
  • Нажатие за пределами кнопки выполняет только функцию просмотра.

Что я хочу:

  • Нажатие внутри кнопки выполняет как действие кнопки, так и функцию просмотра.
  • Нажатие за пределами кнопки выполняет только функцию просмотра.

ОБНОВЛЕНИЕ (код, который я использовал):

import UIKit
import AwesomeFramework

class View: UIView {

    let button = UIButton()
    let awesomeObject = AwesomeFramework.AwesomeObject()

    @objc func a(_ sender: Any) {
        // never gets called
        print("a")
    }

    init() {
        super.init(frame: .zero)

        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)
        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: centerXAnchor),
            button.centerYAnchor.constraint(equalTo: centerYAnchor),
            button.widthAnchor.constraint(equalTo: widthAnchor),
            button.heightAnchor.constraint(equalTo: heightAnchor),
            ])

        button.addTarget(awesomeObject, action: #selector(awesomeAction), for: .touchUpInside) // awesomeAction prints "b"

        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(a(_:)))
        addGestureRecognizer(gestureRecognizer)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

Нажатие на кнопку, которую я хочу:

b
a

или

a
b

Я получаю:

b

ОБНОВЛЕНИЕ: приведен пример с некоторыми ограничениями, например:

  • Кнопка запускает действие в структуре, к которой у меня нет доступа
  • На самом деле есть много кнопок и других элементов, принимающих сигналы.Я не хочу использовать функцию a для всех из них (также я не могу, так как некоторые элементы управляют своими собственными распознавателями)

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Кнопка может иметь несколько целей. Нажмите кнопку, чтобы активировать a и b:

button.addTarget(self, action: #selector(a), for: .touchUpInside)
button.addTarget(self, action: #selector(b), for: .touchUpInside)

Что если пользователь положит палец на кнопку, а затем отпустит кнопку перед отпусканием? Если вы хотите, чтобы это также вызывало действие a, сделайте это тоже:

button.addTarget(self, action: #selector(a), for: .touchUpOutside)
0 голосов
/ 07 марта 2019

внутри вашего селектора для UITapGestureRecognizer вы можете проверить, с какого вида запускается жест.и так как вы можете получить доступ к представлению, вы можете проверить тег отправляющего представления и определить, было ли оно вызвано вашей кнопкой.

вот как вы можете это сделать:

@objc func a(_ sender: Any) {
    if let gesture = sender as? UITapGestureRecognizer, let v = gesture.view, v.tag == self.button.tag {
        return //since it has the tag same as that you had set for button, return
    }
    // else do what you wanted to.
}

выВаш селектор может быть связан как:

#selector(a(_:))

и определен как:

func a(_ sender: Any) { .....}

. Обязательно пометьте свою кнопку, выполнив:

self.button.tag = 9 //(or any number you prefer)
...