1. ホーム
  2. ios

[解決済み] UILabelにアウトライン化されたテキストを表示させるには?

2022-10-12 01:28:04

質問

白いUILabelのテキストに1ピクセルの黒い縁取りが欲しいだけなのです。

私は、以下のコードで UILabel をサブクラス化するところまでたどり着きました。そして、それは動作しますが、非常に、非常に遅く (シミュレーターを除く)、テキストを垂直方向にセンタリングすることができませんでした (それで、最終行の y 値を一時的にハードコードしました)。ああああああああああああああああああああああああああああああああああああああああああああああああああああああ

void ShowStringCentered(CGContextRef gc, float x, float y, const char *str) {
    CGContextSetTextDrawingMode(gc, kCGTextInvisible);
    CGContextShowTextAtPoint(gc, 0, 0, str, strlen(str));
    CGPoint pt = CGContextGetTextPosition(gc);

    CGContextSetTextDrawingMode(gc, kCGTextFillStroke);

    CGContextShowTextAtPoint(gc, x - pt.x / 2, y, str, strlen(str));
}


- (void)drawRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGRect viewBounds = self.bounds;

    CGContextTranslateCTM(theContext, 0, viewBounds.size.height);
    CGContextScaleCTM(theContext, 1, -1);

    CGContextSelectFont (theContext, "Helvetica", viewBounds.size.height,  kCGEncodingMacRoman);

    CGContextSetRGBFillColor (theContext, 1, 1, 1, 1);
    CGContextSetRGBStrokeColor (theContext, 0, 0, 0, 1);
    CGContextSetLineWidth(theContext, 1.0);

    ShowStringCentered(theContext, rect.size.width / 2.0, 12, [[self text] cStringUsingEncoding:NSASCIIStringEncoding]);
}

私は、これを行うためのもっと簡単な方法を見落としているような気がしてならないのです。おそらく "drawTextInRect" をオーバーライドすることによって、しかし、私は drawTextInRect をじっと見て、本当に本当に一生懸命顔をしかめても、私の意志に従うようになるようには全く見えないのです。

どのように解決するのですか?

drawTextInRectをオーバーライドすることで出来ました。

- (void)drawTextInRect:(CGRect)rect {

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

  CGContextRef c = UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(c, 1);
  CGContextSetLineJoin(c, kCGLineJoinRound);

  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;

}