下面就用一个小画板的例子介绍一个设计模式在里面的作用。
www.objective-c-design-patterns.com
http://blog.youkuaiyun.com/wangeen/article/details/8272501
程序的GUI
小画板需要有画图的view还有设计画笔的view和缩略图显示的view,因为cocoa十分看重MVC模式,所有的显示都要基于这样的模式,也就是每一个view都必须有一个controller
CanvasViewController
PaletteViewController
ThumbnailViewController
当所有的view和controller都设计好之后,一个问题就是这些view之间相互切换怎么做比较好,这里就需要一个mediator的模式来做。
画笔的显示
cocoa touch提供了quartz 2d在UIView来画图,API如下
CGContextMoveToPoint()
CGContextAddLineToPoint()
CGContextStrokePath() 等等
Dot:
(void) drawWithContext:(CGContextRef)context
{
CGFloat x = self.location.x;
CGFloat y = self.location.y;
CGFloat frameSize = self.size;
CGRect frame = CGRectMake(x - frameSize / 2.0,
y - frameSize / 2.0,
frameSize,
frameSize);
CGContextSetFillColorWithColor (context,[self.color CGColor]);
CGContextFillEllipseInRect(context, frame);
}
vertex:
- (void) drawWithContext:(CGContextRef)context
{
CGFloat x = self.location.x;
CGFloat y = self.location.y;
CGContextAddLineToPoint(context, x, y);
}
stroke:
- (void) drawWithContext:(CGContextRef)context
{
CGContextMoveToPoint(context, self.location.x, self.location.y);
for (id <Mark> mark in children_)
{
[mark drawWithContext:context];
}
CGContextSetLineWidth(context, self.size);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetStrokeColorWithColor(context,[self.color CGColor]);
CGContextStrokePath(context);
}
Thumbnail的显示
由于显示所有的文档的时间比较长,所以这个比较适合proxy,用多线程来加载。