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

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

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

β€’ kCGGradientDrawsBeforeStartLocation β€” распространяСт Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π° всС Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°;

β€’ 0 β€” Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π΅ распространяСтся.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π² ΠΎΠ±Π΅ стороны, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° β€” Β«Π΄ΠΎΒ» ΠΈ «послС», β€” воспользовавшись логичСским ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Π˜Π›Π˜ (обозначаСтся символом |). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π΄Π°Π»Π΅Π΅:


CGRect screenBounds = [[UIScreen mainScreen] bounds];


CGPoint startPoint, endPoint;


startPoint = CGPointMake(0.0f,

screenBounds.size.height / 2.0f);


endPoint = CGPointMake(screenBounds.size.width,

startPoint.y);


CGContextDrawLinearGradient

(currentContext,

gradient,

startPoint,

endPoint,

0);


CGGradientRelease(gradient);

ΠžΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ высвобоТдаСм Π² ΠΊΠΎΠ½Ρ†Π΅ этого ΠΊΠΎΠ΄Π°, Π±Ρ‹Π» создан Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ рис. 17.27. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ с самой Π»Π΅Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ экрана ΠΈ распространили Π΅Π³ΠΎ Π΄ΠΎ самой ΠΏΡ€Π°Π²ΠΎΠΉ, Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌΠΈ значСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способСн ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ CGContextDrawLinearGradient, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ отрисовки Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°. Π˜ΡΠΏΡ€Π°Π²ΠΈΠΌ этот нСдостаток. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚, ΠΊΠ°ΠΊ Π½Π° рис. 17.28.


Рис. 17.28. ОсСвой Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ с ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠ°ΠΌΠΈ, Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ Π·Π° Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΠΈ


ΠŸΡ€ΠΈ написании ΠΊΠΎΠ΄Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Ρ€Π°Π½Π΅Π΅:


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


CGContextRef currentContext = UIGraphicsGetCurrentContext();


CGContextSaveGState(currentContext);

CGColorSpaceRef colorSpace =

CGColorSpaceCreateDeviceRGB();


UIColor *startColor = [UIColor orangeColor];

CGFloat *startColorComponents =

(CGFloat *)CGColorGetComponents([startColor CGColor]);


UIColor *endColor = [UIColor blueColor];

CGFloat *endColorComponents =

(CGFloat *)CGColorGetComponents([endColor CGColor]);


CGFloat colorComponents[8] = {


/* Π§Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΎΡ€Π°Π½ΠΆΠ΅Π²ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° (RGBA (RGBA) */

startColorComponents[0],

startColorComponents[1],

startColorComponents[2],

startColorComponents[3], /* ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ = ΠΎΡ€Π°Π½ΠΆΠ΅Π²Ρ‹ΠΉ */


/* Π§Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π³ΠΎΠ»ΡƒΠ±ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° (RGBA) */

endColorComponents[0],

endColorComponents[1],

endColorComponents[2],

endColorComponents[3], /* Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ†Π²Π΅Ρ‚ = Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ */


};


CGFloat colorIndices[2] = {

0.0f, /* Π¦Π²Π΅Ρ‚ 0 Π² массивС colorComponents */

1.0f, /* Π¦Π²Π΅Ρ‚ 1 Π² массивС colorComponents */

};


CGGradientRef gradient = CGGradientCreateWithColorComponents

(colorSpace,

(const CGFloat *)&colorComponents,

(const CGFloat *)&colorIndices,

2);


CGColorSpaceRelease(colorSpace);


CGPoint startPoint, endPoint;


startPoint = CGPointMake(120,

260);

endPoint = CGPointMake(200.0f,

220);

CGContextDrawLinearGradient (currentContext,

gradient,

startPoint,

endPoint,

kCGGradientDrawsBeforeStartLocation |

kCGGradientDrawsAfterEndLocation);

CGGradientRelease(gradient);

CGContextRestoreGState(currentContext);

}


Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ Π½Π΅ совсСм понятно, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ смСшивании Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ kCGGradientDrawsBeforeStartLocation ΠΈ kCGGradientDrawsAfterEndLocation, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ CGContextDrawLinearGradient, получаСтся Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ эффСкт, ΠΊΠ°ΠΊ Π½Π° рис. 17.28. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡƒΠ±Π΅Ρ€Π΅ΠΌ эти значСния ΠΈ Π·Π°Π΄Π°Π΄ΠΈΠΌ для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ CGContextDrawLinearGradient Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 β€” ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получится ΠΊΠ°ΠΊ Π½Π° рис. 17.29.


Рис. 17.29. ОсСвой Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π±Π΅Π· распространСния Ρ†Π²Π΅Ρ‚ΠΎΠ²


На рис. 17.28 ΠΈ 17.29 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Ρ‹. Но Ρƒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Π½Π° рис. 17.28 Ρ†Π²Π΅Ρ‚Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ±Π΅ стороны Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Π½Π° вСсь графичСский контСкст, поэтому вСсь экран оказываСтся Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½.

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

Π Π°Π·Π΄Π΅Π» 17.3.

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

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

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

