2009-08-22 99 views
0

我有一個NSView子類可以在其超級視圖中拖動。我通過在我的mouseDragged事件處理程序中調用NSView的setFrameOrigin和setFrameRotation方法來移動視圖。每次調用都會移動和旋轉視圖。當第一個NSView在第二個NSView上移動時,NSView會留下工件

我有一個超級視圖所包含的這些視圖的多個實例。我遇到的問題是,當一個視圖被拖拽到另一個視圖上時,它會在它正在遮擋的視圖上留下僞像。我在行動中記錄了a short video。不幸的是,由於視頻壓縮,這些工件並不是非常明顯。

我強烈懷疑這與同時平移和旋轉有關。 Quartz Debug顯示遮擋(或遮擋)視圖的矩形更新爲另一個視圖拖過它(video here);不知何故,這個矩形會被繪圖引擎錯誤地計算出來,所以應該重新繪製的視圖的一部分不是。

踢球者是我不知道如何解決這個問題。我找不到任何方法在文檔中手動指定更新矩形,我也不確定那是需要發生的。有任何想法嗎?謝謝!

回答

1

您還可以考慮使用CALayers,而不是意見。與視圖不同,層旨在與他們的兄弟姐妹堆疊。

對於儘可能最少的解決方案,請嘗試使視圖層次支持;它可能會也可能不會解決這個問題,但值得一試。

+0

這個解決方案對我很有吸引力,因爲我希望使用核心動畫來爲這些視圖所做的某些事情設置動畫效果(例如,當另一個視圖被拖動到同一個插槽中時,它會轉移出來)。可悲的是,簡單地給視圖一個層並不能解決問題(實際上繪製到該層可能會做到這一點)。如果我要使用CALayer而不是視圖,我將如何應對事件? CALayers不從NSRespnder繼承。 (對不起,我是Cocoa n00b,對Core Animation基本無能爲力。) – 2009-08-23 07:08:20

+0

我的理解是,在某個級別上至少需要一個視圖,即使它是託管和控制整個圖層層次結構的單個視圖。在這種安排下,視圖將使用諸如hitTest之類的消息來處理事件,以確定用戶正在使用哪些層。 – 2009-08-23 09:56:43

+0

原來我做錯了。一旦我調用適當的方法爲我的(程序創建的)視圖提供CALayer支持,工件就消失了。當然,我的定位和輪換被打破了,但這不是問題的關鍵。感謝您的建議! – 2009-08-23 23:17:50

0

視圖並非真正被設計爲以交互方式堆疊。可以做到,但邊緣案例比比皆是。

通常,對於這種類型的事情,如果您想在視圖中執行拖動操作(請參見草圖示例),則可以使用像基礎結構的單元格,如果要在兩者之間進行拖動,則可以使用拖放式基礎結構視圖或窗口(或應用程序)。

如果您確實想要將變換後的視圖拖到頂部,則需要使被拖動視圖下方的視圖矩形無效。矩形將需要比被拖動視圖遮擋的總面積(未旋轉/未轉換)大幾個像素。這些文物實際上是由舍入誤差引起的;對角線僅僅是光柵繪圖系統的估計值。

查看方法:

- (void)setNeedsDisplayInRect:(NSRect)invalidRect;