NSAnimation удаляет цвет фона кнопки

Я работаю над приложением Mac. Я пытаюсь сделать простую анимацию, которая заставляет NSButton двигаться вниз. Анимация работает очень хорошо, но когда я это делаю, цвет фона моего NSButton почему-то исчезает. Вот мой код:

// Tell the view to create a backing layer.
additionButton.wantsLayer = YES;

// Set the layer redraw policy. This would be better done in
// the initialization method of a NSView subclass instead of here.
additionButton.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = 1.0f;
    additionButton.animator.frame = CGRectOffset(additionButton.frame, 0.0, -20.0);
    //additionButton.frame = CGRectOffset(additionButton.frame, 0.0, -20.0);
} completionHandler:nil];

Кнопка перемещения вниз анимации:

Кнопка после перемещения вниз анимации:

Обновление 1

Просто чтобы прояснить, я не использую фоновое изображение в своих кнопках. Я использую фоновый NSColor, который я установил в методе viewDidLoad следующим образом:

[[additionButton cell] setBackgroundColor:[NSColor colorWithRed:(100/255.0) green:(43/255.0) blue:(22/255.0) alpha:1.0]];

1 ответ

Решение

Я предполагаю, что это ошибка AppKit. Есть несколько способов обойти это.


Обходной путь 1:

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

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {          
    additionButton.animator.frame = CGRectOffset(additionButton.frame, 0, -20);
} completionHandler:nil];

Обходной путь 2:

Установите цвет фона на слой.

additionButton.wantsLayer = YES;
additionButton.layer.backgroundColor = NSColor.redColor.CGColor;
additionButton.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {          
    additionButton.animator.frame = CGRectOffset(additionButton.frame, 0, -20);
} completionHandler:nil];

Обходной путь 3:

Подкласс NSButtonCellи реализовать -drawBezelWithFrame:inView:, рисуя там свой цвет фона. Имейте в виду, что родительское представление, содержащее кнопку, должно быть зашито от слоя, в противном случае кнопка будет перерисовываться на каждом шаге.

Другие вопросы по тегам