0

我遇到了Cocoa及其View層次結構的問題。isOpaque不會傳遞給父母drawRect

我目前正在測試在meter風格控件中顯示(音頻)級別,我正在使用來自Apple的MatrixMixerTest示例項目的MeteringView類。這個班級正在繪製儀表,只繪製變化的差異,看起來像一個非常有效的班級。

我的項目被拆分成2個拆分視圖,其中一些是NSCollectionViews(滾動視圖,Clipview),而另一些只是靜態視圖。如果我將這些儀表添加到這些「靜態」視圖,當這些視圖調用setNeedsDisplay:YES時,它們可以正常工作。如果將一個儀表添加到CollectionView項目的視圖中,它將被渲染,但會丟失其繪製的「舊級別」零件及其角落/背景。我認爲這是因爲CollectionView項目也被稱爲重繪(其具有背景圖像)並且一切都消失了。它正在繪製一些當前正在改變的部分(繪圖工程)。

有沒有辦法來防止物品本身被重繪?或者,我不知道爲什麼它不會在這些靜態視圖中發生,因爲這些視圖也具有背景圖像,但不會吸引儀表。

CollectionView中有沒有一些技巧或什麼不同於「正常」視圖?

編輯:閱讀isOpaque後(MeteringView isOpaque = YES),意味着它不應該調用父視圖的drawRect如果設置爲yes。那麼適用於靜態視圖,那些MeteringViews不會調用父類drawRect,但是在CollectionView中卻可以。我不知道爲什麼。

編輯2:我給了這個話題的另一種稱謂,因爲isOpaque = YES在MeteringView停不叫家長的drawRect中的CollectionView,它正在開發一種普通視圖。有一些事情要知道嗎?我不得不停止重繪CollectionView Item,因爲那是問題所在。

在此先感謝球員

本傑明

回答

0

isOpaque只是提示系統。它不會阻止其他視圖繪製其內容,這隻意味着它有時可能會跳過讓其他視圖更新其內容。

如果您的視圖是不透明的,它應該將其自身描繪爲不透明並完全填充其邊界。

+0

告訴我更多關於我的情況:我有一個定時器獲取音頻電平並將其設置爲MeteringView,然後繪製儀表。 MeteringView不透明。但是,如果MeteringView是CollectionViewItem View的子視圖,它將調用CollectionViewItem的drawRect。我知道這是因爲Item的drawRect中的NSLog被定時器觸發。而且因爲在儀表本身後調用該項目的視圖,它將在儀表上再次繪製背景圖像,儀表僅在那裏。我不知道如何解決這個問題。 – bennibeef

+0

如果MeteringView是單元格的子視圖,則會先調用單元格的drawRect,然後調用MeteringView的drawRect。 –

+0

我剛剛測試過這個,CollectionViewItem首先被調用,然後是Meterings子視圖。那麼,有什麼方法可以防止這種情況發生?因爲我不想重畫Cell/Item,我認爲這也會影響性能。我只想重繪MeteringView中的代碼,但不是整個項目/單元格 – bennibeef