2010-07-28 30 views
4

這似乎是一個這樣的小問題,但它讓我感到困惑了一段時間。在調整窗口大小的同時固定NSScrollView的文檔視圖

我有一個包含滾動視圖的窗口。通常,滾動視圖具有垂直大於剪輯視圖的documentView,因此您可以使用垂直滾動器查看滾動視圖內的所有內容。

當我調整窗口大小時,我重新計算了滾動視圖的documentView中內容的大小(因爲滾動視圖可以變得更薄,這可能使得documentView在高度上增長是必需的)。然而,副作用是,在調整窗口大小時,documentView保持底部可見邊緣與剪輯視圖底部邊緣齊平(即確保最後一行文本始終可見)。這是一種奇怪的效果,因爲通常情況下,窗口將文檔視圖的頂部可見邊緣與剪輯視圖的頂部邊緣保持齊平(即文檔視圖中最上面一行文本保持固定在頂部)。

所以,我最初想到解決這個問題只是爲了實現一個windowDidResize:或windowWillResize:toSize:notification,注意舊窗口框架的高度和新高度之間的增量,然後簡單地滾動滾動視圖以保持滾動視圖的第一行固定在頂部。

但是,由於某種原因,這似乎不起作用。它幾乎的作品,但一些調整大小的三角洲似乎是一個像素關閉,如果你調整窗口的速度足夠快,它有時約10個像素關閉。所以效果是,滾動視圖的第一行是,幾乎被固定到頂部,但不完全是,並且令人分心。

有沒有更好的方法來做到這一點?以下是相關的代碼:

- (void)windowDidResize:(NSNotification *)notification; 
{ 
    if ([notification object] == mainWindow) { 
     CGFloat currentWindowHeight = [mainWindow frame].size.height; 

     // previousWindowHeight is an ivar 
     NSNumber *heightDeltaNum = [NSNumber numberWithFloat:(currentWindowHeight - previousWindowHeight)]; 
     previousWindowHeight = currentWindowHeight; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"AFSnapScrollView" object:heightDeltaNum]; 
    } 
} 

- (void)snapScrollViewNotification:(NSNotification *)theNotification; 
{ 
    [self snapScrollView]; 

    NSNumber *heightDeltaNum = [theNotification object]; 

    CGFloat newY = [[tagScrollView documentView] visibleRect].origin.y - [heightDeltaNum floatValue]; 
    NSPoint pointToScroll = NSMakePoint(0,newY); 
    [[tagScrollView documentView] scrollPoint:pointToScroll]; 
} 

- (void)snapScrollView; 
{ 

    [...] 

    // adjust the view frame 
    [[tagScrollView documentView] setFrame:NSMakeRect(0, 0, existingDocumentFrame.size.width, newDocumentViewHeight)]; 

    [...] 

} 
+0

參見http://stackoverflow.com/questions/2384014/nsscrollview-scroll-downward-when-resizing – charles 2014-03-06 20:42:22

回答

10

您的文檔視圖需要覆蓋 - (BOOL)isFlipped方法並返回YES。

+0

嗯,不知道的滾動視圖受影響的行爲。完美的工作,正是我想要的(一旦我修改snapScrollView方法的一部分來調整翻轉的座標)。非常感謝! – 2010-07-30 05:39:28

0

車削clipview不需要修改documentView,翻轉後坐標。

@interface FlippedClipView : NSClipView 
@end 

@implementation FlippedClipView 
- (BOOL)isFlipped 
{ 
    return YES; 
} 
@end 
相關問題