Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 99

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

/* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ°Π»ΡŒΡ†Π΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° ΡΠΊΡ€Π°Π½Π΅. */

self.longPressGestureRecognizer.numberOfTouchesRequired = 2;


/* Π”опускаСтся Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° 100 Ρ‚ΠΎΡ‡Π΅ΠΊ,

ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ТСст Π±ΡƒΠ΄Π΅Ρ‚ распознан. */

self.longPressGestureRecognizer.allowableMovement = 100.0f;


/* ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΆΠ°Ρ‚ΡŒ ΠΊ экрану Π΄Π²Π° ΠΏΠ°Π»ΡŒΡ†Π°

(numberOfTouchesRequired) ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° ΡΠ΅ΠΊΡƒΠ½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ТСст

Π±Ρ‹Π» распознан. */

self.longPressGestureRecognizer.minimumPressDuration = 1.0;


/* Π”обавляСм этот Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов ΠΊ Π²ΠΈΠ΄Ρƒ. */

[self.view addGestureRecognizer: self.longPressGestureRecognizer];


}

Если Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ события, отправляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ТСст ΠΈ Π² этой ситуации поступаСт входящий Π·Π²ΠΎΠ½ΠΎΠΊ Π»ΠΈΠ±ΠΎ наступаСт ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅, Ρ‚ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² состояниС UIGestureRecognizerStateCancelled. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ распознаватСля ТСстов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ снова Π½Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ всю ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ возобновился процСсс распознавания. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ распознаваниС возобновится послС удСрТания хотя Π±Ρ‹ Π΄Π²ΡƒΡ… ΠΏΠ°Π»ΡŒΡ†Π΅Π² Π½Π° Π²ΠΈΠ΄Π΅ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Π²ΠΈΠ΄Π°, ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄Π»ΠΈΡ‚ΡŒΡΡ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 1 сСкунды.

Код Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Π²ΠΈΠ΄Π° со свойством longPressGestureRecognizer Ρ‚ΠΈΠΏΠ° UILongPressGestureRecognizer. Π­Ρ‚ΠΎΡ‚ аспСкт ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ рассмотрСн Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅ «РСшСниС» Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π’ составС iOS SDK Π΅ΡΡ‚ΡŒ класс для распознавания Π΄ΠΎΠ»Π³ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся UILongTapGestureRecognizer. ЖСст Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ наТатия инициируСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ (количСство ΠΏΠ°Π»ΡŒΡ†Π΅Π² Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π°Π΄Π°Π΅Ρ‚ программист) Π²ΠΈΠ΄ UIView ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Π»Π΅Ρ† (ΠΈΠ»ΠΈ ΠΏΠ°Π»ΡŒΡ†Ρ‹) Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ Π½Π° протяТСнии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ количСства сСкунд. Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»Π³ΠΈΠ΅ наТатия β€” это Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Π΅ события.

На Ρ€Π°Π±ΠΎΡ‚Ρƒ распознаватСля ТСстов Π΄ΠΎΠ»Π³ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π²Π»ΠΈΡΡŽΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… свойства:

β€’ numberOfTapsRequired β€” это количСство Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ ТСст Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ наТатия. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ β€” это Π½Π΅ просто ΠΏΡ€ΠΈΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ ΠΊ экрану. НаТатиС β€” это Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ°Π»Π΅Ρ† сначала приТимаСтся ΠΊ экрану, Π° ΠΏΠΎΡ‚ΠΎΠΌ отрываСтся ΠΎΡ‚ Π½Π΅Π³ΠΎ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это свойство ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0;

β€’ numberOfTouchesRequired β€” Π² этом свойствС указываСтся количСство ΠΏΠ°Π»ΡŒΡ†Π΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π° экранС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ начнСтся распознаваниС ТСста. Если свойство numberOfTapsRequired ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС 0, Ρ‚ΠΎ для обнаруТСния Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ количСство ΠΏΠ°Π»ΡŒΡ†Π΅Π²;

β€’ allowableMovement β€” это максимальноС количСство пиксСлов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ ΠΏΠ°Π»Π΅Ρ† Π½Π° экранС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ распознаваниС ТСста Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΎ;

β€’ minimumPressDuration β€” Π΄Π°Π½Π½ΠΎΠ΅ свойство ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ (Π² сСкундах) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΆΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ°Π»ΡŒΡ†Ρ‹ ΠΊ экрану, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ ТСст.


Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для пСрСчислСнных свойств Π·Π°Π΄Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

β€’ numberOfTapsRequired β€” Default (это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ Π½Π΅ мСняСм);

β€’ numberOfTouchesRequired β€” 2;

β€’ allowableMovement β€” 100;

β€’ minimumPressDuration β€” 1.


ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΈΡ… значСниях ТСст Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ наТатия Π±ΡƒΠ΄Π΅Ρ‚ распознан, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΌΠ΅Ρ‚ экран двумя ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΏΠ°Π»ΡŒΡ†Ρ‹ Π½Π° экранС Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 1 сСкунды (minimumPressDuration), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΏΠ°Π»ΡŒΡ†Ρ‹ ΠΎΡ‚ мСста касания ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° 100 пиксСлов (allowableMovement).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ТСст распознан, ΠΎΠ½ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ handleLongPressGestures:, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


β€” (void) handleLongPressGestures:

