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

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

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

Рис. 17.30. ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с Π°Ρ„Ρ„ΠΈΠ½Π½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сдвига


β€” (void)drawRect:(CGRect)rect{


/* Π‘Π½Π°Ρ‡Π°Π»Π° создаСм ΠΏΡƒΡ‚ΡŒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ ΠΏΡƒΡ‚ΠΈ. */

CGMutablePathRef path = CGPathCreateMutable();


/* Π­Ρ‚ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. */

CGRect rectangle = CGRectMake(10.0f,

10.0f,

200.0f,

300.0f);


/* Π”обавляСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΊ ΠΏΡƒΡ‚ΠΈ. */

CGPathAddRect(path,

NULL,

rectangle);


/* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста. */

CGContextRef currentContext = UIGraphicsGetCurrentContext();


/* Π‘охраняСм состояниС контСкста, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅

ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ это состояниС. */

CGContextSaveGState(currentContext);


/* Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ

Π½Π° 100 Ρ‚ΠΎΡ‡Π΅ΠΊ Π²ΠΏΡ€Π°Π²ΠΎ. */

CGContextTranslateCTM(currentContext,

100.0f,

0.0f);


/* Π”обавляСм ΠΏΡƒΡ‚ΡŒ ΠΊ контСксту. */

CGContextAddPath(currentContext,

path);


/* Π—Π°Π΄Π°Π΅ΠΌ Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ Π² качСствС Ρ†Π²Π΅Ρ‚Π° Π·Π°Π»ΠΈΠ²ΠΊΠΈ. */

[[UIColor colorWithRed:0.20f

green:0.60f

blue:0.80f

alpha:1.0f] setFill];


/* Π—Π°Π΄Π°Π΅ΠΌ для ΠΎΠ±Π²ΠΎΠ΄ΠΊΠΈ ΠΊΠΎΡ€ΠΈΡ‡Π½Π΅Π²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚. */

[[UIColor brownColor] setStroke];


/* Π—Π°Π΄Π°Π΅ΠΌ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ (ΠΎΠ±Π²ΠΎΠ΄ΠΊΠΈ) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. */

CGContextSetLineWidth(currentContext,

5.0f);


/* ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡƒΡ‚ΡŒ Π² контСкстС ΠΈ примСняСм ΠΊ Π½Π΅ΠΌΡƒ Π·Π°Π»ΠΈΠ²ΠΊΡƒ. */

CGContextDrawPath(currentContext,

kCGPathFillStroke);


/* Π˜Π·Π±Π°Π²Π»ΡΠ΅ΠΌΡΡ ΠΎΡ‚ ΠΏΡƒΡ‚ΠΈ. */

CGPathRelease(path);


/* Π’осстанавливаСм состояниС контСкста. */

CGContextRestoreGState(currentContext);


}


Запустив эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, ΠΊΠ°ΠΊ ΠΈ Π½Π° рис. 17.30.

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

Π Π°Π·Π΄Π΅Π»Ρ‹ 17.8, 17.12 ΠΈ 17.13.

17.12. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€, нарисованных Π² графичСских контСкстах

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

ВрСбуСтся динамичСски ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, отрисованныС Π² графичСском контСкстС, Π² сторону ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ увСличСния.

РСшСниС

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°, воспользовавшись Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CGAffineTransformMakeScale.

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

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.11 Π±Ρ‹Π»ΠΎ объяснСно, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ ΠΈ графичСским контСкстам. Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² прСобразования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, β€” это ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Core Graphics позволяСт Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΡ€ΡƒΠ³, Π½Π° 100 % ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅Π΅ исходного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π°, ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CGAffineTransformMakeScale, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСобразования Ρ‚ΠΈΠΏΠ° CGAffineTransform. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° нСпосрСдствСнно ΠΊ графичСскому контСксту, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ CGContextScaleCTM, которая ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ CTM. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ CTM (Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ) рассказано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.11.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ оси X ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ оси Y. Π•Ρ‰Π΅ Ρ€Π°Π· обратимся ΠΊ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ с рис. 17.22. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ исходныС Π΄Π»ΠΈΠ½Π° ΠΈ ΡˆΠΈΡ€ΠΈΠ½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈΡΡŒ Π²ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ оси X ΠΈ Y Π½Π° 0,5 (Π²ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ ΠΎΡ‚ исходного значСния), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь:


/* ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ Π΅Π³ΠΎ Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ. */

CGAffineTransform transform =

CGAffineTransformMakeScale(0.5f, 0.5f);


/* Π”обавляСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΊ ΠΏΡƒΡ‚ΠΈ. */

CGPathAddRect(path,

&transform,

rectangle);


На рис. 17.31 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ получится, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° ΠΊ ΠΊΠΎΠ΄Ρƒ, написанному Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.8.


Рис. 17.31. ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°


Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CGAffineTransformMakeScale ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ CGContextScaleCTM, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° ΠΊ графичСскому контСксту. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ даст Ρ‚ΠΎΡ‚ ΠΆΠ΅ эффСкт, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (вновь ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° рис. 17.31):


