2015-04-01 12 views
2

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

// 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]; 

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

enter image description here

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

enter image description here

Update 1

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

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

изображения не показаны –

+0

@ysaditya Но я не использую изображения на фоне моего NSButton. Я заполнил его простым NSColor. – Supertecnoboff

+0

Какой тип кнопки вы используете (например, Momentary Push In и т. Д.) –

ответ

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:, используя свой цвет фона там. Имейте в виду, что родительский вид, содержащий кнопку, должен быть защищен слоем, иначе кнопка будет перерисовываться на каждом шаге.

+0

Большое вам спасибо !!!!! Я решил пойти с обходным решением 2, потому что после прочтения вашего удивительного веб-сайта вы сказали, что анимация слоя назад намного более гладкая. Еще раз спасибо и спасибо за то, что уделили им время, чтобы просмотреть мой вопрос, который я отправил в Twitter. Этот ответ был отмечен и отмечен: D – Supertecnoboff

+3

Хорошая сделка. Убедитесь, что кнопка имеет родительский слой или анимация не будет гладкой, как вы ожидали. –

+0

Спасибо. Сделаю. – Supertecnoboff