Отключение неявных анимаций в - [CALayer setNeedsDisplayInRect:]

У меня есть слой с некоторым сложным кодом для прорисовки в его-drawInContext: метод. Я пытаюсь минимизировать сумму рисования, которое я должен сделать, таким образом, я использую-setNeedsDisplayInRect: обновить просто измененные части. Это работает блестяще. Однако, когда графическая система обновляет мой слой, она переходит от старого до нового изображения с помощью плавно накладывания. Я хотел бы, чтобы это переключилось немедленно.

Я попытался использовать CATransaction, чтобы выключить действия и обнулить продолжительность и никакую работу. Вот код, который я использую:

[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];

Есть ли другой метод на CATransaction, который я должен использовать вместо этого (я также попробовал-setValue:forKey: с kCATransactionDisableActions, тем же результатом).

132
задан Brad Larson 24 October 2011 в 01:57
поделиться

1 ответ

Вы можете сделать это, установив словарь действий на слое так, чтобы он возвращал [NSNull null] в качестве анимации для соответствующего ключа. Например, я использую

NSDictionary *newActions = @{
    @"onOrderIn": [NSNull null],
    @"onOrderOut": [NSNull null],
    @"sublayers": [NSNull null],
    @"contents": [NSNull null],
    @"bounds": [NSNull null]
};

layer.actions = newActions;

для отключения анимации постепенного появления / исчезновения при вставке или изменении подслоев в одном из моих слоев, а также при изменении размера и содержимого слоя. Я считаю, что ключ contents - это тот, который вы ищете, чтобы предотвратить перекрестное затухание на обновленном чертеже.


Версия Swift:

let newActions = [
        "onOrderIn": NSNull(),
        "onOrderOut": NSNull(),
        "sublayers": NSNull(),
        "contents": NSNull(),
        "bounds": NSNull(),
    ]
167
ответ дан 24 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: