Как вы перемещаете CALayer мгновенно (без анимации)
-
03-07-2019 - |
Вопрос
Я пытаюсь перетащить CALayer
в приложении для iOS.
Как только я меняю его свойство position, он пытается анимировать новое положение и мигает повсюду:
layer.position = CGPointMake(x, y)
Как я могу двигаться CALayers
мгновенно?Кажется, я никак не могу разобраться в основном API анимации.
Решение
Вы хотите заключить свой звонок в следующее:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Другие советы
Расширение Swift 3:
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation: () -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
Использование:
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
Вы также можете использовать вспомогательную функцию
[CATransaction setDisableActions:YES]
также.
Примечание. Обязательно прочитайте комментарии Йогева Шелли, чтобы понять возможные ошибки.
Как и предлагали другие, вы можете использовать CATransaction
.
Проблема возникает, потому что CALayer имеет неявную длительность анимации по умолчанию, равную 0,25 секунды.
Таким образом, более простой (на мой взгляд) альтернативой setDisableActions
является использование setAnimationDuration
со значением 0.0
.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Объединяя предыдущие ответы здесь для Swift 4, чтобы четко указать продолжительность анимации...
extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}
Использование...
CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}