如何使用Cocoa实现像素级准确绘图

3

我正在尝试在Cocoa中绘制一些UI元素,主要是按钮的图标,但是我很难获得我想要的精度。

我使用简单的代码来绘制矩形,例如:

[[NSColor redColor] set];
[NSBezierPath strokeRect:myRect];

但是我看到的是红色矩形线总是变淡了。

我错过了什么?


NSBezierPath存在极大的性能问题,您确定要将其用于矩形吗? - Antwan van Houdt
我假设原帖作者打算进行更复杂的绘图,但首先尝试绘制了一个矩形。 - Jakob Egger
是的,这只是我能做到的一个简单示例,但我没有意识到NSBezierPath的性能损失,所以我会寻找替代方案。 - BenL0
3
根据我的经验,NSBezierPath并不是太糟糕。如果你想绘制数千个路径,可能会遇到问题。但完全避免使用NSBezierPath听起来像是过早优化。只有在测试应用程序时检测到实际的性能问题时,才建议寻找替代方案。 - Jakob Egger
2个回答

8

Cocoa坐标实际上指定了您想要绘制的像素的中心。这意味着,例如,如果您想在左下角像素上绘制,应使用坐标(0.5,0.5)。

将半个像素加/减到您的坐标上,它们就应该是完美的像素。


0
您可以通过以下方式为您的图形上下文禁用抗锯齿功能:
[[NSGraphicsContext currentContext] setShouldAntialias:NO];

或者你可以使用NSFrameRect而不是贝塞尔路径,这样可以获得所需的精度,同时保持抗锯齿:

NSFrameRect(myRect);

1
也许是因为禁用抗锯齿并不是一个好主意。 - Jesús A. Álvarez
这不是正确的答案,而是对帖子问题的解决方法。请参阅Jakob的回答。 - Jay
虽然这会解决淡化的问题,但也破坏了OS X的一个显著特色——惊人的抗锯齿。如果它只有一个像素宽或高,抗锯齿可以让它更易于看到。如果它是一个大形状或其他东西,抗锯齿并不重要(除非你正在为平面设计设计某些东西)。我不确定这是否值得投赞成或反对票——这完全是一种观点。话虽如此,锯齿会破坏文本和小形状的外观。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接