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

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

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

β€’ CGPathCreateMutable (функция) β€” создаСт Π½ΠΎΠ²Ρ‹ΠΉ измСняСмый ΠΏΡƒΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° CGMutablePathRef ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с этим ΠΏΡƒΡ‚Π΅ΠΌ, ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ β€” ΠΎΠ± этом ΠΌΡ‹ вскорС ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ;

β€’ CGPathMoveToPoint (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π° ΠΏΡƒΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π°. ΠŸΠ΅Ρ€ΠΎ оказываСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Ρ‚ΠΈΠΏΠ° CGPoint;

β€’ CGPathAddLineToPoint (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” отрисовываСт сСгмСнт Π»ΠΈΠ½ΠΈΠΈ ΠΎΡ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π° Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (которая ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ указываСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° CGPoint);

β€’ CGContextAddPath (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” добавляСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ (Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ здСсь ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ) Π² графичСский контСкст. Π­Ρ‚ΠΎΡ‚ ΠΏΡƒΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ² для рисования;

β€’ CGContextDrawPath (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” отрисовываСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π² графичСском контСкстС;

β€’ CGPathRelease (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” высвобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ для описатСля ΠΏΡƒΡ‚ΠΈ;

β€’ CGPathAddRect (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°) β€” добавляСт ΠΊ ΠΏΡƒΡ‚ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ. Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² структурС CGRect.


Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ CGContextDrawPath:

β€’ kCGPathStroke β€” рисуСт линию (ΡˆΡ‚Ρ€ΠΈΡ…), ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΈΠ»ΠΈ ΠΊΡ€ΠΎΠΌΠΊΡƒ ΠΏΡƒΡ‚ΠΈ. Π¨Ρ‚Ρ€ΠΈΡ… рисуСтся Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚;

β€’ kCGPathFill β€” заполняСт Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ описан ΠΏΡƒΡ‚ΡŒ. Π—Π°Π»ΠΈΠ²ΠΊΠ° выполняСтся Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ†Π²Π΅Ρ‚Π΅, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚;

β€’ kCGPathFillStroke β€” ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΡˆΡ‚Ρ€ΠΈΡ… ΠΈ Π·Π°Π»ΠΈΠ²ΠΊΡƒ. Для заполнСния ΠΏΡƒΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΠΈ, Π° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΡˆΡ‚Ρ€ΠΈΡ…Π° примСняСт для отрисовки ΠΏΡƒΡ‚ΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.


Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Допустим, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΠ»ΡƒΠ±ΡƒΡŽ линию, ΠΈΠ΄ΡƒΡ‰ΡƒΡŽ ΠΏΠΎ экрану ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ, ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ линию, ΠΈΠ΄ΡƒΡ‰ΡƒΡŽ ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π² Π»Π΅Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ. Π’Π°ΠΊ ΠΌΡ‹ нарисуСм Π½Π° экранС большой крСст, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ Π±ΡƒΠΊΠ²Ρƒ Β«XΒ».

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я ΡƒΠ΄Π°Π»ΠΈΠ» ΠΈΠ· прилоТСния Π² симуляторС iOS ΡΡ‚Π°Ρ‚ΡƒΡΠ½ΡƒΡŽ панСль. Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ с этим Π²ΠΎΠ·ΠΈΡ‚ΡŒΡΡ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ сразу ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ статусной ΠΏΠ°Π½Π΅Π»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ лишь Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΌΠΎΠ΅ΠΌ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡƒΡΠ½ΡƒΡŽ панСль, Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Xcode Ρ„Π°ΠΉΠ» Info.plist ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² этот Ρ„Π°ΠΉΠ» ΠΊΠ»ΡŽΡ‡ UIStatusBarHidden со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ YES (рис. 17.20). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС сразу послС открытия прилоТСния статусная панСль Π±ΡƒΠ΄Π΅Ρ‚ скрыта.

Рис. 17.20. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ с Ρ„Π°ΠΉΠ»ΠΎΠΌ Info.plist, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡƒΡΠ½ΡƒΡŽ панСль прилоТСния iOS


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


/* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ. */

CGMutablePathRef path = CGPathCreateMutable();


/* ΠšΠ°ΠΊΠΎΠ²Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ экрана? ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ X растянулся Π½Π° Π²Π΅ΡΡŒ экран. */

CGRect screenBounds = [[UIScreen mainScreen] bounds];


/* ΠΠ°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. */

CGPathMoveToPoint(path,

NULL,

screenBounds.origin.x,

screenBounds.origin.y);


/* ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ линию ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» экрана. */

CGPathAddLineToPoint(path,

NULL,

screenBounds.size.width,

screenBounds.size.height);


/* ΠΠ°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΡƒΡŽ линию ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. */

CGPathMoveToPoint(path,

NULL,

screenBounds.size.width,

screenBounds.origin.y);


/* ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ линию ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ». */

CGPathAddLineToPoint(path,

NULL,

screenBounds.origin.x,

screenBounds.size.height);


/* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ контСкст, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отрисован ΠΏΡƒΡ‚ΡŒ. */

CGContextRef currentContext = UIGraphicsGetCurrentContext();


/* Π”обавляСм ΠΏΡƒΡ‚ΡŒ ΠΊ контСксту, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. */

CGContextAddPath(currentContext,

path);


/* Π—Π°Π΄Π°Π΅ΠΌ для ΡˆΡ‚Ρ€ΠΈΡ…Π° Π³ΠΎΠ»ΡƒΠ±ΠΎΠΉ Ρ†Π²Π΅Ρ‚. */

[[UIColor blueColor] setStroke];


/* ΠžΡ‚рисовываСм ΠΏΡƒΡ‚ΡŒ этим Ρ†Π²Π΅Ρ‚ΠΎΠΌ. */

CGContextDrawPath(currentContext,

kCGPathStroke);


/* ΠΠ°ΠΊΠΎΠ½Π΅Ρ†, высвобоТдаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡƒΡ‚ΠΈ. */

CGPathRelease(path);


}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ NULL, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ, ΠΊΠ°ΠΊ CGPathMoveToPoint, прСдставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ прСобразования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΏΡ€ΠΈ отрисовкС Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ Π»ΠΈΠ½ΠΈΠΉ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ прСобразованиях рассказано Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… 17.11–17.13.

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π² графичСском контСкстС ΠΎΡ‡Π΅Π½ΡŒ просто. На самом Π΄Π΅Π»Π΅ слСдуСт всСго лишь Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ измСняСмый ΠΏΡƒΡ‚ΡŒ (CGPathCreateMutable), Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ этот ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ графичСскому контСксту (CGContextAddPath) ΠΈ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π² графичСском контСкстС (CGContextDrawPath). Запустив этот ΠΊΠΎΠ΄, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ Π½Π° рис. 17.21.


Рис. 17.21. РисованиС Π² графичСском контСкстС с использованиСм ΠΏΡƒΡ‚Π΅ΠΉ

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

Π Π°Π·Π΄Π΅Π»Ρ‹ 17.6, 17.11–17.13.

17.8. ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

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

ВрСбуСтся ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ Π² графичСском контСкстС.

РСшСниС

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ CGPathAddRect для добавлСния ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΊ ΠΏΡƒΡ‚ΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ отрисовывайтС этот ΠΏΡƒΡ‚ΡŒ Π² графичСском контСкстС.

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

Как ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 17.7, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ довольно просто. Одна ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Core Graphics позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с путями, β€” CGPathAddRect. Она позволяСт ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΊΠ°ΠΊ части ΠΏΡƒΡ‚Π΅ΠΉ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


β€” (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();


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

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.22 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, запустив эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Ρ†Π²Π΅Ρ‚Π° Π½Π° Ρ‡Π΅Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹).

Если Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CGRect ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ CGPathAddRects. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


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


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

CGMutablePathRef path = CGPathCreateMutable();


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

CGRect rectangle1 = CGRectMake(10.0f,

10.0f,


Рис. 17.22. ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡƒΡ‚Π΅ΠΉ


200.0f,

300.0f);


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

CGRect rectangle2 = CGRectMake(40.0f,

100.0f,

90.0f,

300.0f);


/* ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΎΠ±Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π² массив. */

CGRect rectangles[2] = {

rectangle1, rectangle2

};


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

CGPathAddRects(path,

NULL,

(const CGRect *)&rectangles,

2);


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

CGContextRef currentContext = UIGraphicsGetCurrentContext();


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

CGContextAddPath(currentContext,

path);


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

[[UIColor colorWithRed:0.20f

green:0.60f

blue:0.80f

alpha:1.0f] setFill];


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

[[UIColor blackColor] setStroke];


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

CGContextSetLineWidth(currentContext,

5.0f);


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