РСшСниС

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

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

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.8 Π±Ρ‹Π»ΠΎ упомянуто ΠΎ прСобразованиях. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это, Π² сущности, просто ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ способа отобраТСния рисунка. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² Core Graphics β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, примСняСмыС ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ отрисовкой послСдних. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ сдвига (Translation Transformation). Β«Π‘Π΄Π²ΠΈΠ³Π° Ρ‡Π΅Π³ΠΎ?Β» β€” ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π²Ρ‹. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ сдвига β€” это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρƒ ΠΈΠ»ΠΈ графичСский контСкст.

Π‘Ρ€Π΅Π΄ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ (см. Ρ€Π°Π·Π΄Π΅Π» 17.13) ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (см. Ρ€Π°Π·Π΄Π΅Π» 17.12). ВсС это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π°Ρ„Ρ„ΠΈΠ½Π½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ каТдая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π° сопоставляСтся с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии. ВсС прСобразования, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ„Ρ„ΠΈΠ½Π½Ρ‹ΠΌΠΈ.

Π’ Ρ…ΠΎΠ΄Π΅ прСобразования сдвига Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΈΠ»ΠΈ Π² графичСском контСкстС сдвигаСтся Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. НапримСр, Ссли Π²Ρ‹ поставитС Ρ‚ΠΎΡ‡ΠΊΡƒ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (10; 20), ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊ Π½Π΅ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ сдвига (30; 40) ΠΈ снова Π΅Π΅ поставитС, Ρ‚ΠΎΡ‡ΠΊΠ° окаТСтся располоТСнной Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… (40; 60), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 40 = 10 + 30, Π° 60 = 20 + 40.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ сдвига, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция CGAffineTransformMakeTranslation, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° CGAffineTransform. Π”Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ сдвиг ΠΏΠΎ осям X ΠΈ Y Π² Ρ‚ΠΎΡ‡ΠΊΠ°Ρ….

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 17.8 ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° CGPathAddRect ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСобразования Ρ‚ΠΈΠΏΠ° CGAffineTransform. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с Π΅Π³ΠΎ исходной ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ x ΠΈ y, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ CGPathAddRect, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅:


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


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

CGMutablePathRef path = CGPathCreateMutable();


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

CGRect rectangle = CGRectMake(10.0f,

10.0f,

200.0f,

300.0f);


/* ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° 100 Ρ‚ΠΎΡ‡Π΅ΠΊ Π²ΠΏΡ€Π°Π²ΠΎ,

Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΏΡ€ΠΈ этом Π΅Π³ΠΎ полоТСния ΠΏΠΎ ΠΎΡΠΈ Y. */

CGAffineTransform transform = CGAffineTransformMakeTranslation(100.0f,

0.0f);


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

CGPathAddRect(path,

&transform,

rectangle);


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

CGContextRef currentContext =

UIGraphicsGetCurrentContext();


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

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.30 ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-Π²ΠΈΠ΄Π°.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ рис. 17.30 ΠΈ 17.22. Π’ΠΈΠ΄ΠΈΡ‚Π΅ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ? Π•Ρ‰Π΅ Ρ€Π°Π· просмотритС исходный ΠΊΠΎΠ΄ для ΠΎΠ±Π΅ΠΈΡ… Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ полоТСния ΠΏΠΎ осям X ΠΈ Y, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ для ΠΎΠ±ΠΎΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², Π² ΠΎΠ±ΠΎΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ… ΠΊΠΎΠ΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° рис. 17.30 ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния ΠΊ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ Π°Ρ„Ρ„ΠΈΠ½Π½ΠΎΠ³ΠΎ прСобразования, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ добавляСтся ΠΊ ΠΏΡƒΡ‚ΠΈ.

ΠšΡ€ΠΎΠΌΠ΅ примСнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌ, отрисовываСмым ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡƒΡ‚Π΅ΠΉ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ прСобразования ΠΈ ΠΊ графичСскому контСксту с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ CGContextTranslateCTM. Она примСняСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ (Current Transformation Matrix, CTM). Π₯отя это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным, ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ смысл Π½Π΅ составляСт Ρ‚Ρ€ΡƒΠ΄Π°. Π‘Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ CTM ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΠΈ располоТСниС Ρ†Π΅Π½Ρ‚Ρ€Π° вашСго графичСского контСкста, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ проСцирования ΠΊΠ°ΠΆΠ΄ΠΎΠΉ отрисовываСмой Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° экранС. НапримСр, Ссли Π²Ρ‹ ΠΏΡ€ΠΈΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Core Graphics ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (0; 0), Core Graphics Π½Π°ΠΉΠ΄Π΅Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€ экрана, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. Π—Π°Ρ‚Π΅ΠΌ CTM Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ вычислСния ΠΈ сообщит Core Graphics, Ρ‡Ρ‚ΠΎ искомая Ρ‚ΠΎΡ‡ΠΊΠ° располоТСна Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ экрана. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠ°ΠΊ CGContextTranslateCTM, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ этой ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, послС Ρ‡Π΅Π³ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, отрисованныС Π² графичСском контСкстС, Π·Π°Π½ΡΡ‚ΡŒ Π½Π° холстС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ достигаСм Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта, ΠΊΠ°ΠΊ ΠΈ Π½Π° рис. 17.30, Π½ΠΎ примСняСм ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ сдвига Π½Π΅ ΠΊ самому ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ, Π° ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ: