[英]NSCell redrawing issues
我正在創建一個NSCell
子類,該子類將一些對象直接繪制到視圖上(使用drawInRect:fromRect:operation:fraction:respectFlipped:hints:
,還可以使用NSView的addSubview:
選擇器簡單地繪制NSButton
實例。
雖然使用第一種方法繪制的對象都具有正確性,但是我在正確繪制NSButton
遇到問題。 問題是我的NSButton
實例將在正確的位置繪制,但是繪制了多次。
我已經在互聯網上研究了一段時間,有些人建議使用緩存,但是我不確定這是否有效。 (因為包含大量數據,所以使用for循環訪問包含按鈕的數組肯定會導致緩慢的滾動...)
你會怎么做? 我在樹上叫錯了嗎?
這是相關代碼:
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
NSRect _controlRect = cellFrame;
float _Y = cellFrame.origin.y;
NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);
_switch = [self _choiceSwitch];
[_switch setFrame:_accessoryRect];
[controlView addSubview:_switch];
}
長話短說 : 繪制時,朋友不要讓朋友addSubview
。
這是管理控制界面的一個基本的但不是特別解釋的方面,但是必須牢記。
讓您的控制器決定子視圖的“順序”,您就可以睡一覺,知道該按鈕不應該被公然嘲笑(如果在您的自定義繪圖例程中被擠作一團,情況並非如此)。
很容易陷入這個小巷, 原因是,嘿,我在initWithFrame
添加了一個NSImageView
,一切似乎都還不錯 ……但是,這大概不是您應該怎么做的 ,我想……當您開始子類化NSControl等,是當您開始意識到原因的時候。
更新: 這是關於設計自定義控件的非常好的文章 ,其中附加了同樣出色的示例項目 -體現了可以幫助避免此類問題的代碼組織類型。 例如,您將在控制器類中注意到他如何使每個按鈕保持獨立,唯一且獨立於其他視圖的業務……
for (int butts = 0; butts < 3; butts++) {
NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
[mainView addSubview:butt];
}
每次繪制單元格本身時,通過將其實例添加到視圖層次結構中來“繪制” NSButton
絕對不是一個好主意。 而是創建一個NSButtonCell並根據您的喜好進行配置。 然后,在-[NSCell drawInteriorWithFrame:inView:]
使用單元格ivar繪制其外觀。
如果希望在表視圖的每個單元格中都有一個可單擊的NSButton
實例,請盡量避免調用addSubview:
每次您執行此操作時,控件視圖都可能使其布局無效,並從頭開始重新繪制所有內容,從而在您的情況下進行某種遞歸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.