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

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

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

(void) handlePan:(UIPanGestureRecognizer *)paramPan{


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

[self.attachmentBehavior setAnchorPoint: tapPoint];

self.anchorView.center = tapPoint;


}


Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌ Π² нашСм Π²ΠΈΠ΄Π΅ Π΄Π²ΠΈΠΆΡƒΡ‰ΡƒΡŽΡΡ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² Π½Π΅Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ привязки. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ это сдСлаСм, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΌΡ‹ смоТСм Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ малСнький ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

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

Π Π°Π·Π΄Π΅Π»Ρ‹ 2.0 ΠΈ 10.3.

2.5. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ эффСкта динамичСского зацСплСния ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса

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

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄, находящийся Π² вашСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС, ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ мСсту Π½Π° экранС. ΠŸΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π°Ρ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ эффСкт защСлкивания. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° элСмСнт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса прикрСпляСтся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ экрана, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‰ΡƒΡ‰Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот элСмСнт ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ встроСнной ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ.

РСшСниС

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° UISnapBehavior ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ Ρ‚ΠΈΠΏΠ° UIDynamicAnimator.

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ-настоящСму ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ° зацСплСния, прСдставим сСбС нСбольшоС количСство ΠΆΠ΅Π»Π΅, смазанноС маслом ΠΈ Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ Π³Π»Π°Π΄ΠΊΠΎΠΌ столС. К ΠΆΠ΅Π»Π΅ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Π° струна. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ, насколько странным Π²Π°ΠΌ это каТСтся. Но слСдитС Π·Π° ΠΌΡ‹ΡΠ»ΡŒΡŽ. Допустим, я ΡΡ‚ΠΎΡŽ Π²ΠΎΠ·Π»Π΅ стола ΠΈ тяну Π·Π° струну, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΆΠ΅Π»Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠ»ΠΎΡΡŒ ΠΈΠ· исходной Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° столС Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ Π²Π°ΠΌΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΆΠ΅Π»Π΅ со всСх сторон ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΎ маслом, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ»Π°Π²Π½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π² этом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Но Ρ€Π°Π· это ΠΆΠ΅Π»Π΅, ΠΎΠ½ΠΎ, оказавшись Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ΅, Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ»Ρ‹Ρ…Π°Ρ‚ΡŒΡΡ. ИмСнно Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса UISnapBehavior.

Один ΠΈΠ· способов практичСского примСнСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ эффСкта Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π° экранС с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ располоТСно нСсколько Π²ΠΈΠ΄ΠΎΠ², Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ эти Π²ΠΈΠ΄Ρ‹ ΠΏΠΎ экрану ΠΏΠΎ своСму ТСланию ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ интСрфСйса. Π­Ρ‚Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ², описанных Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.3, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ получится слишком Π½Π΅Π³ΠΈΠ±ΠΊΠΈΠΌ. Π’ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 2.3 ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ экран, ΠΈ ΠΌΡ‹ добиваСмся Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠΊΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ Π½Π° экранС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. Но ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ Π·Π°Ρ†Π΅ΠΏΠΈΠΌ этот Π²ΠΈΠ΄, ассоциировав Π΅Π³ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ касаниС.

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


#import Β«ViewController.hΒ»


@interface ViewController ()

@property (nonatomic, strong) UIView *squareView;

@property (nonatomic, strong) UIDynamicAnimator *animator;

@property (nonatomic, strong) UISnapBehavior *snapBehavior;

@end

@implementation ViewController


<# ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ваш ΠΊΠΎΠ΄ находится здСсь #>

Π”Π°Π»Π΅Π΅ напишСм ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ рСгистратор ТСстов касания:

β€” (void) createGestureRecognizer{


UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]

initWithTarget: self

action:@selector(handleTap:)];

[self.view addGestureRecognizer: tap];


}


Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ понадобится ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ малСнький Π²ΠΈΠ΄ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана. Π― Π²Ρ‹Π±Ρ€Π°Π» для этой Ρ†Π΅Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ†Π΅Π½Ρ‚Ρ€, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ качСствС Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ Π²ΠΈΠ΄ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ†Π΅ΠΏΠ»ΡΡ‚ΡŒ с Ρ‚Π΅ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ экрана, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ прикоснСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π˜Ρ‚Π°ΠΊ, Π²ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ для создания этого Π²ΠΈΠ΄Π°:


