(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];