В Cappuccino вы можете выполнять пользовательский рисунок в любом виде. Для этого переопределите метод drawRect:
(всего, что наследуется от CPView
, а это почти каждый элемент управления). Вы можете либо использовать инструменты CPGraphics, такие как CPBezierPath
, либо рисовать использование CoreGraphics с такими командами, как CGContextAddPath
— чтобы узнать больше об этом последний стиль рисования документов Apple на Core Graphics for Mac OS X. Помните, что Cappuccino основан на Objective-C и Cocoa.
Вот пример представления, которое рисует желтую звезду с пунктирной рамкой в прямоугольнике со скругленными углами, размер которого соответствует текущему представлению:
@implementation CustomDrawView : CPView
{
}
- (void)drawRect:(CGRect)aRect
{
[super drawRect:aRect];
[[CPColor whiteColor] set];
[[CPBezierPath bezierPathWithRect:bounds] fill];
var frame =[self bounds],
shadow = [[CPShadow alloc] init];
[shadow setShadowColor:[CPColor blackColor]];
[shadow setShadowOffset:CGSizeMake(0, 3)];
[shadow setShadowBlurRadius:5];
//// Rounded Rectangle Drawing
var roundedRectanglePath = [CPBezierPath bezierPathWithRoundedRect:CGRectMake(CGRectGetMinX(frame) + 3.5, CGRectGetMinY(frame) + 3.5, CGRectGetWidth(frame) - 7, CGRectGetHeight(frame) - 7) xRadius:7 yRadius:7];
[[CPColor blackColor] setStroke];
[roundedRectanglePath setLineWidth:1];
var roundedRectanglePattern = [5, 1, 1, 1];
[roundedRectanglePath setLineDash:roundedRectanglePattern phase:0];
[roundedRectanglePath stroke];
var starPath = [CPBezierPath bezierPath];
[starPath moveToPoint:CGPointMake(CGRectGetMinX(frame) + 0.50000 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.20513 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.43029 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.35357 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.31200 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.40445 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.38720 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.54707 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.38381 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.72696 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.50000 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.66667 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.61619 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.72696 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.61280 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.54707 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.68800 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.40445 * CGRectGetHeight(frame))];
[starPath lineToPoint:CGPointMake(CGRectGetMinX(frame) + 0.56971 * CGRectGetWidth(frame), CGRectGetMinY(frame) + 0.35357 * CGRectGetHeight(frame))];
[starPath closePath];
[[CPColor yellowColor] setFill];
[starPath fill];
[CPGraphicsContext saveGraphicsState];
[shadow set];
[[CPColor whiteColor] setStroke];
[starPath setLineWidth:3];
var starPattern = [5, 1, 5, 1];
[starPath setLineDash:starPattern phase:2];
[starPath stroke];
[CPGraphicsContext restoreGraphicsState];
}
@end
![Изображение того, что отображает приведенный выше код.](https://i.stack.imgur.com/Qixsc.png)
Я извлек это из большого набора тестов рисования в Cappuccino. а>.
Под капотом Cappuccino будет либо использовать холст, если он доступен, либо VML, когда это необходимо (для некоторых версий IE).
person
Alexander Ljungberg
schedule
13.08.2013