如何画边界信?

时间:2010-02-23 07:58:00

标签: iphone

我正在寻找在UIView上绘制有边框的文字。

实施以下方法:

- (void)drawRect:(CGRect)rect { 
    //TODO draw bordered text here. 
}

如何画画?

我的意思是每个字母都以全文为边界。

提前致谢。

2 个答案:

答案 0 :(得分:1)

要显示带边框的文本(如果我理解正确的话),您应该将文本绘制模式设置为kCGTextFillStroke(并为文本绘制参数设置适当的值,例如笔触和填充颜色等)

// Choose appropriate text font
CGContextSelectFont(context, [[UIFont boldSystemFontOfSize:24].fontName UTF8String], (int)fontSize, kCGEncodingMacRoman);
// Set text drawing mode 
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
// Set appropriate color/line width values
// Here we're set to draw white letters with black border
CGContextSetRGBStrokeColor(context, 0, 0, 0, 1);
CGContextSetRGBFillColor(context, 1, 1, 1, 1);
CGContextSetLineWidth(context, 1);
// Set this transformations or text will be displayed upside-down
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, xform);
// Display text
CGContextShowTextAtPoint(...);

编辑:由于Quartz不能很好地使用unicode,要绘制unicode字符串,您需要使用其他API。我设法使用NSAttributedString和OHAttributedLabel绘制“有边界”的unicode字符串(感谢this answer用于该自定义控件)。用于在某个视图控制器中获取所需字符串的示例代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableAttributedString *s = [[NSMutableAttributedString alloc] initWithString:@"您好世界"];
    [s addAttributes:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:-3.0f] forKey:(NSString*)kCTStrokeWidthAttributeName]
               range:NSMakeRange(0, [s length])];

    [s addAttributes:[NSDictionary dictionaryWithObject:(id)[UIColor greenColor].CGColor forKey:(NSString*)kCTStrokeColorAttributeName]
               range:NSMakeRange(0, [s length])];

    [s addAttributes:[NSDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName]
               range:NSMakeRange(0, [s length])];

    [s setFont:[UIFont boldSystemFontOfSize:28.0f]];
    [s setTextColor:[UIColor redColor]];

    OHAttributedLabel *l = [[OHAttributedLabel alloc] initWithFrame:CGRectMake(40.0f, 40.0f, 200.0f, 80.0f)];
    l.centerVertically = YES;
    [l setAttributedText: s];
    [self.view addSubview: l];
    [l release];
}

请注意,您需要与CoreText.framework链接才能使其正常工作,并且代码使用OHAttributedLabel实现中提供的一些便捷方法

答案 1 :(得分:0)

我试过这种方式: 使用NSString drawAtPoint绘制:withFont:或drawInRect:withFont:

将线关节和lin cap设置为圆形。

使用绘图模式kCGTextStroke以边框颜色绘制文本,请务必将线宽设置得稍宽,

然后使用绘图模式kCGTextFill以内部颜色绘制文本。

可能需要对位置进行一些调整才能使其完美。