Отключить неявную анимацию свойства CATextLayer.string - PullRequest
4 голосов
/ 28 февраля 2011

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

Можно ли как-нибудь отключить анимацию этого свойства?

Ответы [ 3 ]

7 голосов
/ 28 февраля 2011

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

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

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

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

2 голосов
/ 02 сентября 2014

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

Objective-C

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

myTextLayer.string = @"Hello world";

[CATransaction commit];

Swift:

CATransaction.begin()
CATransaction.setDisableActions(true)

myTextLayer.string = "Hello world"

CATransaction.commit()
0 голосов
/ 11 марта 2016

Чтобы отключить раздражающую (размытую) анимацию при изменении свойства строки 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правильно, например, правильный шрифт и т.want =)

Вдохновленный этим и этим ответом.

...