Добавить текст в CALayer - PullRequest
       26

Добавить текст в CALayer

29 голосов
/ 05 февраля 2010

Можно ли добавить UILabel к CALayer без подклассов и нарисовать его в drawInContext:?

Спасибо!

Ответы [ 6 ]

145 голосов
/ 18 ноября 2010
CATextLayer *label = [[CATextLayer alloc] init];
[label setFont:@"Helvetica-Bold"];
[label setFontSize:20];  
[label setFrame:validFrame];
[label setString:@"Hello"];
[label setAlignmentMode:kCAAlignmentCenter];
[label setForegroundColor:[[UIColor whiteColor] CGColor]];
[layer addSublayer:label];

[label release];
38 голосов
/ 05 февраля 2010

Не думаю, что вы можете добавить подкласс UIView к объекту CALayer. Однако, если вы хотите нарисовать текст на объекте CALayer, это можно сделать с помощью функций рисования, представленных в NSString UIKit дополнения , как показано ниже. Хотя мой код выполняется в методе drawLayer: inContext делегата, то же самое можно использовать в методе drawInContext: подкласса. Есть ли какая-то конкретная функциональность UILabel, которую вы хотите использовать?

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
  CGContextSetFillColorWithColor(ctx, [[UIColor darkTextColor] CGColor]);

  UIGraphicsPushContext(ctx);
  /*[word drawInRect:layer.bounds 
          withFont:[UIFont systemFontOfSize:32] 
     lineBreakMode:UILineBreakModeWordWrap 
         alignment:UITextAlignmentCenter];*/

  [word drawAtPoint:CGPointMake(30.0f, 30.0f) 
           forWidth:200.0f 
           withFont:[UIFont boldSystemFontOfSize:32] 
      lineBreakMode:UILineBreakModeClip];

  UIGraphicsPopContext();
}
4 голосов
/ 05 февраля 2010

У вашей UILabel уже есть CALayer. Если вы собираете несколько слоев CALayers, вы можете просто добавить слой UILabel в качестве подслоя одного из них (используя его свойство layer).

Если вам нужен прямой отрисовка текста в нужном слое, добавьте UIKit NSString, на который указывает Deepak. Например, в действии Core Plot Framework имеет независимый от платформы Mac / iPhone подкласс CALayer, который выполняет рендеринг текста, CPTextLayer .

3 голосов
/ 17 ноября 2010

Добавьте CATextLayer в качестве подслоя и установите свойство строки. Это будет проще всего, и вы можете легко использовать менеджер макетов, чтобы сделать его очень универсальным.

1 голос
/ 16 мая 2019

Просто чтобы задокументировать мой подход, я сделал это в Swift 4+:

let textlayer = CATextLayer()

textlayer.frame = CGRect(x: 20, y: 20, width: 200, height: 18)
textlayer.fontSize = 12
textlayer.alignmentMode = .center
textlayer.string = stringValue
textlayer.isWrapped = true
textlayer.truncationMode = .end
textlayer.backgroundColor = UIColor.white.cgColor
textlayer.foregroundColor = UIColor.black.cgColor

caLayer.addSublayer(textlayer) // caLayer is and instance of parent CALayer 
0 голосов
/ 02 мая 2016

Всегда не забывайте удалять предыдущие подслои, если вы хотите добавить еще один, чтобы избежать дублирования представлений:

if let sublayers = layer.sublayers {
    for sublayer in sublayers {
        sublayer.removeFromSuperlayer()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...