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

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

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

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

Π Π°Π·Π΄Π΅Π»Ρ‹ 17.12 ΠΈ 17.14.

17.16. АнимированиС ΠΈ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΎΠ²

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

ВрСбуСтся Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄Ρ‹ Π½Π° экранС ΠΏΡ€ΠΈ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ.

РСшСниС

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ вращСния, для анимирования вращСния ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса UIView.

ΠŸΠ΅Ρ€Π΅Π΄ дальнСйшСй Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» 17.14.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²ΠΈΠ΄, анимируя Π΅Π³ΠΎ ΠΏΡ€ΠΈ этом, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ вращСния Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ Π² ΠΊΠΎΠ΄Π΅ выполняСтся Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ (см. Ρ€Π°Π·Π΄Π΅Π» 17.12). Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прояснит это. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ рисунок Xcode.png (см. рис. 17.9) ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° появится Π½Π° экранС, ΠΌΡ‹ ΠΏΠΎΠ²Π΅Ρ€Π½Π΅ΠΌ Π΅Π΅ Π½Π° 90Β° Π·Π° 5 сСкунд, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ²Π΅Ρ€Π½Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, поставив Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ появится Π½Π° экранС, ΠΏΠΎΠ²Π΅Ρ€Π½Π΅ΠΌ этот Π²ΠΈΠ΄ Π½Π° 90Β° ΠΏΠΎ часовой стрСлкС:


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

[super viewDidAppear: paramAnimated];


self.xcodeImageView.center = self.view.center;


/* ΠΠ°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ. */

[UIView beginAnimations:@"clockwiseAnimation"

context: NULL];


/* ΠΠ½ΠΈΠΌΠ°Ρ†ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π»ΠΈΡ‚ΡŒΡΡ 5 ΡΠ΅ΠΊΡƒΠ½Π΄. */

[UIView setAnimationDuration:5.0f];


[UIView setAnimationDelegate: self];


[UIView setAnimationDidStopSelector:

@selector(clockwiseRotationStopped: finished: context:)];


/* ΠŸΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° 90Β°. */

self.xcodeImageView.transform =

CGAffineTransformMakeRotation((90.0f * M_PI) / 180.0f);


/* Π’ыполняСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ. */

[UIView commitAnimations];


}


ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ сСлСктор clockwiseRotationStopped: finished: context: Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° заканчиваСтся анимация вращСния ΠΏΠΎ часовой стрСлкС. Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²ΠΈΠ΄ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ 0Β° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ исходноС). На это Ρ‚ΠΎΠΆΠ΅ ΡƒΠΉΠ΄Π΅Ρ‚ 5 сСкунд.


β€” (void)clockwiseRotationStopped:(NSString *)paramAnimationID

finished:(NSNumber *)paramFinished

context:(void *)paramContext{

[UIView beginAnimations:@"counterclockwiseAnimation"

context: NULL];

/* 5 ΡΠ΅ΠΊΡƒΠ½Π΄ */

[UIView setAnimationDuration:5.0f];


/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ */

self.xcodeImageView.transform = CGAffineTransformIdentity;


[UIView commitAnimations];

}


Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 17.14 ΠΈ 17.15, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅, сущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄Ρ‹ (прямыС ΠΈΠ»ΠΈ нСпрямыС подклассы UIView). ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ΠΌΠ°Π»ΠΎ свойств. Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΊΡ€Π΅Π°Ρ‚ΠΈΠ²Π½Ρ‹ ΠΈ экспСримСнтируйтС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ свойствами UIView, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π½ΡŒΡˆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π·Π½Π°Π»ΠΈ. НС ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ UIView Π² ΠΎΡ€Π³Π°Π½Π°ΠΉΠ·Π΅Ρ€Π΅ Xcode.

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

Π Π°Π·Π΄Π΅Π»Ρ‹ 17.13–17.15.

17.17. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ изобраТСния со ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ΠΎΠΌ Π²ΠΈΠ΄Π°

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

ВрСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ содСрТимоС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-Π²ΠΈΠ΄Π°, находящСгося Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π² Π²ΠΈΠ΄Π΅ изобраТСния. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊΠΆΠ΅ потрСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ это ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° дискС ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с Π½ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ дСйствиС β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ этой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΎΠΉ Π² любимой ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти (см. Ρ€Π°Π·Π΄Π΅Π» 11.11).

РСшСниС

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги.

1. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ UIGraphicsBeginImageContextWithOptions для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ контСкста изобраТСния. Π­Ρ‚ΠΎΡ‚ контСкст сразу станСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ (Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ), ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ рисованиС.

2. Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ drawViewHierarchyInRect: вашСго класса UIView. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π²ΠΈΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС.

3. Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ UIGraphicsGetImageFromCurrentImageContext, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ β€” это прСдставлСниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста Π² качСствС изобраТСния. Π­Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΈΠΏΡƒ UIImage.

4. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ ваш экзСмпляр изобраТСния Π² Π΄Π°Π½Π½Ρ‹Π΅, воспользовавшись Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ UIImagePNGRepresentation. Π­Ρ‚Π° функция даст Π²Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° NSData.

