2011-01-21 39 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