我试图创建(类似于NSCollectionView)网格样式视图,不同的是使用核心动画。我很远,通过它,最后一个重大的事情剩下要做的就是实现滚动。

到目前为止我的设置是,我有一个子类NSView(层支持),并且在初始化时创建并添加的网格层作为主视图层的一个子层。我已经创建了该安排它的子视图以网格状形成在网格层的自定义CALayoutManager。如所预期的,当我添加子层到网格层,布局管理器被调用,这些层被自动定位。到现在为止,一切工作,因为它应该。

问题是当我尝试使用NSScrollView作为我的自定义视图来实现滚动的父母。我设置了如下:我创建了自定义的视图界面生成器中NSScrollView的子视图。然后,在我的布局管理器类,我添加了一个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

正如你所看到的,有没有问题,当滚动条是不可见的(换句话说,内容千篇一律的滚动视图的范围内高度时)。我可以证实,这是不是与布局管理器和处理单列的问题,因为我测试了同样的事情,而不滚动视图,并没有恐慌。

任何建议是不胜感激。

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top