Отключить неявную анимацию свойства CATextLayer.string

У меня есть представление с одним подслоем типа CATextLayer. Я переопределяю метод представления drawRect: и в нем меняю свойство CATextLayer.string на экземпляр NSAttributedString. Каждый раз NSAttributedString имеет один и тот же текст, но с разными цветами. На данный момент каждый раз, когда свойство строки изменяется, цвет текста выполняет анимированный переход в новый цвет.

Есть ли способ отключить анимацию этого свойства?


person Antoni    schedule 28.02.2011    source источник


Ответы (3)


Разобрался, используя ответ на этот вопрос: Отключение неявной анимации в - [CALayer setNeedsDisplayInRect:]

В моем конкретном случае, чтобы остановить изменение свойства CATextLayer.string от анимации, этого кода было достаточно:

NSDictionary *newActions = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"contents", nil];
textLayer.actions = newActions;
[newActions release];

Другими словами, похоже, что клавиша contents отключает анимацию при изменении свойства CATextLayer.string.

person Antoni    schedule 28.02.2011
comment
У меня не работает. stackoverflow.com/ questions / 21574661 / - person Geek; 07.02.2014
comment
Я объединил ваш ответ с этим: stackoverflow.com/questions/2244147/, чтобы отключить анимацию. Думаю, было проще реализовать быстро. - person Erik Zivkovic; 11.03.2016

Лучшее решение - использовать блок CATransaction для отключения такой анимации:

Цель-C

[CATransaction begin];
[CATransaction setDisableActions:YES];

myTextLayer.string = @"Hello world";

[CATransaction commit];

Быстрый:

CATransaction.begin()
CATransaction.setDisableActions(true)

myTextLayer.string = "Hello world"

CATransaction.commit()
person Raptor T Wiked    schedule 02.09.2014

Чтобы отключить раздражающую (размытую) анимацию при изменении строкового свойства CATextLayer, вы можете сделать это:

class CANullAction: CAAction {
    private static let CA_ANIMATION_CONTENTS = "contents"

    @objc
    func runActionForKey(event: String, object anObject: AnyObject, arguments dict: [NSObject : AnyObject]?) {
        // Do nothing.
    }
}

а затем используйте его так (не забудьте правильно настроить CATextLayer, например, правильный шрифт и т. д.):

caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()]

Вы можете увидеть мою полную настройку CATextLayer здесь:

private let systemFont16 = UIFont.systemFontOfSize(16.0)

caTextLayer = CATextLayer()
caTextLayer.foregroundColor = UIColor.blackColor().CGColor
caTextLayer.font = CGFontCreateWithFontName(systemFont16.fontName)
caTextLayer.fontSize = systemFont16.pointSize
caTextLayer.alignmentMode = kCAAlignmentCenter
caTextLayer.drawsAsynchronously = false
caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()]
caTextLayer.contentsScale = UIScreen.mainScreen().scale
caTextLayer.frame = CGRectMake(playbackTimeImage.layer.bounds.origin.x, ((playbackTimeImage.layer.bounds.height - playbackTimeLayer.fontSize) / 2), playbackTimeImage.layer.bounds.width, playbackTimeLayer.fontSize * 1.2)

uiImageTarget.layer.addSublayer(caTextLayer)
caTextLayer.string = "The text you want to display"

Теперь вы можете обновлять caTextLayer.string сколько угодно =)

На основе этого и этого ответ.

person Erik Zivkovic    schedule 11.03.2016