窗口圆角落梯度背景在可可粉的

时间:2012-08-15 15:05:23

标签: objective-c macos cocoa

我有一个带有文本字段和边框按钮的窗口。它没有边框和透明,但问题在任何窗口都会重现。

该窗口的内容视图在IB中设置为绘制窗口背景的自定义类。

以下是代码:

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];

    float cornerRadius = 10;
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:self.bounds xRadius:cornerRadius yRadius:cornerRadius];

    [path setClip];

    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
                            [NSColor colorWithCalibratedRed:0.96f green:0.96f blue:0.96f alpha:1.00f], 0.0f,
                            [NSColor colorWithCalibratedRed:0.84f green:0.84f blue:0.84f alpha:1.00f], 1.0f,
                            nil];

    [gradient drawInRect:self.bounds angle:270];

    [NSGraphicsContext restoreGraphicsState];
}

它会导致一些非常奇怪的文物,例如消失的对象或文本字段的背景变为窗口:

enter image description here enter image description here

发生了什么事?我试图隔离它,我一直在玩这个“图形上下文状态保存”的东西(我不确定我是否理解正确),但问题仍然存在。

我有XCode 4.4,SDK是10.7(我的操作系统也是如此),部署目标是10.6。这可能没关系,但我过去做过类似的事情,我从未遇到过这样的奇怪问题。

3 个答案:

答案 0 :(得分:6)

问题似乎是[path setClip]方法。我对此进行了评论,文本字段和按钮正确绘制。

所以,我接着换了一行:

[gradient drawInRect:self.bounds angle:270];

[gradient drawInBezierPath:path angle:270];

一切都很完美。按钮和文本字段按预期显示。

NSBezierPath的类引用声明:

  

您应该避免使用此方法作为调整剪切路径的方法,因为它可能会将剪切路径扩展到封闭视图设置的边界之外。如果您确实使用此方法,请务必在修改剪切路径之前保存图形状态,并在完成后恢复图形状态。

     

此方法使用当前缠绕规则来确定接收器的削波形状。此方法不会影响接收者的路径。

没有真正解释你所看到的问题,但引导我看看我怎么能画出渐变。

答案 1 :(得分:0)

使其工作的一种解决方法是使(在窗口的-awakeFromNib或-init)NSImage与self.bounds具有相同的大小,然后将此渐变绘制到图像中(使用image的-lockFocus,-unlockFocus)。然后,您可以使用window.backgroundColor = [NSColor colorWithPatternImage:image];

将图像设置为背景

它有效,但我对解决方案不满意。

我认为上述原因无效。我在绘制视图方面遇到了类似的奇怪问题,所以我想知道它不起作用的真正原因。

答案 2 :(得分:0)

我同意这很奇怪/烦人。人们会认为这只是层可能会相互干扰的问题......但如果不做以下事情似乎很难解决..

以下是您所描述的视图,搞砸了。以及之后 - 通过界面构建​​器更改了一个简单的复选框..

enter image description here

enter image description here

我发现通过将陷入困境的控件放在框或视图或诸如此类中,然后单击界面构建器中的“核心动画”“setWantsLayer”按钮,将允许这些界面元素在没有所有kurfuffle的情况下闪耀。< / p>

enter image description here

有点愚蠢的解决方法......但实际上它有效 - 并且很容易。

PS - 我发现在对这类事情进行故障排除时,有助于使参数更具戏剧性(颜色等) - 特别是如果你试图向人们描述什么是错的......