4

这似乎是一个微不足道的问题,但它一直困扰着我一段时间。

我有一个包含滚动视图的窗口。通常,滚动视图有一个垂直大于剪辑视图的 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)];

    [...]

}
4

3 回答 3

10

您的文档视图需要覆盖 -(BOOL)isFlipped 方法并返回 YES。

于 2010-07-28T10:17:34.843 回答
1

翻转clipview不需要修改documentView,翻转坐标后。

@interface FlippedClipView : NSClipView 
@end

@implementation FlippedClipView
- (BOOL)isFlipped
{
    return YES;
}
@end
于 2014-01-08T13:13:56.750 回答
0

我发现如果我将 contentInsets 添加到我的滚动视图中,调整大小末尾的偏移设置会因底部插图的大小而关闭。非常令人沮丧。

我在自定义 NSScrollView 中使用以下内容对其进行了修复。

    var lastOffset = NSPoint.zero

    override func viewWillStartLiveResize() {
        lastOffset = documentVisibleRect.origin
    }

    override func viewDidEndLiveResize() {
        documentView?.scroll(lastOffset)
    }

如果您有在 scrollView 调整大小时调整大小的 documentView,则需要在设置它们时进行偏移计算。您需要在实时调整大小调用之间的每个 layout() 调用之后设置偏移量,以保持移动平滑。

于 2019-02-01T14:21:20.590 回答