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

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

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

β€” (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];


[self createGestureRecognizer];

[self createSmallSquareView];

[self createAnimatorAndBehaviors];


}


ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, взглянув Π½Π° Ρ„Π°ΠΉΠ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° createGestureRecognizer, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ устанавливаСм рСгистратор ТСстов касаний Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π° β€” этот ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся handleTap:. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ handleTap: вычисляСм расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ малСнького ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈ Ρ‚ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ дотронулся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠΌΠ΅Π΅ΠΌ ΠΌΠ°Π³Π½ΠΈΡ‚ΡƒΠ΄Ρƒ силы Ρ‚ΠΎΠ»Ρ‡ΠΊΠ°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, рассчитаСм ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ малСнького ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ касания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠ³ΠΎΠ» Ρ‚ΠΎΠ»Ρ‡ΠΊΠ°:


β€” (void) handleTap:(UITapGestureRecognizer *)paramTap{


/* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ касания */


CGPoint tapPoint = [paramTap locationInView: self.view];

CGPoint squareViewCenterPoint = self.squareView.center;


/* Π’ычисляСм ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ касания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡƒΠ³ΠΎΠ» Ρ‚ΠΎΠ»Ρ‡ΠΊΠ°

Π€ΠΎΡ€ΠΌΡƒΠ»Π° для опрСдСлСния ΡƒΠ³Π»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ:

arc tangent 2((p1.x β€” p2.x), (p1.y β€” p2.y)) */


CGFloat deltaX = tapPoint.x β€” squareViewCenterPoint.x;

CGFloat deltaY = tapPoint.y β€” squareViewCenterPoint.y;

CGFloat angle = atan2(deltaY, deltaX);

[self.pushBehavior setAngle: angle];


/* Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ касания ΠΈ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° для вычислСния ΠΌΠ°Π³Π½ΠΈΡ‚ΡƒΠ΄Ρ‹ Ρ‚ΠΎΠ»Ρ‡ΠΊΠ°

Π€ΠΎΡ€ΠΌΡƒΠ»Π° опрСдСлСния расстояния:

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· ((p1.x β€” p2.x)^2 + (p1.y β€” p2.y)^2) */


CGFloat distanceBetweenPoints =

sqrt(pow(tapPoint.x β€” squareViewCenterPoint.x, 2.0) +

pow(tapPoint.y β€” squareViewCenterPoint.y, 2.0));

[self.pushBehavior setMagnitude: distanceBetweenPoints / 200.0f];

}

НС Π±ΡƒΠ΄Ρƒ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² Ρ‚Ρ€ΠΈΠ³ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΡŽ, Π½ΠΎ Π² этом ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ простая Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°, изучаСмая Π² школьном курсС. По этой Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ рассчитываСтся ΡƒΠ³ΠΎΠ» Π² Ρ€Π°Π΄ΠΈΠ°Π½Π°Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅ примСняСтся Ρ‚Π΅ΠΎΡ€Π΅ΠΌΠ° ΠŸΠΈΡ„Π°Π³ΠΎΡ€Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡƒΠ·Π½Π°Ρ‚ΡŒ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Π­Ρ‚ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅, взглянув Π½Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я оставил Π² ΠΊΠΎΠ΄Π΅. Если ΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΈΠΌΠΈ понятиями, ΠΊΠ°ΠΊ ΡƒΠ³Π»Ρ‹ ΠΈ Ρ€Π°Π΄ΠΈΠ°Π½Ρ‹, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡˆΡ‚ΡƒΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ Ρ‚Ρ€ΠΈΠ³ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, запустив ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ сначала ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ малСнький Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана. Π”ΠΎΡ‚Ρ€ΠΎΠ½ΡŒΡ‚Π΅ΡΡŒ Π΄ΠΎ экрана Π² любой Ρ‚ΠΎΡ‡ΠΊΠ΅ поля, ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ (Π±Π΅Π»ΠΎΠ΅ пространство), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ (Π²ΠΈΠ΄) стал Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я Π±Π΅Ρ€Ρƒ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ касания ΠΈ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° ΠΈ дСлю Π΅Π³ΠΎ Π½Π° 200, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ°Π³Π½ΠΈΡ‚ΡƒΠ΄Ρƒ Ρ‚ΠΎΠ»Ρ‡ΠΊΠ°, Π½ΠΎ Π²Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ускорСниС, Π²Ρ‹Π±Ρ€Π°Π², скаТСм, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 100, Π° Π½Π΅ 200. ВсСгда Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ числовыми значСниями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для вашСго прилоТСния.

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

Π Π°Π·Π΄Π΅Π» 2.2.

2.4. ΠŸΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… динамичСских элСмСнтов Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ

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

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

РСшСниС

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ прикрСплСния, относящССся ΠΊ Ρ‚ΠΈΠΏΡƒ UIAttachmentBehavior, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° экзСмпляра initWithItem: point: attachedToAnchor: этого класса. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ (см. Ρ€Π°Π·Π΄Π΅Π» 2.0), ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΌΡƒ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΡƒ ΠΈ Ρ„ΠΈΠ·ΠΈΠΊΡƒ двиТСния.

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

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ прикрСплСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСпонятным. Оно сводится ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ Π½Π° экранС Ρ‚ΠΎΡ‡ΠΊΡƒ привязки, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° этой привязкой. Но я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Допустим, Ρƒ вас Π½Π° столС Π»Π΅ΠΆΠΈΡ‚ большая фотография. Если Π²Ρ‹ поставитС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Π»Π΅Ρ† Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ ΠΈ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ΠΈΠΌ Π²Ρ€Π°Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ двиТСния, Ρ‚ΠΎ фотография, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅Ρ€Ρ‚Π΅Ρ‚ΡŒΡΡ Π½Π° столС вмСстС с вашим ΠΏΠ°Π»ΡŒΡ†Π΅ΠΌ. Π’Π°ΠΊΠΎΠ΅ ΠΆΠ΅ рСалистичноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π² iOS, воспользовавшись ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ прикрСплСния ΠΈΠ· UIKit.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ собираСмся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ продСмонстрирован Π½Π° рис. 2.3.


