Sobes.tech
Middle

როგორ შეიძლება დადგინდეს, რომ მომხმარებელმა დაწკაპუნა ფენაზე (layer)?

sobes.tech AI

პასუხი AI-სგან

შესაძლებელია გამოიყენოთ hit testing: განსაზღვროთ, რომელ სართულზე მოხვდა შეხება. Core Animation სთავაზობს ორ მეთოდს ამისთვის:

  1. hitTest(_:):

    • ამოწმებს, არის თუ არა წერტილი სართულს ან მის ნებისმიერ ქვესართულს შიგნით.
    • აბრუნებს ყველაზე ღრმა ქვესართულს (ან სართულს), რომელიც შეიცავს წერტილს.
    • ითვალისწინებს isHidden = true.
  2. contains(_:):

    • მხოლოდ ამოწმებს, არის თუ არა წერტილი სართულს შიგნით.
    • არ ითვალისწინებს ქვესართულთა იერარქიას.
    • არ ითვალისწინებს isHidden.

ჩვეულებრივ გამოიყენება hitTest, რადგან ის უფრო ზუსტი არის ინტერაქტიულობის განსაზღვრაში.

hitTest-ის გამოყენების მაგალითი შეხების დამუშავებაში:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }

    let locationInView = touch.location(in: view)

    // ტრანსფორმაცია წერტილიდან view-ის კოორდინატებიდან სართულზე
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // hit test-ის განხორციელება
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // შეხება სწორედ myLayer-ზე
            print("მოჭერით myLayer-ზე")
        } else {
            // შეხება ქვესართულზე within myLayer
            print("მოჭერით ქვესართულზე within myLayer")
            // ქვესართლის იდენტიფიკაცია შეიძლება საჭირო გახდეს დამატებითი შემოწმებებით
        }
    } else {
        // შეხება myLayer-სა და მის ქვესართულებს გარეთ
        print("მოჭერით გარეთ myLayer")
    }
}

მნიშვნელოვანი წერტილები:

  • შეხების წერტილის კოორდინატები (location(in:)) ყოველთვის დაკავშირებულია UIView-თან. აუცილებელია მათი ტრანსფორმაცია სართულზე კოორდინატების სისტემაში (convert(_, from:) ან convert(_, to:)).
  • hitTest(_:) მეთოდი მუშაობს წერტილებთან სართულების კოორდინატების სისტემაში (myLayer.hitTest(locationInLayer)).
  • თუ სართული უხილავია (alpha = 0 ან isHidden = true), hitTest დაბრუნებს nil-ს. contains დაბრუნებს true, თუ წერტილი შიგნითა საზღვრებშია, უყურადღებოდ ხილვადობას.
  • რთული იერარქიის სართულებისთვის შეიძლება საჭირო იყოს რეკურსიული ძიება ან დაბრუნებული hitLayer-ის შემოწმება.