Sobes.tech
Middle

Жүйеде эмне болот, биз экранга басканда?

sobes.tech AI

AIден жооп

Пайдаланушы iOS құрылғысының экранын басқанда, келесі нәрселер орын алады:

  1. Оқиғаны қабылдау: Аппараттық құрал (touch контроллері) басуды тіркейді және оқиға жасайды.
  2. IOKit-те оқиғаны өңдеу: Құрылғы драйвері IOKit-те басу туралы ақпаратты алады (координаттар, басу күштері және т.б.).
  3. Оқиғаны SpringBoard-қа жіберу: IOKit оқиғаны жүйелік процесс SpringBoard-қа жібереді.
  4. Оқиғаның маршрутизациясы: SpringBoard белсенді қолданбаны анықтайды және оны IPC (Inter-Process Communication) арқылы оқиғаны жібереді.
  5. UIKit/SwiftUI-де оқиғаны қабылдау: Қолданбада оқиға framework (UIKit немесе SwiftUI) арқылы қабылданады.
  6. Оқиғаны кезекке қосу: Оқиға қолданбаның оқиға өңдеу кезегіне қосылады.
  7. Қолданба арқылы оқиғаны қабылдау: Қолданбаның негізгі циклі (Run Loop) оқиғаны кезектен шығарады.
  8. UIResponder арқылы оқиғаны өңдеу: Оқиға UIEvent объектісіне беріледі. UIKit оқиғаны жеткізу процесін бастайды, әдетте UIWindow-дан бастайды.
  9. hitTest тексеруі: Жүйе ең жоғарғы интерактивті UIView-ды анықтайды (немесе оның эквиваленті SwiftUI-де), ол басу нүктесінің астында орналасқан, hitTest(_:with:) әдісі арқылы (UIKit-де). Бұл әдіс рекурсивті түрде көріністердің иерархиясын өтіп, нүкте bounds ішінде ме және көрініс userInteractionEnabled пе екенін тексереді.
  10. Оқиғаны жеткізу: Оқиға табылған көрініске жеткізіледі. Егер көрініс оқиғаны өңдемесе (мысалы, тиісті жест болмаса немесе touchesBegan:withEvent: жүзеге асырса, бірақ өңдемесе, немесе hitTest кезінде nil қайтарса), оқиға келесі responder-ге беріледі (responder chain), әдетте супервью немесе көрініс контроллеріне.
  11. Жесттер немесе шұғыл әдістерді өңдеу: Егер көріністе UIGestureRecognizer қосылған болса, олар бірінші болып оқиғаны алады. Егер жест танылса, ол Objective-C немесе Swift-те тиісті әрекетпен өңделеді. Егер жесттер оқиғаны өңдемесе немесе жоқ болса, оқиға көріністің шұғыл әдістеріне беріледі (touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Логиканы орындау: Жест немесе шұғыл әдістегі логика орындалады (мысалы, UI күйін өзгерту, навигация, әрекетті орындау).
  13. 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)
}