Механизм обработки нажатий в iOS основан на цепочке респондеров (Responder Chain).
Этапы:
UIKit или SwiftUI).UIView под точкой нажатия. Для этого используется метод hitTest(_:with:) в порядке, обратном иерархии представлений (сначала дочерние, затем родительские).hitTest(_:with:) возвращает самое глубокое подпредставление, которое может обработать событие (т.е. isUserInteractionEnabled равно true и точка находится внутри фрейма). Если такого представления нет, возвращается nil.hitTest(_:with:) вернул представление (называемое "первый респондер"), система отправляет ему событие касания через метод touchesBegan(_:with:).super), событие передается следующему респондеру в цепочке:
UIView, следующий респондер — это его суперпредставление (superview).UIViewController.view), следующий респондер — это его viewController.UIViewController), следующий респондер — это его представление модала (presenter) или splitViewController, navigationController, tabBarController (в зависимости от контекста).UIWindow, следующий респондер — это объект UIApplication.UIApplication, следующий респондер — это аппликационный делегат (AppDelegate).super) или не достигнет конца цепочки (обычно AppDelegate).Ключевые методы:
hitTest(_:with:): Метод UIView для определения представления, находящегося под точкой касания.point(inside:with:): Метод UIView, вызываемый методом hitTest, для проверки, находится ли точка внутри фрейма представления.touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:): Методы UIResponder для обработки жизненного цикла касаний.Цепочка респондеров (пример):
plaintext
swift
swift