我试图创建一个网格样式视图(类似于NSCollectionView
),除了使用核心动画。我非常了解它,最后要做的最重要的事情就是实现滚动。使用NSScrollView与CALayer
我到目前为止的设置是我有一个NSView
子类(支持层),初始化时创建并添加网格层作为主视图层的子图层。我为网格层创建了一个自定义的CALayoutManager
,它将子视图排列成网格状。正如所料,当我将子图层添加到网格图层时,会调用布局管理器并自动定位图层。到目前为止,所有事情都应该如此。
当我尝试使用NSScrollView
作为自定义视图的父级来实现滚动时,问题出现了。我按如下设置:我在Interface Builder中将我的自定义视图创建为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];
}
这很简单,它只是检查,看看新的高度是否大于滚动视图的内容大小,并设置视图框架上,新的高度。
这在一定程度上起作用。当视图调整大小时,它会正确调整视图的框架大小,因为它应该封装内容的整个高度,从而使滚动条出现。问题:当视图的滚动条可见时调整大小时,网格层抖动的子层。下面是显示问题视频:
正如你所看到的,有没有问题,当滚动条是不可见的(换句话说,当内容的高度的范围内配合滚动视图)。我可以确认这不是布局管理器和处理单列的问题,因为我在没有滚动视图的情况下测试了相同的东西,并且没有抖动。
任何意见非常感谢。
你能提供一个你如何实际做到的例子吗? – 2012-04-29 06:44:16