Middle
Чӣ гуна муайян кардан, ки корбар дар барнома ба қабат (layer) клик кардааст?
sobes.tech AI
Ҷавоб аз AI
Барои муайян кардани пахш дар CALayer, метавон ба истифодаи чанд роҳ муроҷиат кард:
-
Истифодаи
hitTest(_:event:)дар намуд (View):UIViewдорои усулиhitTest(_:with:)мебошад, ки ба таври рекурсивӣ ба иерархияи зернамоҳо мегузарад ва зернамоии амиқтаринро, ки нуқтаи додаашро дар бар мегирад, бармегардонад.- Ин усул ба таври пешфарз қабатҳои вобаста ба намудҳоро ба назар мегирад.
- Шумо метавонед
hitTest(_:with:)-ро дар намуди худи махсус барои назорати бештар ё барои коркарди пахшҳо мустақиман дар зернамоҳо барқарор кунед.
-
Трансформатсияи координатҳо бо
convert:- Вақте ки шумо рӯ ба рӯи ҳодисаи тамос (масалан, дар методҳои
UIView) қарор мегиред, шумо координатҳои тамосро дар нисбати тиреза (UIWindow) ё намуд доред. - Барои муайян кардани он, ки оё тамос ба қабати муайян расидааст, лозим аст, ки ин координатҳоро ба системаи координатҳои он қабат табдил диҳед.
- Барои ин, методҳои
convert(_:from:)ёconvert(_:to:)-иCALayer-ро истифода мебаред. - Пас аз табдил, шумо метавонед муайян кунед, ки нуқта дар дохили ҳудуди қабат (
bounds) қарор дорад ё барои ин, истифодаи санҷишҳои махсус, масалан,contains(_:).
- Вақте ки шумо рӯ ба рӯи ҳодисаи тамос (масалан, дар методҳои
-
Илова кардани
UITapGestureRecognizerба намуд:- Шумо метавонед
UITapGestureRecognizer-ро баUIView-и, ки бо қабат алоқаманд аст, илова кунед. - Дар ҳангоми коркарди гест, ҷойгиршавии тамосро дар нисбати намуд гиред.
- Баъдан, бо истифода аз усули табдил додани координатҳо (қадами 2), санҷед, ки нуқта дар дохили қабати лозим ё зернамоҳои он қарор дорад.
- Шумо метавонед
-
Эҷоди
UIViewбарои ҳар қабати интерактивӣ:- Агар шумо қабатҳое дошта бошед, ки бояд интерактивӣ бошанд, роҳи соддатар ин аст, ки барои ҳар қабат, ки чунин аст,
UIViewмувофиқ созед. - Андозаи
UIView-ро мувофиқи қабат танзим кунед. - Ҳамроҳ бо
UITapGestureRecognizer-ҳо ё бо навиштани методҳои коркарди ҳодисаҳои тамос (touchesBegan,touchesEndedва ғайра) дар ин намуд. - Ин роҳи беҳамто барои коркарди воридоти корбар дар UIKit аст, зеро
UIViewмахсус барои ин тарҳрезӣ шудааст.
- Агар шумо қабатҳое дошта бошед, ки бояд интерактивӣ бошанд, роҳи соддатар ин аст, ки барои ҳар қабат, ки чунин аст,
Масалан истифодаи hitTest дар UIView:
// Дар `UIView`-и махсус
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Табдил додани нуқтаи тамос ба координатҳои зернамо
let pointInLayer = mySublayer.convert(point, from: layer!)
// Санҷиш, ки нуқта дар дохили ҳудуди зернамо
if mySublayer.contains(pointInLayer) {
// Агар нуқта дар зернамо бошад, метавонем худ ё дигар намудро баргардонем,
// ё иҷрои амалҳои заруриро анҷом диҳем.
print("Пас аз mySublayer")
// Мумкин аст nil баргардонем, агар нахоҳем, ки ин намуд минбаъд коркард кунад,
// ё super.hitTest-ро, агар хоҳем, ки рафтори стандартиро нигоҳ дорем.
}
// Иҷозат медиҳем, ки `hitTest` стандартӣ барои дигар ҳолатҳо кор кунад
return super.hitTest(point, with: event)
}
Масалан истифодаи табдил додани координатҳо дар ҳангоми коркарди гест:
// Дар `UIView`-и махсус бо `UITapGestureRecognizer` пайваст
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Табдил додани нуқтаи тамос аз координатҳои намуд ба координатҳои зернамо
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Санҷиш, ки нуқта дар дохили ҳудуди зернамо
if mySublayer.contains(tapLocationInSublayer) {
print("Пас аз mySublayer")
// Иҷрои амалҳое, ки бо пахш ба зернамо алоқаманданд
}
}