β€” (void)drawRect:(CGRect)rect{


/* Π‘Π½Π°Ρ‡Π°Π»Π° создаСм ΠΏΡƒΡ‚ΡŒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ ΠΏΡƒΡ‚ΠΈ. */

CGMutablePathRef path = CGPathCreateMutable();


/* Π­Ρ‚ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. */

CGRect rectangle = CGRectMake(10.0f,

10.0f,

200.0f,

300.0f);


/* Π”обавляСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΊ ΠΏΡƒΡ‚ΠΈ. */

CGPathAddRect(path,

NULL,

rectangle);


/* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста. */

CGContextRef currentContext = UIGraphicsGetCurrentContext();


/* ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ всС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, отрисованныС Π² графичСском контСкстС,

ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ ΠΈΡ… Π½Π° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ. */

CGContextScaleCTM(currentContext,

0.5f,

0.5f);


/* Π”обавляСм ΠΏΡƒΡ‚ΡŒ ΠΊ контСксту. */

CGContextAddPath(currentContext,

path);


/* Π—Π°Π΄Π°Π΅ΠΌ Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ Π² качСствС Ρ†Π²Π΅Ρ‚Π° Π·Π°Π»ΠΈΠ²ΠΊΠΈ. */

[[UIColor colorWithRed:0.20f

green:0.60f

blue:0.80f

alpha:1.0f] setFill];


/* Π—Π°Π΄Π°Π΅ΠΌ для ΠΎΠ±Π²ΠΎΠ΄ΠΊΠΈ ΠΊΠΎΡ€ΠΈΡ‡Π½Π΅Π²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚. */

[[UIColor brownColor] setStroke];


/* Π—Π°Π΄Π°Π΅ΠΌ для ΡˆΠΈΡ€ΠΈΠ½Ρ‹ (ΠΎΠ±Π²ΠΎΠ΄ΠΊΠΈ) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. */

CGContextSetLineWidth(currentContext,

5.0f);


/* ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡƒΡ‚ΡŒ Π² контСкстС ΠΈ примСняСм ΠΊ Π½Π΅ΠΌΡƒ Π·Π°Π»ΠΈΠ²ΠΊΡƒ. */

CGContextDrawPath(currentContext,

kCGPathFillStroke);


/* Π˜Π·Π±Π°Π²Π»ΡΠ΅ΠΌΡΡ ΠΎΡ‚ ΠΏΡƒΡ‚ΠΈ. */

CGPathRelease(path);


}

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

Π Π°Π·Π΄Π΅Π» 17.11.

17.13. Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€, нарисованных Π² графичСских контСкстах

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

ВрСбуСтся ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ содСрТимоС, отрисованноС Π² графичСском контСкстС, Π½Π΅ измСняя ΠΏΡ€ΠΈ этом ΠΊΠΎΠ΄ отрисовки.

РСшСниС

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CGAffineTransformMakeRotation для создания Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ³ΠΎ прСобразования вращСния.

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

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с этим Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ, Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² 17.11 ΠΈ 17.12. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ тСкст, я старался Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΡƒΠΆΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ….

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ сдвигС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ вращСния ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ, отрисованным Π½Π° путях ΠΈ прямо Π² графичСском контСкстС. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CGAffineTransformMakeRotation ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вращСния Π² Ρ€Π°Π΄ΠΈΠ°Π½Π°Ρ…, Π° Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ вращСния Ρ‚ΠΈΠΏΠ° CGAffineTransform. Π—Π°Ρ‚Π΅ΠΌ это ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ путям ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ вСсь контСкст Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ³ΠΎΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ CGContextRotateCTM.

ΠŸΠΎΠ²Π΅Ρ€Π½Π΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π½Π° рис. 17.22, Π½Π° 45Β° ΠΏΠΎ часовой стрСлкС (рис. 17.32). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ вращСния, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² Ρ€Π°Π΄ΠΈΠ°Π½Π°Ρ…. ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния Π΄Π°ΡŽΡ‚ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ часовой стрСлкС, Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ β€” ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой:


/* Π’Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° 45Β° ΠΏΠΎ часовой стрСлкС. */

CGAffineTransform transform =

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


/* Π”обавляСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΊ ΠΏΡƒΡ‚ΠΈ. */

CGPathAddRect(path,

&transform,

rectangle);


Рис. 17.32. Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°


Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.12, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ нСпосрСдствСнно ΠΊ графичСскому контСксту β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ CGContextRotateCTM.

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

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

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

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

ВрСбуСтся Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ смСщСниС Π²ΠΈΠ΄ΠΎΠ².

РСшСниС

ΠŸΡ€ΠΈ смСщСнии Π²ΠΈΠ΄ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса UIView.

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

Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС iOS ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы выполнСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, срСди этих возмоТностСй Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ высокоуровнСвыС. Π‘Π°ΠΌΡ‹ΠΉ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС обСспСчиваСтся Π²ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ UIKit, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. Π’ UIKit содСрТится нСкоторая низкоуровнСвая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Core Animation, прСдоставляСмая Π½Π°ΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ΅ довольно Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ API, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π Π°Π±ΠΎΡ‚Π° с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π² UIKit начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса beginAnimations: context:, относящСгося ΠΊ классу UIView. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” это ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ для вашСй Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ контСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ². ВскорС ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π½ΠΈΡ… ΠΎΠ±ΠΎΠΈΡ….