2011-12-31 11 views
3

私はココアウィンドウを持っています。そのコンテンツビューには、固定サイズのNSViewを含むNSScrollViewが含まれています。 NSScrollViewスクロールバーの長さが間違っています

は、プログラムを起動すると、スクロールバーが最初に表示されるコンテンツのサイズが、それが実際よりもはるかに大きかったかのように、小さすぎます:

enter image description here

私は、例えば、垂直で再生を開始

enter image description here

:スクロールバーは、上で元の位置に戻すことをもたらす、それが(スクロールビューおよびコンテンツビューのサイズの比に相当する)、その予想されたサイズにリサイズされます210

(横のバーにはまだ間違ったサイズがあります。私はそれを使って遊び、一番左の位置に戻すと正しいサイズにリサイズされます。)

+1

スクロールビューの['contentSize'](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSScrollView_Class/Reference/Reference.html#)を印刷してチェックしてください。 // apple_ref/occ/instm/NSScrollView/contentSize)の四角形をタッチします。 –

+2

詳細については、ください。どのように/カスタムビューをスクロールビューに提供していますか(Interface Builderの場合、または実行時に設定しますか) Michaelが尋ねるように、すべてのサイズは何ですか(-contentSizeだけでなくカスタムビューのフレームも何ですか)。 –

+0

@JoshuaすべてがInterface Builderで設定され、カスタムコードはありません。 –

答えて

2

同じ問題が発生しましたが、私はどこでも検索しましたが、誰もこの問題を経験していないようです。幸いにも、私は問題を解決するハックを見つけました。

私が気付いたことは、ウィンドウのサイズを変更したり最大化したりすると、スクロールバーが予想されるサイズにサイズ変更されることでした(自動サイズ調整が有効になっている必要があります)。これは、ウィンドウのサイズが変更されると、スクロールバーとスクロールバーの長さが再計算され、正しく計算されるためです。おそらくいくつかのバグのため、スクロールバーの長さは初期化時に正しく計算されません。とにかく問題を解決するには、アプリケーションデリゲートでウィンドウへのコンセントを作成します。 "applicationDidFinishLaunching"メソッドをオーバーライドし、ウィンドウ内の現在のNSRectを返すウィンドウコンセントのメソッド "frame"を呼び出します。返された値を使用して、size.widthとsize.heightに1を加えます。メソッドsetFrameを呼び出し、displayをYESに設定します。これにより、ウィンドウのサイズが変更され、スクロールバーのサイズが強制的に再計算されます。ここで

は、行の折り返しを切り替えるには、NSTextView textContainerサイズを変更するとき、私はこの問題に遭遇し

(void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 

    // Get the current rect 
    NSRect windowRect = [_window frame];` 

    // add one to the width and height to resize window 
    windowRect.size.width += 1; 
    windowRect.size.height += 1; 

    // resize window with display:YES to redraw window subviews 
    [_window setFrame:windowSize display:YES]; 

} 
+0

私はLionで同じ問題を抱えていましたが、上記のコードはそれを修正しました。 –

1

下applicationDidFinishLaunchingためのコードです。囲むビューのサイズを変更すると、正しいスクロールビューの高さが使用されますが、残酷な解決方法です。

NSScrollViewは-reflectScrolledClipViewをサポートしています。

[textScrollView performSelector:@selector(reflectScrolledClipView:) withObject:textScrollView.contentView afterDelay:0]; 

スクロール位置が正確であるが、スクロールの再描画があります:私の場合はこれを直接呼び出すと、実行ループに遅れたときを除いては効果がなかったです。したがって、描画時にビュージオメトリの一部が計算されているかのように見えます。よりよい解決策は、したがって、次のとおりです。

NSDisableScreenUpdates(); 
[textScrollView display]; 
[textScrollView reflectScrolledClipView:textScrollView.contentView]; 
[textScrollView display]; 
NSEnableScreenUpdates(); 
0

ビルjstuxxからの回答に上記の、あなたは目に見えてサイズを変更するウィンドウをしたくない場合は、試してみてください。

NSRect windowRect = [[[self view] window] frame]; 
windowRect.size.width += 1; 
windowRect.size.height += 1; 
[[[self view] window] setFrame:windowRect display:YES]; 
windowRect.size.width -= 1; 
windowRect.size.height -= 1; 
[[[self view] window] setFrame:windowRect display:YES]; 

私は後にこのコードを入れていました私はプログラムでスクロールビューを自分のインターフェースに追加していました。

関連する問題