Какао использует неявный стек рисования и модель аннулирования.В вашем NSView, когда состояние изменяется, что заставляет представление рисовать по-другому, вы вызываете - [self setNeedsDisplay:], чтобы сообщить системе рисования, что вам нужно перерисовать.В какой-то момент в очень ближайшем будущем, фактически в конце текущего цикла событий, будет вызван метод drawRect: вашего представления.Это ваша возможность нарисовать что угодно.
Существует неявный стек фокуса, что означает, что когда вызывается drawRect: ваш вид, рисование фокусируется на границах вашего вида в окне и ограничивается им.in. Затем вы можете вызывать такие функции, как [[NSColor redColor] set];и NSRectFill ([self bounds]);
Вот пример:
@interface MyView : NSView {
@private
NSColor *lineColor;
NSInteger clickCount;
}
@end
@implementation MyView
- (void)setLineColor:(NSColor *)color {
if (color != lineColor) {
[lineColor release];
lineColor = [color copy];
[self setNeedsDisplay:YES]; /// We changed what we'd draw, invalidate our drawing.
}
}
- (void)mouseDown:(NSEvent *)mouseDown {
clickCount = (clickCount == 6) ? 0 : (clickCount + 1);
CGFloat hue = clickCount / 6.0;
[self setLineColor:[NSColor colorWithCalibratedHue:hue saturation:1.0 brightness:1.0 alpha:1.0]];
}
- (void)drawRect:(NSRect)dirtyRect {
NSBezierPath *line = [NSBezierPath bezierPath];
[line moveToPoint:NSMakePoint(NSMinX([self bounds]), NSMinY([self bounds]))];
[line lineToPoint:NSMakePoint(NSMaxX([self bounds]), NSMaxY([self bounds]))];
[line setLineWidth:5.0]; /// Make it easy to see
[[self lineColor] set]; /// Make future drawing the color of lineColor.
[line stroke];
}
@end
Вид должен рисовать диагональную линию, и каждый раз, когда по ней щелкают, линия должна менять цвет.