β (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: Π²ΠΈΠ΄Π° ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ°ΠΊ: