rad*_*dex 4 macos cocoa objective-c
我有一个带有文本字段和边框按钮的窗口.它没有边框和透明,但问题在任何窗口都会重现.
该窗口的内容视图在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];
}
Run Code Online (Sandbox Code Playgroud)
它会导致一些非常奇怪的文物,比如消失的对象或文本字段的背景变为窗口:

这是怎么回事?我试图隔离它,我一直在玩这个"图形上下文状态保存"的东西(我不确定我是否理解正确),但问题仍然存在.
我有XCode 4.4,SDK是10.7(我的操作系统也是如此),部署目标是10.6.这可能没关系,但过去我一直在做类似的事情,我从未遇到过这样的奇怪问题.
小智 6
问题似乎是[path setClip]方法.我评论了这一点,文本字段和按钮正确绘制.
所以,我接着换了一行:
[gradient drawInRect:self.bounds angle:270];
Run Code Online (Sandbox Code Playgroud)
同
[gradient drawInBezierPath:path angle:270];
Run Code Online (Sandbox Code Playgroud)
一切都很完美.按钮和文本字段按预期显示.
NSBezierPath的类引用声明:
您应该避免使用此方法作为调整剪切路径的方法,因为它可能会将剪切路径扩展到封闭视图设置的边界之外.如果使用此方法,请确保在修改剪切路径之前保存图形状态,并在完成后恢复图形状态.
该方法使用当前缠绕规则来确定接收器的削波形状.此方法不会影响接收者的路径.
没有真正解释你看到的问题,但引导我看看我怎么能画出渐变.
使其工作的一种解决方法是(在窗口的 -awakeFromNib 或 -init 处)制作与 self.bounds 大小相同的 NSImage,然后将此渐变绘制到图像中(使用图像的 -lockFocus、-unlockFocus)。然后,您可以使用 window.backgroundColor = [NSColor colorWithPatternImage:image]; 将图像设置为背景;
它有效,但我对这个解决方案不满意。
我看不出上面的方法行不通的任何原因。我在绘制视图时也遇到过类似的奇怪问题,所以我想知道它不起作用的真正原因。
| 归档时间: |
|
| 查看次数: |
1684 次 |
| 最近记录: |