Можно ли добавить UILabel
в CALayer
без подкласса и нарисовать его в drawInContext:
?
Спасибо!
Можно ли добавить UILabel
в CALayer
без подкласса и нарисовать его в drawInContext:
?
Спасибо!
Я не думаю, что вы можете добавить подкласс 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();
}
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];
У вашего UILabel уже есть CALayer. Если вы собираете несколько CALayers, вы можете просто добавить слой UILabel в качестве подуровня одного из них (используя его свойство layer
).
Если он направляет текстовый чертеж в слой, который вы хотите, добавление UIKit NSString, на которое указывает Deepak, - это путь. Для примера этого в действии Core Plot framework имеет независимый от платформы подкаст CALayer для платформы Mac/iPhone, который выполняет рендеринг текста, CPTextLayer.
Добавьте CATextLayer в качестве подслоя и установите свойство string. Это было бы проще всего, и вы можете легко использовать диспетчер компоновки, чтобы сделать его очень общим.
Просто чтобы задокументировать мой подход, я сделал это так в 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
Всегда помните, чтобы удалить предыдущие подслои, если вы собираетесь добавить еще один, чтобы предотвратить дублирование просмотров:
if let sublayers = layer.sublayers {
for sublayer in sublayers {
sublayer.removeFromSuperlayer()
}
}