Как отлаживать, кто ест мои прикосновения в UIKit?

20

Я не могу понять, почему нажатие на текстовые поля и кнопки в моем представлении не работает. Я проверил все очевидные вещи, как установлено ли userInteractionEnabled равным YES, независимо от того, установлен ли распознаватель жестов, и если на переднем плане есть невидимое представление.

Есть ли передовая практика в iOS для отслеживания касания, когда она впервые появляется там, где она потребляется?

UPDATE:

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

    
задан bugloaf 29.09.2014 в 23:13
источник
  • Вид нулевого размера бит меня. Я сделал некоторые промежуточные взгляды, чтобы сохранить z-порядок, но я забыл обновить рамки промежуточных просмотров, поэтому они остались на нулевом уровне. Как только я обновил их в LayoutSubviews, краны снова начали течь. –  Anthony Mills 19.07.2016 в 21:58
  • Я тоже был укушен этим. Таким образом, проверьте две вещи в иерархии представления, которая имеет эту проблему (предполагая, что она не покрывается неинтерактивным прозрачным представлением): isInteractionEnabled = true, и если высота и ширина> 0. –  Guillaume Laurent 16.06.2017 в 17:34

3 ответа

15

Вы можете подклассы UIWindow и переопределить -[UIWindow sendEvent]: , а затем, когда он вызывается, используйте -[UIWindow hitTest:withEvent:] , чтобы проверить, какое представление получит событие.

Затем вы можете вызвать -[UIView recursiveDescription] , чтобы распечатать некоторую информацию об отладке, чтобы вы поняли, почему это мнение получило событие touch.

Не забудьте вызвать [super sendEvent:] , когда вы закончите.

Для тех, кто использует Storyboard и хочет знать, как изменить основной класс окна приложения:

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow? = TestWindow()
    // ....
}

Просто укажите значение по умолчанию для AppDelegate window var. Когда приложение запущено, UIApplicationMain создаст экземпляр делегата и спросит его о window . Если window - nil , он автоматически создаст новый. Но если мы предоставим значение по умолчанию здесь, оно будет использоваться по всему приложению.

    
ответ дан Bryan Chen 29.09.2014 в 23:21
3

Вы можете использовать новую отладку в режиме реального времени Xcode6 и, повернув иерархию представлений в 3D, вы можете увидеть, какие виды находятся выше тех, которые вам нужны, и осмотреть их.

    
ответ дан DeFrenZ 29.09.2014 в 23:38
2

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

Parent UIView size=0x0, clipToBounds=false

   Child UIButton size=100x50

= & GT; Кнопка «Дети» не получит никаких событий касания.

    
ответ дан Guillaume Laurent 28.12.2017 в 00:19