独自のスクローラー ノブを描画するために、NSScroller をサブクラス化しようとしています。これを行うには、NSScrollView をサブクラス化し、次のコードを使用してカスタム NSScrollers をインスタンス化します。
- (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 は正しく表示されます。しかし、アプリケーションを最初にロードする際にレンダリングの問題が発生することがあります。Interface Builder 内で、スクロールバーが自動的に非表示になるように設定された多数の NSScrollView をレイアウトしました。私が見ている問題は、アプリケーションが最初に読み込まれるときに、スクロールバーの背景が NSScrollViews コンテンツ全体にレンダリングされることです。
代替テキスト http://www.freeimagehosting.net/uploads/1d3fc75db8.png
これは、awakeFromNib を介して NSScroll サブクラス (TRSubclass) をインスタンス化するためだと思います。つまり、スクロールバーには、ウィンドウの保存場所とサイズに合わせて自動的にサイズ変更される前に、NSScrollView のフレームが与えられます (つまり、フレームを使用しています)。 Interface Builder 内でデフォルトで割り当てられます)。これを回避する最善の方法は何ですか?
NSScrollView を (setNeedsDisplay: と display: を使用して) 強制的に再表示しようとしましたが、うまくいきませんでした。他の誰かが同様の問題に遭遇しましたか?