我正在尝试创建一个网格样式视图(类似于NSCollectionView
),但使用 Core Animation 除外。我已经完成了很远,最后要做的主要事情是实现滚动。
到目前为止,我的设置是我有一个NSView
子类(支持层),并在初始化时创建并添加网格层作为主视图层的子层。我CALayoutManager
为网格层创建了一个自定义,它以网格状的形式排列其子视图。正如预期的那样,当我将子图层添加到网格图层时,会调用布局管理器并自动定位图层。到目前为止,一切正常。
当我尝试使用 anNSScrollView
作为自定义视图的父级来实现滚动时,问题就来了。我将其设置如下:我将自定义视图创建为NSScrollView
Interface 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];
}
这很简单,它只是检查新高度是否大于滚动视图的内容大小,并将视图框架设置为新高度。
这在一定程度上有效。当视图调整大小时,它会适当地调整视图框架的大小,以封装内容的整个高度,从而使滚动条出现。问题:当视图调整大小且滚动条可见时,网格层的子层会抖动。这是一个显示问题的视频:
如您所见,当滚动条不可见时(换句话说,当内容的高度适合滚动视图的边界时)没有问题。我可以确认这不是布局管理器和处理单列的问题,因为我在没有滚动视图的情况下测试了相同的东西并且没有抖动。
任何意见是极大的赞赏。