(UILongPressGestureRecognizer *)paramSender{


/* Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΉΡ‚ΠΈ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ,

ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠΌΠΈ ТСст Π΄ΠΎΠ»Π³ΠΎΠ³ΠΎ наТатия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ.

ΠœΡ‹ сконфигурировали это число, воспользовавшись свойством

numberOfTouchesRequired класса UILongPressGestureRecognizer,

инстанцированного Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ экзСмпляра viewDidLoad Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°

Π²ΠΈΠ΄Π°. Π•сли выяснится, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² качСствС Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ, ΠΌΡ‹ ΡΡ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ. */


if (paramSender.numberOfTouchesRequired == 2){

CGPoint touchPoint1 =

[paramSender locationOfTouch:0

inView: paramSender.view];


CGPoint touchPoint2 =

[paramSender locationOfTouch:1

inView: paramSender.view];


CGFloat midPointX = (touchPoint1.x + touchPoint2.x) / 2.0f;

CGFloat midPointY = (touchPoint1.y + touchPoint2.y) / 2.0f;


CGPoint midPoint = CGPointMake(midPointX, midPointY);

self.dummyButton.center = midPoint;


} else {

/* Π­Ρ‚ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ

Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ двумя ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ. */


}

}


}

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для iOS, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠ»Π³ΠΈΠ΅ наТатия, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Maps (ΠšΠ°Ρ€Ρ‚Ρ‹). ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€Π°Π·Π½Ρ‹Π΅ мСста, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ ΠΈ Π½Π΅Π½Π°Π΄ΠΎΠ»Π³ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ ΠΏΠ°Π»Π΅Ρ†. Π’ этой Ρ‚ΠΎΡ‡ΠΊΠ΅ появится ΠΌΠ°Ρ€ΠΊΠ΅Ρ€.

10.5. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

НСобходимо Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ экранный Π²ΠΈΠ΄ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅.

РСшСниС

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ экзСмпляр класса UITapGestureRecognizer ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ ΠΊ Ρ†Π΅Π»Π΅Π²ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° экзСмпляра addGestureRecognizer:, относящСгося ΠΊ классу UIView. Рассмотрим ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π° (.h-Ρ„Π°ΠΉΠ»):


#import Β«ViewController.hΒ»


@interface ViewController ()


@property (nonatomic, strong)

UITapGestureRecognizer *tapGestureRecognizer;


@end

@implementation ViewController

РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° экзСмпляра viewDidLoad ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π° Ρ‚Π°ΠΊΠΎΠ²Π°:

β€” (void)viewDidLoad {

[super viewDidLoad];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ. */

self.tapGestureRecognizer = [[UITapGestureRecognizer alloc]

initWithTarget: self

action:@selector(handleTaps:)];


/* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ°Π»ΡŒΡ†Π΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° ΡΠΊΡ€Π°Π½Π΅. */

self.tapGestureRecognizer.numberOfTouchesRequired = 2;


/* ΠžΠ±Ρ‰Π΅Π΅ количСство касаний, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅

Ρ‡Π΅ΠΌ ТСст Π±ΡƒΠ΄Π΅Ρ‚ распознан. */

self.tapGestureRecognizer.numberOfTapsRequired = 3;


/* Π”обавляСм ΠΊ Π²ΠΈΠ΄Ρƒ этот Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов. */

[self.view addGestureRecognizer: self.tapGestureRecognizer];


}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π»ΡƒΡ‡ΡˆΠ΅ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… распознаватСлСй ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для обнаруТСния ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ (Ρ‚ΠΎΠ»Ρ‡ΠΊΠΎΠ²) Π½Π° экран. НаТатиС β€” это событиС, происходящСС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ касаСтся ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ экрана, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ°Π»Π΅Ρ† ΠΎΡ‚ Π½Π΅Π³ΠΎ. ЖСст наТатия являСтся дискрСтным.

ΠœΠ΅Ρ‚ΠΎΠ΄ locationInView: класса UITapGestureRecognizer ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для обнаруТСния Ρ‚ΠΎΡ‡ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС наТатия. Если для рСгистрации наТатия трСбуСтся Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ касания, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ locationOfTouch: inView: класса UITapGestureRecognizer, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… касаний. Π’ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π·Π°Π΄Π°Π»ΠΈ для свойства numberOfTouchesRequired распознаватСля ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŽ ТСстов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ наТатия Π½Π° экранС Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π΄Π²Π° ΠΏΠ°Π»ΡŒΡ†Π°. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ТСсты-наТатия стали Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒΡΡ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ 3. Π― сдСлал это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства numberOfTapsRequired. Π― ΡƒΠΊΠ°Π·Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ handleTaps: Π² качСствС Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° распознаватСля ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ:


β€” (void) handleTaps:(UITapGestureRecognizer*)paramSender{


NSUInteger touchCounter = 0;

for (touchCounter = 0;

touchCounter < paramSender.numberOfTouchesRequired;

touchCounter++){

CGPoint touchPoint =

[paramSender locationOfTouch: touchCounter

inView: paramSender.view];

NSLog(@"Touch #%lu: %@",

(unsigned long)touchCounter+1,

NSStringFromCGPoint(touchPoint));

}


}


Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ доТидаСмся, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅ количСство Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ТСстов-Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ. БСря Π·Π° основу это количСство, ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΎ сдСлано ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ устройством ΠΈΠ»ΠΈ с симулятором, Π² ΠΎΠΊΠ½Π΅ консоли Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:


Touch #1: {107, 186}

Touch #2: {213, 254}

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с симулятором ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… наТатия, удСрТивая ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Option ΠΈ пСрСдвигая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ экрану симулятора. На экранС появятся Π΄Π²Π΅ концСнтричСскиС Ρ‚ΠΎΡ‡ΠΊΠΈ касания.