视图绘制是调用drawRect:方法来实现的。对于AppKit中的各种界面控件,系统默认实现了不同控件的界面绘制和事件响应控制,对于自定义的控件可以在drawRect方法中实现界面的个性化绘制。
drawRect方法中实现界面绘制
从性能方面考虑系统对界面绘制采用了延时绘制机制进行的。调用setNeedsDisplay:或setNeedsDisplayInRect:方法,使当前视图或Rect定义的区域变为invalidate状态,并不是立即绘制,系统会在下一个绘图周期重绘。
调用display,displayRect: 方法会强制视图立即重绘。
下面的代码使用Quartz 2D的绘图函数实现了在视图上绘制圆角矩形。
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
[[NSColor blueColor] setFill];
NSRect bounds = [self bounds];
NSBezierPath *roundedShape = [NSBezierPath bezierPath];
[roundedShape appendBezierPathWithRoundedRect:bounds xRadius:20 yRadius:20];
[roundedShape fill];
}
drawRect方法之外实现绘制
在drawRect方法之外需要绘制视图时,需要使用lockFocus方法锁定视图,完成绘制后在执行unlockFocus解锁。如果在执行lockFocus时已经有其他流程执行了lockFocus,则会将当前操作保存到队列中,等待其他流程执行unlockFocus来恢复后来的lockFocus中的绘图操作。
- (void)updateViewShape {
[self lockFocus];
//绘图相关代码
[self unlockFocus];
}
参考自《MacOS应用开发基础教程》
网友评论