β€” (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.view addSubview: self.squareView];

}


ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ созданию Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Π° (см. Ρ€Π°Π·Π΄Π΅Π» 2.0), послС Ρ‡Π΅Π³ΠΎ прикрСпляСм ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния Ρ‚ΠΈΠΏΠ° UISnapBehavior с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° initWithItem: snapToPoint:. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

β€’ initWithItem β€” динамичСский элСмСнт (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС наш Π²ΠΈΠ΄), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния. Как ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ динамичСскиС повСдСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, этот элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UIDynamicItem. ВсС экзСмпляры UIView ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ этому ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ, поэтому всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ;

β€’ snapToPoint β€” Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° (см. Ρ€Π°Π·Π΄Π΅Π» 2.0), Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ†Π΅ΠΏΠ»ΡΡ‚ΡŒΡΡ динамичСский элСмСнт.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎ Ρ‚Π°ΠΊΠΎΠΌ Π·Π°Ρ†Π΅ΠΏΠ»Π΅Π½ΠΈΠΈ: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ элСмСнтом, ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ экзСмпляр зацСплСния для этого элСмСнта β€” ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ экзСмпляра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ элСмСнт Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ПослС этого всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ зацСплСния Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ это ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. БСйчас ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния ΠΈ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ:


β€” (void) createAnimatorAndBehaviors{

self.animator = [[UIDynamicAnimator alloc]

initWithReferenceView: self.view];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ столкновСний */

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems:@[self.squareView]];

collision.translatesReferenceBoundsIntoBoundary = YES;


[self.animator addBehavior: collision];


/* ΠŸΠΎΠΊΠ° зацСпляСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄ с Π΅Π³ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ */

self.snapBehavior = [[UISnapBehavior alloc]

initWithItem: self.squareView

snapToPoint: self.squareView.center];

self.snapBehavior.damping = 0.5f; /* Medium oscillation */

[self.animator addBehavior: self.snapBehavior];

}


Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, здСсь ΠΌΡ‹ зацСпляСм нСбольшой ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄, связывая Π΅Π³ΠΎ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ, β€” Π² сущности, просто оставляСм Π΅Π³ΠΎ Π½Π° мСстС. ПозТС, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рСгистрируСм Π½Π° экранС ТСсты касания, ΠΌΡ‹ обновляСм ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ для этого повСдСния свойство damping. Π­Ρ‚ΠΎ свойство Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ†Π΅ΠΏΠ»Π΅Π½ Π·Π° Ρ‚ΠΎΡ‡ΠΊΡƒ. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π΅ΠΌ мСньшС ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ, соотвСтствСнно, Ρ‚Π΅ΠΌ слабСС Β«ΠΊΠΎΠ»Ρ‹ΡˆΠ΅Ρ‚ΡΡΒ» элСмСнт. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 1. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²ΠΈΠ΄ появится Π½Π° экранС, Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ малСнький ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²ΠΈΠ΄, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ рСгистратор ТСстов касания, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния:


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

[super viewDidAppear: animated];


[self createGestureRecognizer];

[self createSmallSquareView];

[self createAnimatorAndBehaviors];

}


ПослС создания рСгистратора ТСстов касания Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ createGestureRecognizer Π²ΠΈΠ΄Π° с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ ΠΌΡ‹ ΠΏΡ€ΠΈΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ рСгистратору ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Ρ‚Π°ΠΊΠΈΡ… касаниях ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ handleTap: Π²ΠΈΠ΄Π° с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ. Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ прикоснулся ΠΊ экрану, послС Ρ‡Π΅Π³ΠΎ обновляСм ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зацСплСния.

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


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


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


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


if (self.snapBehavior!= nil){

[self.animator removeBehavior: self.snapBehavior];

}


self.snapBehavior = [[UISnapBehavior alloc] initWithItem: self.squareView

snapToPoint: tapPoint];

self.snapBehavior.damping = 0.5f; /* Π‘рСдняя осцилляция */

[self.animator addBehavior: self.snapBehavior];