Как я могу нажать кнопку за прозрачным UIView? - PullRequest
168 голосов
/ 15 июня 2010

Допустим, у нас есть контроллер представления с одним вложенным представлением.подпредставление занимает центр экрана с полями 100 пикселей со всех сторон.Затем мы добавляем кучу мелочей, чтобы щелкнуть внутри этого подпредставления.Мы используем подпредставление только для того, чтобы воспользоваться новым кадром (x = 0, y = 0 внутри подпредставления на самом деле 100,100 в родительском представлении).

Тогда представьте, что у нас есть что-то позади подпредставления, например, меню.Я хочу, чтобы пользователь мог выбрать любой «маленький материал» в подпредставлении, но если там ничего нет, я хочу, чтобы касания проходили через него (поскольку фон в любом случае ясен) к кнопкам позади него.

Как я могу это сделать?Похоже, прикосновения Беган проходит, но кнопки не работают.

Ответы [ 16 ]

1 голос
/ 22 октября 2013

Используя советы из других ответов и читая документацию Apple, я создал эту простую библиотеку для решения вашей проблемы:
https://github.com/natrosoft/NATouchThroughView
Это облегчает рисование представлений в Интерфейсном Разработчике, которые должны передавать касания основному представлению.

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

Существует демонстрационный проект, и, надеюсь, README хорошо объяснит, что делать. Чтобы обратиться к OP, вы должны изменить прозрачный UIView, который содержит кнопки для класса NATouchThroughView в Интерфейсном Разработчике. Затем найдите чистый UIView, который перекрывает меню, которое вы хотите, чтобы можно было нажать. Измените этот UIView на класс NARootTouchThroughView в Интерфейсном Разработчике. Он даже может быть корневым UIView вашего контроллера представления, если вы намерены передать эти прикосновения к базовому контроллеру представления. Посмотрите демонстрационный проект, чтобы увидеть, как он работает. Это действительно довольно просто, безопасно и неинвазивно

1 голос
/ 15 июня 2010

Насколько я знаю, вы должны сделать это, переопределив метод hitTest: . Я попробовал, но не смог заставить его работать должным образом.

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

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

Я использую это вместо точки метода переопределения (внутри: CGPoint, с: UIEvent)

  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        guard self.point(inside: point, with: event) else { return nil }
        return self
    }
0 голосов
/ 23 января 2019

Попробуйте установить backgroundColor вашего transparentView как UIColor(white:0.000, alpha:0.020).Затем вы можете получить сенсорные события в touchesBegan / touchesMoved методах.Поместите код ниже где-то, что ваш взгляд инициирован:

self.alpha = 1
self.backgroundColor = UIColor(white: 0.0, alpha: 0.02)
self.isMultipleTouchEnabled = true
self.isUserInteractionEnabled = true
0 голосов
/ 22 октября 2018

Попробуйте это

class PassthroughToWindowView: UIView {
        override func test(_ point: CGPoint, with event: UIEvent?) -> UIView? {
            var view = super.hitTest(point, with: event)
            if view != self {
                return view
            }

            while !(view is PassthroughWindow) {
                view = view?.superview
            }
            return view
        }
    } 
0 голосов
/ 10 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...