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