Middle
Колдонуучу колдонмодо катмарга (layer) басканын кантип аныктоо керек?
sobes.tech AI
AIден жооп
CALayer баскычын басууну аныктоо үчүн, сиз бир нече ыкмаларды колдонсоңуз болот:
-
hitTest(_:event:)колдонуу көрүнүштө (View):UIViewhitTest(_:with:)ыкмасын камтыйт, ал рекурсивдүү түрдө ички көрүнүштөрдүн хиерархиясын өтүп, эң терең ички көрүнүштү кайтарат, ал белгилүү чекитти камтыйт:- Бул ыкма алдын ала орнотулгандай, көрүнүштөргө байланышкан катмарларды эске алат:
- Өзгөчө көзөмөлдөө же басууну түздөн-түз катмарларда иштетүү үчүн
hitTest(_:with:)ыкмасын өзгөчөлөштүрүүгө болот:
-
Координаттарды
convertаркылуу өзгөртүү:- Сизде тийүү окуясы (мисалы,
UIViewыкмаларында) боюнча координаттар бар, алар терезеге (UIWindow) же көрүнүшкө карата: - Белгилүү бир катмарга тийүү түшкөнүн аныктоо үчүн, ошол координаттарды ошол катмардын координаттык системасына которуу керек:
- Бул үчүн
convert(_:from:)жеconvert(_:to:)ыкмалары колдонулатCALayer: - Көчүрүлгөндөн кийин, алынган чекит катмардын чегинен (
bounds) тышкары жеcontains(_:)сыяктуу атайын текшерүүлөрдү колдонуу менен текшерсе болот:
- Сизде тийүү окуясы (мисалы,
-
UITapGestureRecognizerтүзмөгүн көрүнүшкө байлоо:UITapGestureRecognizerтийүү жести түзмөгүнCALayerменен байланышканUIView-ге байлоо:- Жест иштетүүчүдө тийүү жайгашкан жерди көрүнүшкө карата алыңыз:
- Андан соң, координаттарды которуу ыкмасын (бөлүм 2) колдонуп, тийүү чекити керек катмарда же анын субкатмарларында жайгашканын текшерүү:
-
Ар бир интерактивдүү катмар үчүн
UIViewтүзүү:- Эгерде сизде интерактивдүү болушу керек катмарлар болсо, эң жөнөкөй ыкма — ар бир катмар үчүн тиешелүү
UIViewтүзүү: - Катмарга ылайык өлчөмдөрдү коюу жана орнотуу:
- Жест иштетүүчү же
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(point, with: event)` кайтаруу, стандарттуу жүрүм-турумду сактоо үчүн
}
// Калган учурларды стандарттык `hitTest` иштетет
return super.hitTest(point, with: event)
}
convert колдонуу мисалы жести иштетүүчүдө:
// `UITapGestureRecognizer` байланган `UIView` ичинде
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Тийүү чекитин көрүнүштөн субкатмарга которуу
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Чекиттин субкатмардын чегинде экенин текшерүү
if mySublayer.contains(tapLocationInSublayer) {
print("mySublayer үстүндө басуу")
// Бул жерде субкатмарга басуу менен байланышкан аракеттерди аткарыңыз
}
}