我有一个带有文本字段和边框按钮的窗口。它没有边框和透明,但问题在任何窗口都会重现。
该窗口的内容视图在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];
}
它会导致一些非常奇怪的文物,例如消失的对象或文本字段的背景变为窗口:
发生了什么事?我试图隔离它,我一直在玩这个“图形上下文状态保存”的东西(我不确定我是否理解正确),但问题仍然存在。
我有XCode 4.4,SDK是10.7(我的操作系统也是如此),部署目标是10.6。这可能没关系,但我过去做过类似的事情,我从未遇到过这样的奇怪问题。
答案 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)
我同意这很奇怪/烦人。人们会认为这只是层可能会相互干扰的问题......但如果不做以下事情似乎很难解决..
以下是您所描述的视图,搞砸了。以及之后 - 通过界面构建器更改了一个简单的复选框..
我发现通过将陷入困境的控件放在框或视图或诸如此类中,然后单击界面构建器中的“核心动画”“setWantsLayer”按钮,将允许这些界面元素在没有所有kurfuffle的情况下闪耀。< / p>
有点愚蠢的解决方法......但实际上它有效 - 并且很容易。
PS - 我发现在对这类事情进行故障排除时,有助于使参数更具戏剧性(颜色等) - 特别是如果你试图向人们描述什么是错的......