3

我正在尝试创建一个网格样式视图(类似于NSCollectionView),但使用 Core Animation 除外。我已经完成了很远,最后要做的主要事情是实现滚动。

到目前为止,我的设置是我有一个NSView子类(支持层),并在初始化时创建并添加网格层作为主视图层的子层。我CALayoutManager为网格层创建了一个自定义,它以网格状的形式排列其子视图。正如预期的那样,当我将子图层添加到网格图层时,会调用布局管理器并自动定位图层。到目前为止,一切正常。

当我尝试使用 anNSScrollView作为自定义视图的父级来实现滚动时,问题就来了。我将其设置如下:我将自定义视图创建为NSScrollViewInterface Builder 中的子视图。然后,在我的布局管理器类中,我添加了一个delegate属性,并且在初始化期间,我的视图子类将自己设置为布局管理器的委托。在布局管理器的方法结束时layoutSublayersForLayer:,我使用委托方法调用它的委托layoutManager:contentHeightChanged:。这是我的NSView子类中该方法的实现:

- (void)layoutManager:(MyLayoutManager*)manager contentHeightChanged:(CGFloat)height;
{
    CGFloat newHeight = [[self enclosingScrollView] contentSize].height;
    if (height > newHeight) {
        newHeight = height;
    }
    NSRect newFrame = [self frame];
    newFrame.size.height = newHeight;
    [self setFrame:newFrame];
}

这很简单,它只是检查新高度是否大于滚动视图的内容大小,并将视图框架设置为新高度。

这在一定程度上有效。当视图调整大小时,它会适当地调整视图框架的大小,以封装内容的整个高度,从而使滚动条出现。问题:当视图调整大小且滚动条可见时,网格层的子层会抖动。这是一个显示问题的视频:

http://vimeo.com/16987653

如您所见,当滚动条不可见时(换句话说,当内容的高度适合滚动视图的边界时)没有问题。我可以确认这不是布局管理器和处理单列的问题,因为我在没有滚动视图的情况下测试了相同的东西并且没有抖动。

任何意见是极大的赞赏。

4

1 回答 1

1

通过翻转图层和视图的坐标系(原点在左上角)解决了这个问题。

于 2010-11-19T23:48:38.640 回答