这似乎是一个微不足道的问题,但它一直困扰着我一段时间。
我有一个包含滚动视图的窗口。通常,滚动视图有一个垂直大于剪辑视图的 documentView,因此您可以获得一个垂直滚动条来查看滚动视图中的所有内容。
当我调整窗口大小时,我会重新计算滚动视图的 documentView 中内容的大小(因为滚动视图会变薄,这可能会使 documentView 的高度增加)。然而,一个副作用是,当调整窗口大小时,documentView 保持底部可见边缘与剪辑视图的底部边缘齐平(也就是说,它确保最后一行文本始终可见)。这是一个奇怪的效果,因为通常情况下,窗口保持文档视图的顶部可见边缘与剪辑视图的顶部边缘齐平(即,文档视图中最顶部的文本行仍然固定在顶部)。
所以,我最初想解决这个问题只是实现一个 windowDidResize: 或 windowWillResize:toSize: 通知,注意旧窗口框架的高度和新高度之间的增量,然后简单地滚动滚动视图以保持固定到顶部的滚动视图的顶行。
但是,由于某种原因,这似乎不起作用。它几乎可以工作,但一些调整大小的增量似乎偏离了一个像素,如果你足够快地调整窗口大小,它有时会偏离大约 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)];
[...]
}