У меня есть базовый UIView
, с другим вложенным UIView
. Представьте себе коробку с меньшей коробкой внутри. Это может быть даже UIImageView
внутри. Просто какой-то тип зрения. Каждое из двух представлений должно иметь UITapGestureRecognizer
. Когда я нажимаю в любом месте внешнего вида за пределами внутреннего вида, я выполняю одно действие. Когда я касаюсь внутреннего вида, я хочу сделать другое действие.
Пример: у меня есть внешний вид контейнера и внутренний UIImageView
. Если я коснусь внешнего вида за пределами внутреннего, то перейду к следующему экрану. Если я коснусь представления внутреннего изображения, оно отобразит изображение в увеличенном виде во всплывающем окне.
У меня проблемы с определением приоритета. Я понимаю, что UITapGestureRecognizers
перекрывает внутреннее представление, но я хочу указать, что распознаватель внутреннего представления всегда имеет приоритет над внешним представлением.
Apple указывает, как различать различные типы распознавателей жестов в этих документах по адресу https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another, но это не показывает использование одинаковых двух распознавателей жестов с одним и тем же делегатом. Как это достижимо? Возможно, я не правильно понимаю документы.
Я прикрепляю распознаватели жестов к представлениям в коде и пытаюсь поменять местами, когда добавляю распознаватели жестов в разные виды, добавляя распознаватель внешнего вида перед внутренним распознавателем, а затем наоборот. Однако он все еще регистрирует только распознаватель жестов касания внешнего вида.
Ниже приведен код. У меня есть представления, созданные в конструкторе интерфейса с выходами в конкретном представлении. campaignContentView
- это родительское представление, а pictureImageView
и linkDetailsView
- это дочерние представления. Иногда я просто показываю картинку, которая должна сделать одну вещь. В других случаях у меня есть ссылка со связанным миниатюрой, и нажатие на любую из них должно сделать другое дело.
@IBOutlet weak var campaignContentView: UIView!
@IBOutlet weak var pictureImageView: UIImageView!
@IBOutlet weak var linkDetailsView: UIView!
private func addNewGestureRecognizer(_ view: UIView) {
let tapView = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedView(_:)))
campaignContentView.addGestureRecognizer(tapView)
switch view {
case linkDetailsView:
let tapLinkDetails = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
let tapLinkPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
view.addGestureRecognizer(tapLinkDetails)
pictureImageView.addGestureRecognizer(tapLinkPicture)
case pictureImageView:
let tapPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedPicture(_:)))
view.addGestureRecognizer(tapPicture)
default:
print("No new gesture necessary")
}
}
Я также звоню bringSubviewToFront(pictureImageView)
и bringSubviewToFront(linkDetailsView)
соответственно. Оказывается, что распознаватель жестов для linkDetailsView
на самом деле работает правильно, только не pictureImageView