NSAnimation删除按钮背景颜色

时间:2015-04-01 05:57:05

标签: macos cocoa nsbutton nsanimationcontext 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];

按钮向下移动动画:

enter image description here

向下移动动画后的

按钮:

enter image description here

更新1

为了说清楚,我没有在按钮中使用背景图像。我正在使用我在viewDidLoad方法中设置的背景NSColor,如下所示:

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

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:,在那里绘制背景颜色。请记住,包含按钮的父视图应该是图层备份的,否则按钮仍会在每一步重绘。