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

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

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

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


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

}

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

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

2.6. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ характСристик динамичСским эффСктам

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

ВСроятно, вас устраиваСт стандартная Ρ„ΠΈΠ·ΠΈΠΊΠ°, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ встроСнная Π² динамичСскиС повСдСния ΠΈΠ· UIKit. Но ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с элСмСнтами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ управляСтС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ динамичСских ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ этим элСмСнтам ΠΈ ΠΈΠ½Ρ‹Π΅ характСристики, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ массу ΠΈ ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ.

РСшСниС

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° UIDynamicItemBehavior ΠΈ присвойтС Π΅ΠΌΡƒ ваши динамичСскиС элСмСнты. ПослС инстанцирования ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ свойствами этого класса для измСнСния характСристик динамичСских элСмСнтов. Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ (см. Ρ€Π°Π·Π΄Π΅Π» 2.0) β€” ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ сдСлаСт Π·Π° вас.

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

ДинамичСскиС повСдСния ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ подходят для добавлСния рСалистичной Ρ„ΠΈΠ·ΠΈΠΊΠΈ ΠΊ элСмСнтам, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UIDynamicItem, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎ всСм Π²ΠΈΠ΄Π°ΠΌ Ρ‚ΠΈΠΏΠ° UIView. Но Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прилоТСниях Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ характСристики ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ элСмСнта. НапримСр, Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ эффСкты тяготСния ΠΈ столкновСния (см. Ρ€Π°Π·Π΄Π΅Π»Ρ‹ 2.1 ΠΈ 2.2), Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов Π½Π° экранС, ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‰ΠΈΠΉΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ тяготСния ΠΈ столкновСниям, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΡΠΊΠ°ΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ сильнСС, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ элСмСнт. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ случаС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Ρ…ΠΎΠ΄Π΅ воплощСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… эффСктов, примСняСмых Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊ элСмСнту, этот элСмСнт Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ.

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π±Π΅Π· Ρ‚Ρ€ΡƒΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ экзСмпляров класса UIDynamicItemBehavior. Π­Ρ‚ΠΈ экзСмпляры Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ динамичСскими повСдСниями, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° экзСмпляра addBehavior:, относящСгося ΠΊ классу UIDynamicAnimator, β€” Π² этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ Ρ‚Π°ΠΊ ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ. Когда Π²Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ экзСмпляр этого класса, Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄-ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ initWithItems: ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ваш Π²ΠΈΠ΄ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UIDynamicItem. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляр элСмСнта с динамичСским ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° init, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ этому повСдСнию Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ addItem:.

ЭкзСмпляры класса UIDynamicItemBehavior ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ настраиваСмыми свойствами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ динамичСских элСмСнтов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΈΠ΄ΠΎΠ²). Π”Π°Π»Π΅Π΅ пСрСчислСны ΠΈ ΠΎΠ±ΡŠΡΡΠ½Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ свойства этого класса.

β€’ allowsRotation β€” логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ YES, Ρ‚ΠΎ, ΠΊΠ°ΠΊ понятно ΠΈΠ· названия, это свойство позволяСт Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ динамичСскиС элСмСнты Π² Ρ…ΠΎΠ΄Π΅ примСнСния ΠΊ Π½ΠΈΠΌ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… эффСктов. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого свойства Π² YES, Ссли ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΠΈΠ·ΠΈΠΊΡƒ, Π½ΠΎ Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт Π½ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π·Π°Π΄Π°ΠΉΡ‚Π΅ для этого свойства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NO ΠΈ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ элСмСнт ΠΊ этому повСдСнию.

β€’ resistance β€” сопротивлСниС элСмСнта двиТСнию. Π­Ρ‚ΠΎ свойство ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ CGFLOAT_MAX. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π΅ΠΌ сильнСС Π±ΡƒΠ΄Π΅Ρ‚ сопротивлСниС, ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ элСмСнтом Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π½Π° Π½Π΅Π³ΠΎ силам (Ρ‚Π΅ΠΌ силам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚Π΅). НапримСр, Ссли Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΊ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Ρƒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ тяготСния ΠΈ создадитС Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана Π²ΠΈΠ΄ с сопротивлСниСм CGFLOAT_MAX, Ρ‚ΠΎ тяготСниС Π½Π΅ смоТСт ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ этот Π²ΠΈΠ΄ ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ экрана. Π’ΠΈΠ΄ просто останСтся Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π²Ρ‹ Π΅Π³ΠΎ создали.

β€’ friction β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 1. Оно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ силу трСния, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° края Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта, ΠΊΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты ΡΠΎΡƒΠ΄Π°Ρ€ΡΡŽΡ‚ΡΡ с Π½ΠΈΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡΠΊΠ°Π»ΡŒΠ·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎ Π΅Π³ΠΎ ΠΊΡ€Π°ΡŽ. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π΅ΠΌ большС сила трСния, примСняСмая ΠΊ элСмСнту.


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

β€’ elasticity β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 1. Оно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, насколько эластичным Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ элСмСнт. Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ пластичным ΠΈ Β«ΠΆΠ΅Π»Π΅ΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌΒ» Π±ΡƒΠ΄Π΅Ρ‚ этот элСмСнт с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Π°. О Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассказано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.5.

