Ответ 1
Вы хотите связать свой вызов следующим образом:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Я пытаюсь перетащить CALayer
в приложение для iOS.
Как только я изменяю его свойство position, оно пытается анимироваться на новую позицию и мерцает повсюду:
layer.position = CGPointMake(x, y)
Как я могу перемещать CALayers
мгновенно? Кажется, я не могу понять, что такое Core Animation API.
Вы хотите связать свой вызов следующим образом:
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
Быстрое расширение 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
}