2011-02-23 77 views
6

我想知道如何爲UILabel創建文字描邊?有沒有可能的方法? enter image description hereuilabel大綱或描邊

謝謝你,

#import <Foundation/Foundation.h> 


@interface CustomLabel : UILabel { 

} 

@end 

#import "CustomLabel.h" 


@implementation CustomLabel 

- (void)drawTextInRect:(CGRect)rect { 

    CGSize shadowOffset = self.shadowOffset; 
    UIColor *textColor = self.textColor; 

    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(c, 22); 

    CGContextSetTextDrawingMode(c, kCGTextStroke); 
    self.textColor = [UIColor whiteColor]; 
    [super drawTextInRect:rect]; 

    CGContextSetTextDrawingMode(c, kCGTextFill); 
    self.textColor = textColor; 
    self.shadowOffset = CGSizeMake(0, 0); 
    [super drawTextInRect:rect]; 

    self.shadowOffset = shadowOffset; 
    //works fine with no warning 
} 

現在的問題是我如何使用這個子類有不同的viewcontrollers一個IBOutlet中的標籤。是不是:

label = [[CustomLabel alloc] initWithFrame:CGRectMake(0, 0, 190, 190)]; 
+0

你爲什麼不嘗試在Interface Builder中創建'label'並且建立連接以便你的應用程序完成最少的工作? – Lynn 2011-02-23 18:01:46

+0

謝謝:)我很困惑:D現在很好用 – Momi 2011-02-23 20:20:45

+0

謝謝!好想法!仍然需要參數化,如線寬,顏色等。 – Bogdan 2012-07-18 16:23:45

回答

3

這可能是有益的一些補充的是取決於字體和字符,增加:

CGContextSetLineJoin(c,kCGLineJoinRound); 

可以防止過大施加到太尖銳的字符的筆畫的僞影。

0

這個實現有一個問題。用筆畫繪製文本與繪製沒有筆畫的文本會產生「未經處理」結果的字體寬度略有不同。您可以通過在填充文本週圍添加一個不可見的筆劃來解決這個問題。

,就應該替換:

CGContextSetTextDrawingMode(c, kCGTextFill); 
self.textColor = textColor; 
self.shadowOffset = CGSizeMake(0, 0); 
[super drawTextInRect:rect]; 

有:

CGContextSetTextDrawingMode(context, kCGTextFillStroke); 
self.textColor = textColor; 
[[UIColor clearColor] setStroke]; // invisible stroke 
self.shadowOffset = CGSizeMake(0, 0); 
[super drawTextInRect:rect]; 

我不是100%肯定,如果這是實打實的,因爲我不知道是否self.textColor = textColor;有同樣的效果作爲[textColor setFill],但你明白了。

披露:我是THLabel的開發人員。

我剛剛發佈了一個UILabel子類,它允許在文本和其他效果中使用大綱。你可以在這裏找到它:https://github.com/tobihagemann/THLabel