簡體   English   中英

NSCell重繪問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM