如果我从视图中删除这个方法,一切都可以正常工作(如果我单击一个按钮,没有内容消失),所以这绝对是原因。
我试图使一个窗口是圆润的,并通过下面的代码有一个梯度。有什么问题,这可能导致内容在视图上消失吗?
- (void)drawRect:(NSRect)dirtyRect
{
[NSGraphicsContext saveGraphicsState];
NSBezierPath *outerClip = [NSBezierPath bezierPathWithRoundedRect:[self bounds]
xRadius:3.0
yRadius:3.0];
[outerClip setClip];
NSGradient* aGradient = [[NSGradient alloc]
initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0 alpha:1.0]
endingColor:[NSColor colorWithCalibratedWhite:0.65 alpha:1.0]];
[aGradient drawInRect:[outerClip bounds] angle:270];
[NSGraphicsContext restoreGraphicsState];
}
切换到NSGradient drawwinbezierpath可以修复这个问题。
我知道你已经回答了你自己的问题,但我想我应该分享一下为什么你的内容会随着上面的代码消失。
当你使用setClip
时,你是删除以前的剪辑路径和用你的新路径替换。这意味着您将在的脏区域之外绘制,从而覆盖先前绘制的内容。
我在自己的启动画面上画圆角时也遇到了同样的问题,最终我找到了一种不同的方法来实现我想要的。
同样,您可以使用NSBezierPath
的clipRect:
类方法将剪辑路径更改为现有路径与您想要限制绘制的区域的交集。当然,保存并恢复您调用clipRect:
时的图形状态。