2011-01-21 35 views
3

所以,我的可可应用程序中有这个奇怪的问题。工具栏项目和一些NSImageViews只是将其图像颠倒过来,原因不明。当我启动应用程序出于某种原因(图标分配在代码中)时,工具栏项目实际上就是这样,然后,当我用取景器缩放效果打开我的HUD时,其中包含的图像视图颠倒了。NSImageViews中的图像随机颠倒过来

alt text

以上即图像是这种奇现象screensot。正如你所看到的,“Show Trash”项目被奇怪地旋转,每个HUD中的NSImageView,但NSBrowser中的NSImageView都很好。

我该如何去追踪是什么导致这种情况,然后修复它?

回答

13

Mac OS X Developer Release Note - AppKit Release Notes (Snow Leopard)

工具栏翻转的图像(新建自 2009年1月种子)

一个常见但不正确的做法是 呼叫setFlipped:YES是 您打算绘制图像成翻转的 图形上下文。这是不正确的 ,因为如果图像稍后绘制为 到正常的未翻转上下文中,则图像将颠倒显示。 但是,Leopard和更早版本包含 的一个bug,其中 NSToolbarItem(通过setImage:)设置的图像 将忽略它们的isFlipped属性。 SnowLeopard修复了在SnowLeopard上使用10.6 SDK编译的应用程序 的此bug;因此,当您的 应用程序重新编译时,一些 应该在 Leopard中颠倒过来的图像将开始这样做。

如果你重新编译的 雪豹应用程序,并发现你 工具栏项的图像绘制颠倒 下降,则表明你是 调用setFlipped:YES地方 你的代码中。您应该删除 这些呼叫,并用正确处理翻转的上下文的方法替换图片 。关于setFlipped:的 讨论请参见这些 发行说明以获取更多讨论。

重新:setFlipped:

NSImage中:贬低 - [NSImage中 setFlipped:],加入描绘方法 尊重上下文flippedness(新泽西 自2008年WWDC)

的翻转NSImage的属性是 被广泛误解。我们 不赞成使用SnowLeopard,而 用更少的 替代它的典型用途,容易出错的API。

该属性描述内部坐标系 NSImage的方向 。正如上海华 从来不计较的 其子视图的flippedness,一个NSImage 的用户应该不会在意它的flippedness。

典型的(有缺陷)的使用情况是 尝试调用[image setFlipped:[[NSGraphicsContext currentContext] isFlipped]]前夕 图纸,但这并不 完成预期目标。如果缓存之前称之为 ,然后 交涉最终倒挂缓存下来 和翻盖被吸收到 缓存。如果在缓存之后调用,则它不起作用 - 已缓存的 表示已被假设为包含任何必要的翻转。 在前一种情况下,如果NSImage是 绘制其他地方后,它结束了 在地方,这是 也令人困惑,因为这个错误和错误的 表达相距甚远倒挂。 缺乏有关 flippedness理解也频繁的执行代码不佳,在 人们作无谓的 中间缓冲器来解决 感知框架错误的 源。 框架根据设计行为, 但与预期相反,并且 语义不是所有有用的。 这也是难以改变的-[NSImage isFlipped], 的 语义,因为大量的代码是非常密切 依赖于当前的行为。 而不是尝试此操作,我们已弃用该属性 。

我们提供了一个简单而正确的 方式绘制的翻转或 unflipped背景下,这是一个平局 方法,可以考虑上下文 flippedness图像。我们还在-bestRepresentationForRect:context:hints:中添加了一个匹配提示的 提示参数。

- (void)drawInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)alpha respectFlipped:(BOOL)respectContextIsFlipped hints:(NSDictionary *)hints;

YESrespectFlipped得到新奇的行为。一个 注意那些了解CTM ,并担心这种方法有一个奇怪的 交互,其中修改CTM 可能无法对图像产生影响 绘图:情况并非如此。此 方法根据 [[NSGraphicsContext currentContext] isFlipped]分支行为。修改CTM可能 把你的轴倒挂,但 不会改变的 -[NSGraphicsContext isFlipped]结果。它们完全正交。

-[NSImage setFlipped:]第二有效用途是指定 flippedness经由-[NSImage lockFocus]获得 上下文。有 的情况下,例如通过NSLayoutManager直接 ,需要翻转上下文 。为了弥补这种情况下,我们 添加

- (void)lockFocusFlipped:(BOOL)flipped;

这不会改变对 的 图像本身,只有上下文的状态,这会锁定对焦。这意味着 (0,0)位于左上方,沿着Y轴的正值 在锁定的 上下文中向下。

3

我非常喜欢的猜测是图片被错误地调用了-setFlipped:YES

+0

我的代码中没有任何地方使用了setFlipped,所以这肯定是某种奇怪的错误,但是明确地设置Images不会被翻转就是一个窍门。什么可能导致什么?另外,我只注意到在NIB中发生了这种情况,我存储了这组特定的窗口。另一个NIB中的主窗口未受此影响。 – 2011-01-21 05:15:09

+1

您可以在 - [NSImage setFlipped:]上设置一个符号断点并查看它何时发生变化。 – 2011-01-21 07:25:18