CoreAnimation затухает слои и перемещает копию, а не просто перемещает слой - PullRequest
1 голос
/ 26 мая 2011

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

Чтобы удалить один слой, я просто делаю [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;, но не смог найти, какие события переопределить, чтобы получить желаемое поведение.

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

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

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

Итак, эти три клавиши - то, с чем вы должны играть.

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

0 голосов
/ 26 мая 2011

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

...