Допустим, у нас есть контроллер представления с одним вложенным представлением. подпредставление занимает центр экрана с полями 100 пикселей со всех сторон. Затем мы добавляем кучу маленьких вещей, чтобы щелкнуть внутри этого подпредставления. Мы используем подпредставление только для того, чтобы воспользоваться новым кадром (x = 0, y = 0 внутри подпредставления на самом деле 100,100 в родительском представлении).
Затем представьте, что у нас есть что-то позади подпредставления, например, меню. Я хочу, чтобы пользователь мог выбрать любой «маленький материал» в подпредставлении, но если там ничего нет, я хочу, чтобы касания проходили через него (так как фон в любом случае ясен) к кнопкам позади него.
Как я могу это сделать? Похоже, прикосновения Беган проходит, но кнопки не работают.
источник
UIButton
который находится под полупрозрачным, вUIView
то время как непрозрачная часть по-UIView
прежнему будет реагировать на сенсорные события.Ответы:
Создайте пользовательское представление для своего контейнера и переопределите сообщение pointInside: для возврата false, если точка не находится в допустимом дочернем представлении, например так:
Swift:
Цель C:
Использование этого представления в качестве контейнера позволит любому из его дочерних элементов получать прикосновения, но само представление будет прозрачным для событий.
источник
Я также использую
Нет необходимости в подклассе. Работает отлично.
источник
От Apple:
Лучшая практика яблок :
вместо этого вы можете переопределить:
в своем подклассе UIView и верните NO, если вы хотите, чтобы это касание было отправлено вверх по цепочке респондента (IE для просмотра за вашим представлением, в котором ничего нет).
источник
NO
;Гораздо более простой способ - «отключить» взаимодействие с пользователем, включенное в конструкторе интерфейса. «Если вы используете раскадровку»
источник
Основываясь на том, что опубликовал Джон, вот пример, который позволит сенсорным событиям проходить через все подпредставления представления, кроме кнопок:
источник
UIView
подкласса,PassThroughView
который просто переопределяет,-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }
если вы хотите перенаправить какие-либо сенсорные события под представлениями.В последнее время я написал класс, который поможет мне именно с этим. Использование его в качестве пользовательского класса для
UIButton
илиUIView
будет передавать сенсорные события, которые были выполнены на прозрачном пикселе.Это решение несколько лучше, чем принятый ответ, потому что вы все еще можете щелкнуть по элементу,
UIButton
который находится под полупрозрачным, вUIView
то время как непрозрачная частьUIView
будет по-прежнему реагировать на сенсорные события.Как вы можете видеть в GIF, кнопка «Жираф» представляет собой простой прямоугольник, но события касания на прозрачных областях передаются в жёлтый цвет
UIButton
снизу.Ссылка на класс
источник
Решение, получившее наибольшее количество голосов, не работало полностью для меня, я полагаю, это потому, что у меня был TabBarController в иерархии (как отмечается в одном из комментариев), он фактически передавал касания некоторым частям пользовательского интерфейса, но это мешало моему способность tableView перехватывать события касания, что, в конце концов, переопределило hitTest в представлении, я хочу игнорировать касания и позволить подвидам этого представления обрабатывать
источник
Swift 3
источник
Согласно «Руководству по программированию приложений iPhone»:
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html
Обновлено : удален пример - перечитайте вопрос ...
Есть ли у вас какие-либо жесты обработки представлений, которые могут обрабатывать касания до того, как кнопка их получит? Кнопка работает, если у вас нет прозрачного вида на нее?
Какие-нибудь примеры кода нерабочего кода?
источник
Насколько я знаю, вы должны сделать это, переопределив метод hitTest : . Я попробовал, но не смог заставить его работать должным образом.
В конце концов я создал серию прозрачных видов вокруг объекта, к которому можно прикоснуться, чтобы он не покрывал его. Немного взломать мою проблему, это работало нормально.
источник
Используя советы из других ответов и читая документацию Apple, я создал эту простую библиотеку для решения вашей проблемы:
https://github.com/natrosoft/NATouchThroughView
Она упрощает рисование представлений в Интерфейсном Разработчике, которые должны проходить касания в основной взгляд.
Я думаю, что метод swizzling излишний и очень опасный в производственном коде, потому что вы напрямую возитесь с базовой реализацией Apple и вносите изменения в рамках всего приложения, которые могут привести к непредвиденным последствиям.
Есть демонстрационный проект, и, надеюсь, README хорошо объяснит, что делать. Чтобы обратиться к OP, вы должны изменить прозрачный UIView, который содержит кнопки для класса NATouchThroughView в Интерфейсном Разработчике. Затем найдите чистый UIView, который перекрывает меню, которое вы хотите, чтобы можно было нажать. Измените этот UIView на класс NARootTouchThroughView в Интерфейсном Разработчике. Он может даже быть корневым UIView вашего контроллера представления, если вы намерены передать эти прикосновения к базовому контроллеру представления. Проверьте демонстрационный проект, чтобы увидеть, как он работает. Это действительно довольно просто, безопасно и неинвазивно
источник
Я создал категорию, чтобы сделать это.
маленький метод извергает и вид золотой.
Заголовок
Файл реализации
Вам нужно будет добавить мои Swizz.h и Swizz.m
Здесь находится
После этого вы просто импортируете UIView + PassthroughParent.h в свой файл {Project} -Prefix.pch, и у каждого представления будет эта возможность.
каждое представление будет принимать точки, но ни одно из пустого пространства не будет.
Я также рекомендую использовать чистый фон.
РЕДАКТИРОВАТЬ
Я создал свою собственную сумку собственности, и это не было включено ранее.
Заголовочный файл
Файл реализации
источник
pointInside: withEvent:
?Если вы не можете использовать категорию или подкласс UIView, вы также можете просто переместить кнопку вперед, чтобы она находилась перед прозрачным представлением. Это не всегда возможно в зависимости от вашего приложения, но это сработало для меня. Вы всегда можете вернуть кнопку назад или скрыть ее.
источник
Попробуй это
источник
Попробуйте установить
backgroundColor
вашtransparentView
какUIColor(white:0.000, alpha:0.020)
. Затем вы можете получить сенсорные события вtouchesBegan
/touchesMoved
методов. Поместите код ниже где-то ваш взгляд:источник
Я использую это вместо переопределения точки метода (внутри: CGPoint, с: UIEvent)
источник