Рис. 2.3. ИмСнно Ρ‚Π°ΠΊΠΎΠ³ΠΎ эффСкта ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ повСдСния прикрСплСния


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π½Π° экранС находятся Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π°. Основной Π²ΠΈΠ΄ располоТСн Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅, Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ этого Π²ΠΈΠ΄Π° Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄, Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠΉ. МалСнький Π²ΠΈΠ΄ β€” это ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‚ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ привязки, ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я описал Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ. НаконСц, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° привязки Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ экрану ΠΏΠΎΠ΄ дСйствиСм ТСста панорамирования ΠΈ рСгистратора ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ТСстов (см. Ρ€Π°Π·Π΄Π΅Π» 10.3). Π—Π°Ρ‚Π΅ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΡ… Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ станСт Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ большой Π²ΠΈΠ΄, располоТСнный Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ с опрСдСлСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… свойств ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π°:


#import Β«ViewController.hΒ»


@interface ViewController ()

@property (nonatomic, strong) UIView *squareView;

@property (nonatomic, strong) UIView *squareViewAnchorView;

@property (nonatomic, strong) UIView *anchorView;

@property (nonatomic, strong) UIDynamicAnimator *animator;

@property (nonatomic, strong) UIAttachmentBehavior *attachmentBehavior;

@end


@implementation ViewController


<# ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π° находится здСсь #>


Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ потрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ малСнький ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄. Но Π½Π° этот Ρ€Π°Π· ΠΌΡ‹ помСстим Π²Π½ΡƒΡ‚Ρ€ΡŒ Π½Π΅Π³ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄. МалСнький Π²ΠΈΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΌΡ‹ фактичСски соСдиним с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ привязки повСдСния прикрСплСния, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠ΅ΠΉ:


β€” (void) createSmallSquareView{

self.squareView =

[[UIView alloc] initWithFrame:

CGRectMake(0.0f, 0.0f, 80.0f, 80.0f)];


self.squareView.backgroundColor = [UIColor greenColor];

self.squareView.center = self.view.center;


self.squareViewAnchorView = [[UIView alloc] initWithFrame:

CGRectMake(60.0f, 0.0f, 20.0f, 20.0f)];

self.squareViewAnchorView.backgroundColor = [UIColor brownColor];

[self.squareView addSubview: self.squareViewAnchorView];


[self.view addSubview: self.squareView];

}

Π”Π°Π»Π΅Π΅ создадим Π²ΠΈΠ΄ с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ привязки:

β€” (void) createAnchorView{


self.anchorView = [[UIView alloc] initWithFrame:

CGRectMake(120.0f, 120.0f, 20.0f, 20.0f)];

self.anchorView.backgroundColor = [UIColor redColor];

[self.view addSubview: self.anchorView];


}


ПослС этого потрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ рСгистратор ТСстов панорамирования ΠΈ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… этой Π³Π»Π°Π²Ρ‹:


β€” (void) createGestureRecognizer{

UIPanGestureRecognizer *panGestureRecognizer =

[[UIPanGestureRecognizer alloc] initWithTarget: self

action:@selector(handlePan:)];

[self.view addGestureRecognizer: panGestureRecognizer];

}


β€” (void) createAnimatorAndBehaviors{


self.animator = [[UIDynamicAnimator alloc]

initWithReferenceView: self.view];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ распознаваниС столкновСний */

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems:@[self.squareView]];

collision.translatesReferenceBoundsIntoBoundary = YES;


self.attachmentBehavior = [[UIAttachmentBehavior alloc]

initWithItem: self.squareView

point: self.squareViewAnchorView.center

attachedToAnchor: self.anchorView.center];

[self.animator addBehavior: collision];

[self.animator addBehavior: self.attachmentBehavior];

}


β€” (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];


[self createGestureRecognizer];

[self createSmallSquareView];

[self createAnchorView];

[self createAnimatorAndBehaviors];

}


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ привязки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° экзСмпляра initWithItem: point: attachedToAnchor:. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

β€’ initWithItem β€” динамичСский элСмСнт (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Π²ΠΈΠ΄), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ привязки;

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

β€’ attachedToAnchor β€” сама Ρ‚ΠΎΡ‡ΠΊΠ° привязки, измСряСмая ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ CGPoint.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ соСдинили Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ привязки (прСдставлСнной ΠΊΠ°ΠΊ Π²ΠΈΠ΄ Ρ‚ΠΎΡ‡ΠΊΠΈ привязки), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, двигая Ρ‚ΠΎΡ‡ΠΊΡƒ привязки, ΠΌΡ‹ опосрСдованно Π±ΡƒΠ΄Π΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄. ВСрнСмся ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ createGestureRecognizer, написанному Ρ€Π°Π½Π΅Π΅. Π’Π°ΠΌ ΠΌΡ‹ задСйствовали рСгистратор ТСстов касания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°Π»ΡŒΡ†Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ экрану. ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ рСгистратор ТСстов Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ handlePan: Π²ΠΈΠ΄Π° ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊ: