這似乎是一個這樣的小問題,但它讓我感到困惑了一段時間。在調整窗口大小的同時固定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)];
[...]
}
參見http://stackoverflow.com/questions/2384014/nsscrollview-scroll-downward-when-resizing – charles 2014-03-06 20:42:22