下面是我自定义视图的drawRect,它画了一个棋盘,棋盘有19*19的线,上下左右各有一个字符,左右各1-19,也是9个点:
- (void)drawRect:(CGRect)rect
{
// Get the drawing context
CGContextRef context = UIGraphicsGetCurrentContext ();
CGContextSaveGState(context);
// Draw the board background
UIImage *bk = [UIImage imageNamed:@"board_bg_011.png"];
CGColorRef shadowColor = CreateDeviceRGBColor(0.5, 0.5, 0.5, 1);
CGContextSetShadowWithColor(context, CGSizeMake(2, 2), 10, shadowColor);
[bk drawInRect:CGRectMake(TEXT_AREA_OFFSET, TEXT_AREA_OFFSET, self.bounds.size.width - TEXT_AREA_OFFSET * 2, self.bounds.size.height - TEXT_AREA_OFFSET * 2)];
CGColorRelease(shadowColor);
CGContextRestoreGState(context);
// Draw board edage square
UIBezierPath *path = [UIBezierPath bezierPathWithRect:tableRect];
path.lineWidth = 2.0;
[path stroke];
// Draw board lines
UIBezierPath *line = [UIBezierPath bezierPath];
line.lineWidth = 1.0;
for (int i = 1; i <= 17; i ++) {
float x = tableRect.origin.x + i * qiziSize;
[line moveToPoint:CGPointMake(x, tableRect.origin.y)];
[line addLineToPoint:CGPointMake(x, tableRect.origin.y + tableRect.size.height)];
[line stroke];
float y = tableRect.origin.y + i * qiziSize;
[line moveToPoint:CGPointMake(tableRect.origin.x, y)];
[line addLineToPoint:CGPointMake(tableRect.origin.x + tableRect.size.width, y)];
[line stroke];
}
// Draw 9 dots
CGContextSaveGState(context);
CGRect dotRect = CGRectMake(0, 0, 6, 6);
CGContextTranslateCTM(context, tableRect.origin.x + qiziSize * 3 - 3, tableRect.origin.y + qiziSize * 3 - 3);
UIBezierPath *dot = [UIBezierPath bezierPathWithOvalInRect:dotRect];
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextTranslateCTM(context, - qiziSize * 12, qiziSize * 6);
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextTranslateCTM(context, - qiziSize * 12, qiziSize * 6);
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextTranslateCTM(context, qiziSize * 6, 0);
[dot fill];
CGContextRestoreGState(context);
CGContextSaveGState(context);
UIFont *font = [UIFont fontWithName:@"Helvetica" size:12];
int fontHeight = [@"1" sizeWithFont:font].height;
UIColor *textColor = [UIColor grayColor];
[textColor setFill];
[textColor setStroke];
for (int i = 1; i <= 19; i ++) {
// Top text
NSString *str = [NSString stringWithFormat:@"%c", ((i < 9)?i:(i+1)) + 'A' - 1];
CGRect textRect = CGRectMake(tableRect.origin.x + qiziSize * (i - 1) - qiziSize / 2, 0, qiziSize, TEXT_AREA_OFFSET);
[str drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
// Bottom text
textRect.origin.y = self.bounds.size.height - TEXT_AREA_OFFSET + 2;
[str drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
// Left text
str = [NSString stringWithFormat:@"%i", i];
textRect = CGRectMake(0, tableRect.origin.y + qiziSize * (i - 1) - fontHeight / 2, TEXT_AREA_OFFSET - 2, fontHeight);
[str drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
// Right text
textRect.origin.x = self.bounds.size.width - TEXT_AREA_OFFSET + 2;
[str drawInRect:textRect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft];
}
CGContextRestoreGState(context);
}
在 iPad3 上运行,此方法耗时 1 秒以上。关于如何优化它有什么建议吗?
提前致谢。