Подтвердить что ты не робот

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

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

Спасибо!

4b9b3361

Ответ 1

Я не думаю, что вы можете добавить подкласс UIView к объекту CALayer. Однако, если вы хотите нарисовать текст на объекте CALayer, это можно сделать, используя функции рисования, представленные в NSString UIKit additions, как показано ниже. Хотя мой код выполняется в методе делегата 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();
}

Ответ 2

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];

Ответ 3

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

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

Ответ 4

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

Ответ 5

Просто чтобы задокументировать мой подход, я сделал это так в 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 

Ответ 6

Всегда помните, чтобы удалить предыдущие подслои, если вы собираетесь добавить еще один, чтобы предотвратить дублирование просмотров:

if let sublayers = layer.sublayers {
    for sublayer in sublayers {
        sublayer.removeFromSuperlayer()
    }
}