2013-07-02 2 views
3

Я ударился головой о стену, пытаясь понять эту проблему. Я добавил CATextLayer в CALayer, и после нескольких операций я хочу изменить текст CATextLayer на что-то другое. Есть ли простой способ сделать это? Ниже приведен код ниже, который, похоже, не работает.Динамически меняет текст CATextLayer

self.searchingForTextLayer = [CATextLayer layer]; 
    self.searchingForTextLayer.bounds = CGRectMake(0.0f, 0.0f, 100.0f, 30.0f); 
    self.searchingForTextLayer.string = @"Searching for.."; 
    self.searchingForTextLayer.fontSize = 12; 
    //TextLayer.font = [UIFont boldSystemFontOfSize:18].fontName; 
    self.searchingForTextLayer.backgroundColor = [UIColor clearColor].CGColor; 
    self.searchingForTextLayer.position = CGPointMake(80.0, 40.0f); 
    self.searchingForTextLayer.wrapped = NO; 
    [self.captureVideoPreviewLayer addSublayer:self.searchingForTextLayer]; 

и позже я называю это в методе

self.searchingForTextLayer.string = @"Search complete"; 

но называть это не изменяет текст на экране.

Любая помощь будет замечательной!

+0

Это сработало для меня. Добавлено две дополнительные строки, но вы бы тоже это сделали. self.captureVideoPreviewLayer = [слой CATextLayer]; [self.captureVideoPreviewLayer addSublayer: self.searchingForTextLayer]; [[self.view layer] addSublayer: self.captureVideoPreviewLayer]; – ratul

+0

Да, эта часть работает, когда я пытаюсь изменить текст после того, как я уже добавил его в качестве подслоя, который он не изменит. – user1179321

+0

Все в порядке для меня. Прежде чем изменять текст, убедитесь, что «self.searchingForTextLayer» указывает на правый слой. – ratul

ответ

1

Убедитесь, что вы изменяете свойство строки в основном потоке и отключите анимацию. Это сработало для меня (Swift):

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       CATransaction.begin() 
       CATransaction.setDisableActions(true) 
       self.textLayer?.string = text 
       CATransaction.commit() 
      })