CoreAnimation удаляет слои и перемещает копию вместо простого перемещения слоя

#objective-c #cocoa #macos #core-animation

#objective-c #cocoa #macos #ядро-анимация

Вопрос:

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

Чтобы удалить один слой, я просто делаю [theLayer removeFromSuperLayer] , а затем вызываю свою процедуру компоновки на уровне контейнера, которая выполняет это:

 CGFloat x = 0;
CGFloat y = CGRectGetMaxY( [layer bounds] ) - buttonHeight - buttonVPadding;
for (CALayer *l in [layer sublayers]) {
    if ([layer bounds].size.width < x   buttonWidth) {
        x = 0;
        y -= buttonHeight   buttonVPadding;
    }
    CGRect bounds = CGRectMake( 0, 0, buttonWidth, buttonHeight );
    [l setBounds: bounds];
    [l setPosition: CGPointMake( x, y )];
    x  = buttonWidth   buttonVPadding;
}
  

Я попытался переопределить поведение анимации по умолчанию в - (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event; , но я не смог выяснить, какие события переопределить, чтобы получить желаемое поведение.

Ответ №1:

После ввода этого вопроса и еще немного поразмышляв о проблеме, я нашел решение или обходной путь. Вместо прямого удаления слоя я устанавливаю для него значение hidden и пропускаю скрытые слои в моем цикле компоновки. Затем, после завершения всех анимаций (в блоке завершения моего CATransaction ) Я удаляю все скрытые слои без анимации.

Ответ №2:

насколько я понимаю о CAAnimation, ключевой аргумент определяет свойство CALayer, которое вы анимируете. в вашем случае это должны быть границы и положение.

вы также, в целом, изменяете свойство подслоев, поскольку удаляете один слой.

Итак, эти три клавиши — это то, с чем вам нужно поиграть.

С другой стороны, определяя свой делегат actionForKey, вы должны иметь возможность видеть, для каких ключей вызывается этот метод. или вы могли бы проверить словарь действий в вашем CALayer. но я не знаю, помогает ли это.