使用NSScrollView与CALayer的
-
26-09-2019 - |
题
我试图创建(类似于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 强>
正如你所看到的,有没有问题,当滚动条是不可见的(换句话说,内容千篇一律的滚动视图的范围内高度时)。我可以证实,这是不是与布局管理器和处理单列的问题,因为我测试了同样的事情,而不滚动视图,并没有恐慌。
任何建议是不胜感激。
解决方案
通过翻转层和视图(在原点左上角)二者的坐标系统解决了这个问题。