2010-07-15 65 views
2

我想要繼承NSScroller以繪製我自己的滾動旋鈕。要做到這一點,我已經subclassex NSScrollView和usex下面的代碼實例化了我的自定義NSScrollers:自定義NSScroller問題

- (void)awakeFromNib; 
{ 
    NSRect horizontalScrollerFrame = [[self horizontalScroller] frame]; 
    NSRect verticalScrollerFrame = [[self verticalScroller] frame]; 
    NSString *scrollBarVariant = [[[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain] valueForKey:@"AppleScrollBarVariant"]; 

    if (![scrollBarVariant isEqualToString:@"DoubleBoth"]) { 
     [self setVerticalScroller:[[[TRScroller alloc] initWithFrame:verticalScrollerFrame] autorelease]]; 
     [self setHorizontalScroller:[[[TRScroller alloc] initWithFrame:horizontalScrollerFrame] autorelease]]; 
    } 
} 

這個工作和我的NSScrollers正確顯示。但我偶爾會在首次加載我的應用程序時看到渲染問題。在界面生成器內,我已經設置了一些NSScrollViews,並將它們的滾動條設置爲自動隱藏。我看到的問題是,當應用程序第一次加載時,滾動條背景會在NSScrollViews內容中呈現。

alt text http://www.freeimagehosting.net/uploads/1d3fc75db8.png

我相信這是因爲我實例我NSScroll子類(TRSubclass)通過awakeFromNib,這意味着滾動條給出的NSScrollView的框架之前,它會自動調整大小以適應窗口保存的位置和大小(換句話說,它使用Interface Builder中默認分配的框架)。最好的解決辦法是什麼?

我試過迫使NSScrollView重新顯示(使用setNeedsDisplay:並顯示:)但沒有運氣。有沒有人遇到類似的問題?

回答

2

我在我的應用程序中使用了相同的模式,並且我很努力地解決了這個問題。我使用相同的技巧:在[scrollView awakeFromNib]方法中用滾動條代替,但目前我沒有遇到這種渲染問題。你可以試着玩「畫背景的」 NSScrollView的屬性 - 它確實有助於有時

- (void)changeSubs 
{ 
    // change clip view 
    // ... 

    // change scrollers 
    NSRect horizontalScrollerFrame = [[self horizontalScroller] frame]; 
    NSRect verticalScrollerFrame = [[self verticalScroller] frame]; 
    if (![[self verticalScroller] isKindOfClass:[CRScroller class]]) 
     [self setVerticalScroller:[[[CRScroller alloc] initWithFrame:verticalScrollerFrame] autorelease]]; 
    if (![[self horizontalScroller] isKindOfClass:[CRScroller class]]) 
     [self setHorizontalScroller:[[[CRScroller alloc] initWithFrame:horizontalScrollerFrame] autorelease]]; 
} 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
    [self changeSubs]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    NSKeyedUnarchiver* unpacker = (id)aDecoder; 
    [unpacker setClass:[CRClipView class] forClassName:[NSClipView className]]; 
    [unpacker setClass:[CRScroller class] forClassName:[NSScroller className]]; 

    self = [super initWithCoder:aDecoder]; 
    if (self) 
    { 
    } 
    return self; 
} 

- (void)awakeFromNib 
{ 
    [self changeSubs]; 
} 

有一些技巧在這裏,他們的工作取決於NSScrollView創建方式。 'isKindOfClass'檢查有助於避免雙重交換。

+0

不幸的是,關閉我的NSScrollViews中的「繪製背景」沒有任何效果。無論如何,我都會對看到你的代碼感興趣。 – ndg 2010-07-15 14:33:41

+0

我編輯了我的帖子,查看代碼。至於「繪製背景」選項 - 它應該打開。它也很重要的背景顏色設置,你有沒有改變滾動視圖內的NSClipView實例(實際上它是呈現背景的剪輯視圖)等 – Gobra 2010-07-15 14:56:50