首頁>Program>source

我想知道如何為UILabel建立文字笔划? 有什麼办法吗?

谢谢,

#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)];
最新回復
  • 4天前
    1 #

    根据字型和字元添加一些內容可能会有所帮助,並添加:

    CGContextSetLineJoin(c,kCGLineJoinRound);
    

    可以防止因笔画太大而對字元太锐利的情况。

  • 4天前
    2 #

    此實現存在一个問题.绘製帶有笔划的文字的字元字形宽度与绘製不帶有笔划的文字的字元字形宽度略有不同,這会产生"未居中"的結果.您可以通過在填充文字週圍添加不​​可见的笔觸来解決此問题。

    您應该替換:

    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

  • 如何打開NuGet包的自述URL?
  • android:如何將意圖从適配器類傳遞到其他活動,但是我的變數在其他活動中