Middle
Жүйеде эмне болот, биз экранга басканда?
sobes.tech AI
AIден жооп
Пайдаланушы iOS құрылғысының экранын басқанда, келесі нәрселер орын алады:
- Оқиғаны қабылдау: Аппараттық құрал (touch контроллері) басуды тіркейді және оқиға жасайды.
- IOKit-те оқиғаны өңдеу: Құрылғы драйвері IOKit-те басу туралы ақпаратты алады (координаттар, басу күштері және т.б.).
- Оқиғаны SpringBoard-қа жіберу: IOKit оқиғаны жүйелік процесс SpringBoard-қа жібереді.
- Оқиғаның маршрутизациясы: SpringBoard белсенді қолданбаны анықтайды және оны IPC (Inter-Process Communication) арқылы оқиғаны жібереді.
- UIKit/SwiftUI-де оқиғаны қабылдау: Қолданбада оқиға framework (UIKit немесе SwiftUI) арқылы қабылданады.
- Оқиғаны кезекке қосу: Оқиға қолданбаның оқиға өңдеу кезегіне қосылады.
- Қолданба арқылы оқиғаны қабылдау: Қолданбаның негізгі циклі (Run Loop) оқиғаны кезектен шығарады.
- UIResponder арқылы оқиғаны өңдеу: Оқиға
UIEventобъектісіне беріледі. UIKit оқиғаны жеткізу процесін бастайды, әдеттеUIWindow-дан бастайды. - hitTest тексеруі: Жүйе ең жоғарғы интерактивті
UIView-ды анықтайды (немесе оның эквиваленті SwiftUI-де), ол басу нүктесінің астында орналасқан,hitTest(_:with:)әдісі арқылы (UIKit-де). Бұл әдіс рекурсивті түрде көріністердің иерархиясын өтіп, нүкте bounds ішінде ме және көрініс userInteractionEnabled пе екенін тексереді. - Оқиғаны жеткізу: Оқиға табылған көрініске жеткізіледі. Егер көрініс оқиғаны өңдемесе (мысалы, тиісті жест болмаса немесе
touchesBegan:withEvent:жүзеге асырса, бірақ өңдемесе, немесеhitTestкезіндеnilқайтарса), оқиға келесі responder-ге беріледі (responder chain), әдетте супервью немесе көрініс контроллеріне. - Жесттер немесе шұғыл әдістерді өңдеу: Егер көріністе
UIGestureRecognizerқосылған болса, олар бірінші болып оқиғаны алады. Егер жест танылса, ол Objective-C немесе Swift-те тиісті әрекетпен өңделеді. Егер жесттер оқиғаны өңдемесе немесе жоқ болса, оқиға көріністің шұғыл әдістеріне беріледі (touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Логиканы орындау: Жест немесе шұғыл әдістегі логика орындалады (мысалы, UI күйін өзгерту, навигация, әрекетті орындау).
- UI-ды жаңарту: Егер логика UI-да өзгерістерге әкелсе, framework қайта салу сұрауын жібереді (қажет болса).
Міне, батырмаға арналған шұғыл өңдеу логикасының өте қарапайым мысалы:
// ViewController немесе басқа UIResponder ішінде
@IBAction func buttonTapped(_ sender: Any) {
// Батырма басылғанда орындалатын логика
print("Батырма басылды!")
}
touchesBegan қолданудың мысалы (қарапайым басулар үшін сирек қолданылатын):
// UIView-ден мұрагерлік алған жеке көрініс
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
print("Экранға тигізілді CGPoint: \(location)")
// Super-ды шақырмасаңыз, келесі responder-лердің өңдеуі тоқтайды
// super.touchesBegan(touches, with: event)
}