У меня есть наложение поверх многих других представлений. Я использую только избыточно для обнаружения некоторого количества касаний на экране, но кроме этого я не хочу, чтобы представление останавливало поведение других представлений внизу, таких как прокрутки и т. Д. Как я могу переслать все касания через это наложение вид? Это подкалка UIView.
141
Ответы:
Отключение взаимодействия с пользователем - все, что мне было нужно!
Objective-C:
Swift:
источник
myWebView.isUserInteractionEnabled = false
Для передачи касаний из наложенного вида в представления внизу, реализуйте следующий метод в UIView:
Objective-C:
Свифт 5:
источник
Это старая ветка, но она возникла при поиске, поэтому я решил добавить свой 2c. У меня есть покрытие UIView с подпредставлениями, и я хочу перехватывать только касания, попавшие в одно из подпредставлений, поэтому я изменил ответ PixelCloudSt на
источник
Улучшенная версия ответа @fresidue. Вы можете использовать этот
UIView
подкласс как прозрачный вид, передавая прикосновения за пределы его подпредставления. Реализация в Objective-C :,
и в Свифте:
НАКОНЕЧНИК:
Скажем, у вас есть большая панель "держатель", возможно, с видом на стол сзади. Вы делаете панель "держатель"
PassthroughView
. Теперь он будет работать, вы можете прокручивать стол «через» «держатель».Но!
В верхней части панели «Держатель» у вас есть несколько ярлыков или значков. Не забывайте, конечно, они должны быть просто помечены как взаимодействие с пользователем отключено!
В верхней части панели «держатель» у вас есть несколько кнопок. Не забывайте, конечно, что они должны быть просто помечены как включено взаимодействие с пользователем!
Обратите внимание , что несколько смутно, то «владелец» сам по себе - вид вы используете
PassthroughView
на - должны быть отмечены взаимодействия с пользователем включен ON ! Это включено ! (В противном случае код в PassthroughView просто никогда не будет вызван.)источник
$0.isUserInteractionEnabled
У меня была похожая проблема с UIStackView (но может быть любое другое представление). Моя конфигурация была следующей:
Это классический случай, когда у меня есть контейнер, который нужно разместить на заднем плане, с кнопками сбоку. Для макета я включил кнопки в UIStackView, но теперь средняя (пустая) часть stackView перехватывает прикосновения :-(
Я создал подкласс UIStackView со свойством, определяющим подвид, который должен быть сенсорным. Теперь любое прикосновение к боковым кнопкам (включенным в массив * viewsWithActiveTouch *) будет предоставлено кнопкам, в то время как любое прикосновение к стековому обзору в любом месте, кроме этих представлений, не будет перехвачено и, следовательно, передано любому объекту, находящемуся ниже стека. Посмотреть.
источник
Если представление, которому вы хотите переслать касания, не является подпредставлением / суперпредставлением, вы можете настроить собственное свойство в своем подклассе UIView следующим образом:
Убедитесь, что синтезировали это в своем .m:
А затем включите следующее в любой из ваших методов UIResponder, таких как:
Где бы вы ни создавали свой экземпляр UIView, установите свойство forwardableTouchee для любого представления, в которое вы хотите пересылать события:
источник
В Свифт 5
источник
Мне нужно было пройти через UIStackView. UIView внутри был прозрачным, но UIStackView потреблял все прикосновения. Это сработало для меня:
Все упорядоченные подпредставления все еще получают прикосновения, но прикосновения к самому UIStackView перешли к представлению ниже (для меня mapView).
источник
Похоже, даже если здесь довольно много ответов, мне не нужно никого убирать быстро. Поэтому я взял ответ от @fresidue здесь и преобразовал его в swift, так как это то, что сейчас большинство разработчиков хотят использовать здесь.
Это решило мою проблему, когда у меня есть прозрачная панель инструментов с кнопкой, но я хочу, чтобы панель инструментов была невидимой для пользователя, и сенсорные события должны проходить.
isUserInteractionEnabled = false, поскольку некоторые из них не являются вариантом, основанным на моем тестировании.
источник
У меня было несколько ярлыков внутри StackView, и у меня не было большого успеха с вышеуказанными решениями, вместо этого я решил свою проблему, используя следующий код:
Подкласс UIStackView:
Тогда вы можете сделать что-то вроде:
источник
Попробуйте что-то вроде этого ...
Код выше, например, в вашем методе touchesBegan передаст касания всем подпредставлениям представления.
источник
Ситуация, которую я пытался сделать, это создать панель управления с использованием элементов управления внутри вложенного UIStackView. Некоторые из элементов управления были UITextField другие с UIButton's. Также были ярлыки для идентификации элементов управления. Я хотел поместить большую «невидимую» кнопку за панелью управления, чтобы, если пользователь нажал на область за пределами кнопки или текстового поля, я мог поймать это и предпринять необходимые действия - в первую очередь отклонить любую клавиатуру, если текст поле было активным (resignFirstResponder). Тем не менее, нажатие на ярлык или другую пустую область на панели управления не будет проходить через все. Вышеприведенные обсуждения были полезны для придания моего ответа ниже.
По сути, я подклассифицировал UIStackView и переписал подпрограмму «point (inside: with)», чтобы найти тип элементов управления, которым необходимо касание, и «игнорировать» такие вещи, как метки, которые я хотел игнорировать. Он также проверяет внутри UIStackView, чтобы вещи могли вернуться в структуру панели управления.
Код, возможно, немного более подробный, чем должен быть. Но это было полезно при отладке и, надеюсь, даст больше ясности в том, что делает рутина. Просто убедитесь, что в Интерфейсном Разработчике измените класс UIStackView на PassThruStack.
}
источник
По предложению @PixelCloudStv, если вы хотите перебрасывать прикосновения от одного вида к другому, но с некоторым дополнительным контролем над этим процессом - подкласс UIView
// заголовок
//реализация
После в interfaceBuilder просто установите класс View в TouchView и установите активный прямоугольник с вашим прямоугольником. Также вы можете изменить и реализовать другую логику.
источник