5. ΠΠ°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Π² вашСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра writeToUrl: atomically:, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ адрСс Π½Π° дискС β€” Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. ИмСя экзСмпляр UIImage, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с этим ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.

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

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

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΈΠΌ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² контСкстС изобраТСния. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ изобраТСния остаСтся для нас Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π΅Π³ΠΎ описатСля. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ всС Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ влияниС Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ контСкст изобраТСния. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ изобраТСния ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ холстом для рисования. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСдставлСниС вашСго изобраТСния, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ UIGraphicsGetImageFromCurrentImageContext.

Когда Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ SDK, Π²Π°ΠΌ всСго лишь потрСбуСтся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ drawViewHierarchyInRect: β€” ΠΈ содСрТимоС этого Π²ΠΈΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ отрисовано Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС.

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΈΠ·ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ собираСмся Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² нашСм Π²ΠΈΠ΄Π΅ ряд ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ раскадровки, описанныС Π² Π³Π»Π°Π²Π΅ 6). НС Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ помСститС Π² раскадровкС. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ½ΡΡ‚ΡŒ содСрТимоС нашСго Π²ΠΈΠ΄Π°, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ это ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Documents (Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹) Π½Π° дискС:


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

[super viewDidAppear: animated];


/* Π”Π΅Π»Π°Π΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ */

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0f);

if ([self.view drawViewHierarchyInRect: self.view.bounds]){

NSLog(@"Successfully draw the screenshot.");

} else {

NSLog(@"Failed to draw the screenshot.");

}

UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();


/* Π‘охраняСм Π΅Π³ΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅ */

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSURL *documentsFolder = [fileManager URLForDirectory: NSDocumentDirectory

inDomain: NSUserDomainMask

appropriateForURL: nil

create: YES

error: nil];

NSURL *screenshotUrl = [documentsFolder

URLByAppendingPathComponent:@"screenshot.png"];


NSData *screenshotData = UIImagePNGRepresentation(screenshot);


if ([screenshotData writeToURL: screenshotUrl atomically: YES]){

NSLog(@"Successfully saved screenshot to %@", screenshotUrl);

} else {

NSLog(@"Failed to save screenshot.");

}


}


Π’ Π½Π°Ρ‡Π°Π»Π΅ этого ΠΊΠΎΠ΄Π° ΠΌΡ‹ создаСм Π½ΠΎΠ²Ρ‹ΠΉ контСкст изобраТСния ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Π³ΠΎ прСдставлСниС Π² Π²ΠΈΠ΄Π΅ изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ UIGraphicsGetImageFromCurrentImageContext. ИмСя это прСдставлСниС, ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ NSFileManager, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Documents (Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹) нашСго прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π½Π° дискС (см. Ρ€Π°Π·Π΄Π΅Π» 12.1). НаконСц, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ прСдставлСниС ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π° Π² Π²ΠΈΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ UIImagePNGRepresentation) ΠΈ послС этого ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ прСдставлСниС Π½Π° дискС. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСдставлСниС изобраТСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ PNG ΠΈΠ»ΠΈ JPEG, воспользовавшись для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ UIImageJPEGRepresentation. Π’Π°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π² этом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (PNG/JPEG). ИмСя Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° дискС ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с Π½ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

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

Π Π°Π·Π΄Π΅Π» 11.11, Π³Π»Π°Π²Π° 6.

Π“Π»Π°Π²Π° 18. Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Core Motion

18.0. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Устройства с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой iOS, Π² частности iPhone ΠΈ iPad, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½Ρ‹ аксСлСромСтром. На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… устройствах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΎΠ²Ρ‹Ρ… iPhone ΠΈ iPad, Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ гироскоп. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²Π°ΡˆΠΈΡ… прилоТСниях для iOS аксСлСромСтр ΠΈΠ»ΠΈ гироскоп, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ (Π½Π°Π»ΠΈΡ‡ΠΈΠ΅) этих сСнсоров Π½Π° Ρ‚ΠΎΠΌ устройствС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π’ Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 18.1 ΠΈ 18.2 описаны ΠΏΡ€ΠΈΠ΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для обнаруТСния аксСлСромСтра ΠΈΠ»ΠΈ гироскопа. Устройства iOS, оснащСнныС гироскопом, ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ вдоль ΡˆΠ΅ΡΡ‚ΠΈ осСй.

Рассмотрим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, которая позволяСт ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, насколько ΠΏΠΎΠ»Π΅Π·Π΅Π½ гироскоп. НапримСр, аксСлСромСтр Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ устройства Π²ΠΎΠΊΡ€ΡƒΠ³ Π΅Π³ΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси, Ссли Π²Ρ‹ ΠΊΡ€Π΅ΠΏΠΊΠΎ Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ устройство Π² Ρ€ΡƒΠΊΠ°Ρ…, сидитС Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΌ крСслС ΠΈ ΠΊΡ€ΡƒΡ‚ΠΈΡ‚Π΅ΡΡŒ Π½Π° Π½Π΅ΠΌ ΠΏΠΎ часовой стрСлкС ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки. ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π° Π² вашСй ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ»Π°Π½Π΅Ρ‚Ρ‹ ЗСмля устройство вращаСтся Π²ΠΎΠΊΡ€ΡƒΠ³ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси, Π½ΠΎ ΠΎΠ½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ вращаСтся Π²ΠΎΠΊΡ€ΡƒΠ³ собствСнной оси Y, проходящСй ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅Π½Ρ‚Ρ€ устройства, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ аксСлСромСтр Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ двиТСния.