2011-12-31 108 views
3

我有一個Cocoa窗口,其內容視圖包含一個NSScrollView,它包含一個固定大小的NSView。NSScrollView滾動條的長度不正確

一旦啓動程序,滾動條顯示的最初是太小了,因爲如果內容大小是遠遠大於它實際上是:

enter image description here

當我開始用,例如,垂直打滾動條,並把它返回到在頂部的初始位置時,它被調整到它的預期大小(其對應於滾動視圖和內容視圖的尺寸之比):

enter image description here

(注意水平條,它仍然有不正確的大小。如果我再玩它,並將其帶回到其最左邊的位置,它將被調整到正確的大小。)

+1

您應該打印出並檢查您的滾動視圖的['contentSize'](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSScrollView_Class/Reference/Reference.html# // apple_ref/occ/instm/NSScrollView/contentSize)矩形之前和之後觸摸它。 – 2011-12-31 17:54:05

+2

請提供更多信息。如何/何時將自定義視圖提供給滾動視圖(在Interface Builder中,或者您是否在運行時設置它)?正如邁克爾所問,什麼尺寸就是一切(不僅僅是-contentSize,而且你的自定義視圖的框架也是如此)? – 2011-12-31 18:00:16

+0

@Joshua一切都是在Interface Builder中設置的,沒有自定義代碼。 – 2012-01-01 08:22:24

回答

2

我也遇到了同樣的問題,我到處搜索,但似乎沒有人遇到過這個問題。幸運的是,我發現瞭解決問題的黑客攻擊。

我的確注意到,當窗口被調整大小或最大化時,滾動條調整爲預期大小(必須啓用自動調整大小)。這是因爲當窗口調整大小時,滾動視圖和滾動條的長度會被重新計算並正確計算。可能由於一些錯誤,滾動條長度在初始化時不能正確計算。無論如何要解決這個問題,在你的應用程序委託中創建一個窗口。覆蓋「applicationDidFinishLaunching」方法,並在窗口中調用方法「frame」,該方法返回窗口的當前NSRect。使用返回的值爲size.width和size.height添加一個值。調用顯示設置爲YES的方法setFrame。這將調整窗口大小並強制重新計算滾動條的大小。

這裏是下面

(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上遇到了同樣的問題,上面的代碼糾正了它。 – 2012-08-03 19:15:14

1

爲的applicationDidFinishLaunching代碼修改NSTextView textContainer大小切換自動換行,當我遇到過這個問題。調整封閉視圖的大小會導致使用正確的滾動視圖高度,但這是一個殘酷的解決方案。

NSScrollView支持-reflectScrolledClipView。直接在我的情況下調用這個已經當上了runloop延遲除了沒有影響:

[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]; 

我不得不把那裏後這段代碼我以編程方式將滾動視圖添加到我的界面。