β€’ density β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 1 (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ примСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1). Оно Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСпосрСдствСнно для воздСйствия Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ динамичСских ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΉ элСмСнтов, Π½ΠΎ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ рассчитываСт массу ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ эта масса отраТаСтся Π½Π° Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… эффСктах. НапримСр, Ссли Π²Ρ‹ столкнСтС ΠΎΠ΄ΠΈΠ½ элСмСнт с Π΄Ρ€ΡƒΠ³ΠΈΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 2.3), Π½ΠΎ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒ 1, Π° Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” 0,5, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… высотС ΠΈ ΡˆΠΈΡ€ΠΈΠ½Π΅ ΠΎΠ±ΠΎΠΈΡ… элСмСнтов масса ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта Π±ΡƒΠ΄Π΅Ρ‚ большС, Ρ‡Π΅ΠΌ масса Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. Аниматор вычисляСт массу элСмСнтов, исходя ΠΈΠ· ΠΈΡ… плотности ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² экрана. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π²Ρ‹ столкнСтС малСнький Π²ΠΈΠ΄ с высокой ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ с большим Π²ΠΈΠ΄ΠΎΠΌ с ΠΎΡ‡Π΅Π½ΡŒ Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΠ»ΠΎΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚ΠΎ малСнький Π²ΠΈΠ΄, Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ плотности этого элСмСнта, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ воспринят Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ массивный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ Π²ΠΈΠ΄. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ сильнСС ΠΎΡ‚Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ Ρ‚ΠΎΡ‚ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° экранС каТСтся Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»Ρ‡ΠΎΠΊ, сообщаСмый ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ элСмСнтом ΠΌΠ΅Π»ΠΊΠΎΠΌΡƒ, получится Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.


ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. Он отчасти основан Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, рассмотрСнном Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.2. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ· этого Ρ€Π°Π·Π΄Π΅Π»Π° ΠΌΡ‹ собираСмся Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Π½ΠΎ Ρ‚ΠΎΡ‚ Π²ΠΈΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится снизу, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ эластичным, Π° ΡΠ»Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ Π²ΠΈΠ΄Π°, располоТСнного свСрху, Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСвысока. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π° Π²ΠΈΠ΄Π° ΡƒΠΏΠ°Π΄ΡƒΡ‚ Π½Π° Π΄Π½ΠΎ экрана, Π³Π΄Π΅ столкнутся с Π½ΠΈΠΆΠ½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ, Π½ΠΈΠΆΠ½ΠΈΠΉ Π²ΠΈΠ΄ отскочит ΠΎΡ‚ Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сильнСС, Ρ‡Π΅ΠΌ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ с опрСдСлСния Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… свойств ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π²ΠΈΠ΄Π°:


#import Β«ViewController.hΒ»


@interface ViewController ()

@property (nonatomic, strong) UIDynamicAnimator *animator;

@end


@implementation ViewController


<# ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ вашСго ΠΊΠΎΠ΄Π° находится здСсь #>


Π”Π°Π»Π΅Π΅ напишСм ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ смоТСм ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΈΠ΄Ρ‹ с Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ„ΠΎΠ½Π°. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для создания Π΄Π²ΡƒΡ… ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹Ρ… Π² Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π°:


β€” (UIView *) newViewWithCenter:(CGPoint)paramCenter

backgroundColor:(UIColor *)paramBackgroundColor{


UIView *newView =

[[UIView alloc] initWithFrame:

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

newView.backgroundColor = paramBackgroundColor;

newView.center = paramCenter;


return newView;


}


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основной Π²ΠΈΠ΄ отобразится Π½Π° экранС, создадим Π΄Π²Π° этих Π²ΠΈΠ΄Π° ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ ΠΈΡ… Π½Π° дисплСй:


UIView *topView = [self newViewWithCenter: CGPointMake(100.0f, 0.0f)

backgroundColor: [UIColor greenColor]];

UIView *bottomView = [self newViewWithCenter: CGPointMake(100.0f, 50.0f)

backgroundColor: [UIColor redColor]];


[self.view addSubview: topView];

[self.view addSubview: bottomView];

Π”Π°Π»Π΅Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π²ΠΈΠ΄Π°ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ тяготСния β€” этому ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.1:

self.animator = [[UIDynamicAnimator alloc]

initWithReferenceView: self.view];


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ тяготСниС */

UIGravityBehavior *gravity = [[UIGravityBehavior alloc]

initWithItems:@[topView, bottomView]];

[self.animator addBehavior: gravity];


ΠœΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Ρ‹ Π²Ρ‹ΠΏΠ°Π΄Π°Π»ΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ экрана, достигнув Π΅Π³ΠΎ Π΄Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ знаниями, ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½Ρ‹ΠΌΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.2, ΠΈ Π·Π°Π΄Π°Π΄ΠΈΠΌ для Π°Π½ΠΈΠΌΠ°Ρ‚ΠΎΡ€Π° ниТнюю Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ столкновСния:


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

UICollisionBehavior *collision = [[UICollisionBehavior alloc]

initWithItems:@[topView, bottomView]];

collision.translatesReferenceBoundsIntoBoundary = YES;