#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. но я не знаю, помогает ли это.