Определить подпредставление в UIView по местоположению (CGPoint) - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь найти лучший метод для нахождения точного подпредставления (если оно есть) для данного CGPoint в UIView.

Часть моей сцены / ViewController представляет собой пользовательский подкласс UIView (разработанный в XIB), который представляет UIStackView подпредставлений (также пользовательских, разработанных в XIB).

VC имеет UITapGestureRecognizer в этом настраиваемом представлении, и в моем @IBAction я хочу определить, какой именно один из его подпредставлений был задействован, а затем обработать его соответствующим образом:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {

    let tapLocation = recognizer.location(in: recognizer.view)
    if let subviewTapped = customView.subviewAtLocation(tapLocation) {
        handleTapForSubview(subviewTapped)
    }
}

Однако я не знаю, как реализовать этот subviewAtLocation(CGPoint) метод. Я не смог ничего найти в стандартных методах UIView.

Любой совет о том, как это сделать, будет приветствоваться.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Решение будет использовать метод contains(point:) из CGRect. Идея состоит в том, чтобы перебрать подпредставления стекового представления и проверить, какие подпредставления содержат точку касания. Здесь:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
    let tapLocation = recognizer.location(in: recognizer.view)
    let filteredSubviews = stackView.subviews.filter { subView -> Bool in
      return subView.frame.contains(tapLocation)
    }

    guard let subviewTapped = filteredSubviews.first else {
      // No subview touched
      return
    }

    // process subviewTapped however you want
}
0 голосов
/ 10 марта 2019

// использовать метод hitTest ().это дает представление, которое содержит точку

let subView = parentView.hitTest(point, with: nil)
...