Sobes.tech
Middle

Ի՞նչ է տեղի ունենում համակարգում, երբ մենք սեղմում ենք էկրանին։

sobes.tech AI

Պատասխան AI-ից

Երբ օգտվողը սեղմում է iOS սարքի էկրանին, տեղի է ունենում հետևյալը:

  1. Եվентиի ընդունում: Հատկոցը (touch controller) գրանցում է շոշափումը և ստեղծում է իրադարձություն:
  2. ԻՕԿիտում իրադարձության մշակումը: Սարքի վարորդը ստանում է շոշափման մասին տեղեկություններ (կոորդինատներ, ճնշման ուժ և այլն):
  3. Ինքնագործության փոխանցում SpringBoard-ին: ԻՕԿիտը փոխանցում է իրադարձությունը համակարգային գործընթացին՝ SpringBoard:
  4. Ինքնագործության ուղարկում: SpringBoard-ը որոշում է ակտիվ հավելվածը և ուղարկում է իրադարձությունը IPC (Inter-Process Communication) միջոցով այդ հավելվածին:
  5. Ինքնագործության ընդունում UIKit/SwiftUI-ում: Հավելվածում իրադարձությունը ընդունվում է ֆրեյմվորկից (UIKit կամ SwiftUI):
  6. Ինքնագործության հերթին ավելացում: Իրադարձությունը ավելացվում է հավելվածի իրադարձությունների մշակման հերթին:
  7. Ինքնագործության ընդունում: Հիմնական ցիկլը (Run Loop) քաշում է իրադարձությունը հերթից:
  8. Ինքնագործության մշակումը UIResponder-ի միջոցով: Իրադարձությունը փոխանցվում է UIEvent օբյեկտին: UIKit-ը սկսում է իրադարձության փոխանցման գործընթացը, սովորաբար սկսելով UIWindow-ից:
  9. hitTest ստուգում: Սիստեմը որոշում է ամենաբարձր ինտերակտիվ UIView-ը (կամ նրա համարժեքը SwiftUI-ում), որը գտնվում է շոշափման կետում, օգտագործելով hitTest(_:with:) մեթոդը (UIKit-ում): Այս մեթոդը ռեկուրսիվ անցնում է տեսքի հիերարխիան, ստուգելով, արդյոք կետը գտնվում է սահմանների ներսում և արդյոք տեսքը ակտիվ է:
  10. Ինքնագործության փոխանցում: Իրադարձությունը փոխանցվում է հայտնաբերված տեսքին: Եթե տեսքը չի մշակել իրադարձությունը (օր., չունի համապատասխան ժեստ կամ իրականացնում է touchesBegan:withEvent: բայց չի մշակել, կամ hitTest-ում վերադարձնում է nil), ապա իրադարձությունը փոխանցվում է հաջորդ responder-ին (responder chain), սովորաբար superview կամ տեսքի վերահսկիչ:
  11. Ժեստերի կամ շոշափման մեթոդների մշակումը: Եթե տեսքին կցված են UIGestureRecognizer-ներ, նրանք առաջինը ստանում են իրադարձությունը: Եթե ժեստը ճանաչվում է, այն մշակվում է համապատասխան objc կամ Swift գործողությամբ: Եթե ժեստերը չեն մշակել իրադարձությունը կամ բացակայում են, ապա իրադարձությունը փոխանցվում է տեսքի շոշափման մեթոդներին (touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)):
  12. Լոգիկայի կատարմամբ: Ժեստի կամ շոշափման մեթոդում կատարվում է օգտվողի տրամաբանական գործառույթը (օր., UI վիճակի փոփոխություն, նավիգացիա, գործողության կատարում):
  13. UI-ի թարմացում: Եթե տրամաբանական գործառույթը հանգեցնում է UI- ի փոփոխությունների, ֆրեյմվորկը ուղարկում է վերանվագրման հարցում (եթե անհրաժեշտ է):

Ահա շատ պարզ օրինակ շոշափման մշակման՝ կոճակի օպերատորում:

// 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)
}