NSButton обрезается с помощью CAAnimation

Итак, я делаю простую анимацию на NSButton, которую нашел здесь

button.wantsLayer = YES;
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"position.x";
animation.values = @[ @0, @10, @-10, @10, @0 ];
animation.keyTimes = @[ @0, @(1 / 6.0), @(3 / 6.0), @(5 / 6.0), @1 ];
animation.duration = 0.5;
animation.additive = YES;
[button.layer addAnimation:animation forKey:@"shake"];

За исключением того, что когда он покачивается из стороны в сторону, он обрезается (это довольно сложно сделать на скриншоте, так что вот)

введите здесь описание изображения

Вы можете видеть, что справа от кнопки «2» (та, которая анимируется), тень/скос обрезается/обрезается.

Я думал, что это может быть вещь clipsToBounds, но ни кнопка, ни слой не имеют такого свойства (может быть, это единственная вещь для iOS, где мой фон)?

Любые идеи/решения будут оценены :)


person Sam Jarman    schedule 03.09.2014    source источник
comment
Он определенно выглядит обрезанным — обрезана только одна кнопка? Если это так, попробуйте продублировать одну из других кнопок и заменить неисправную копию.   -  person l'L'l    schedule 03.09.2014
comment
Все кнопки обрезаны :/   -  person Sam Jarman    schedule 03.09.2014
comment
Может быть, если вы опубликуете свой проект (или его базовую форму), кто-то сможет лучше рассмотреть.   -  person l'L'l    schedule 04.09.2014
comment
Да, Сэм, есть демо-проект?   -  person Moshe    schedule 14.09.2014


Ответы (2)


Я смог решить эту проблему в своем проекте, предоставив кнопке суперпредставление собственный CALayer, выбрав представление в IB, затем перейдя в «Инспектор эффектов просмотра» и установив флажок в разделе «Основной слой анимации». Я уверен, что вы могли бы сделать это программно, но я не уверен, является ли этот слой "резервным" или "размещенным". Изменить: в соответствии с этот пост к сведению, поддерживается слоями.

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

Возможно, это не имеет значения, но я использую CABasicAnimation вместо CAKeyFrameAnimation.

person Brad Allred    schedule 16.09.2014
comment
Идеально. Хитрость заключалась в том, чтобы изменить этот параметр в представлении, которое удерживало кнопки. Спасибо! - person Sam Jarman; 17.09.2014
comment
@SamJarman да, это то, что имелось в виду под superview, извините, если это было непонятно. Рад, что это сработало для вас; К сожалению, с CoreAnimation есть куча странных ошибок :/ - person Brad Allred; 17.09.2014

Анимация ограничена границами CALayer, который определяется представлением. Таким образом, отсечение происходит, когда изображение выходит за пределы представления кнопки. Вероятно, есть более разумный способ, но встраивание NSButton в немного больший NSView и встряхивание этого представления, похоже, работает.

person RishiG    schedule 16.09.2014