gpt4 book ai didi

cocoa - 将 NSScrollView 与 CALayer 结合使用

转载 作者:行者123 更新时间:2023-12-03 16:21:45 24 4
gpt4 key购买 nike

我正在尝试创建一个网格样式 View (类似于 NSCollectionView),但使用 Core Animation 除外。我已经完成了相当多的工作,剩下要做的最后一件事就是实现滚动。

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

当我尝试使用 NSScrollView 作为自定义 View 的父级来实现滚动时,问题就出现了。我的设置如下:我在 Interface Builder 中创建了自定义 View 作为 NSScrollView 的 subview 。然后,在我的布局管理器类中,我添加了一个 delegate 属性,并且在初始化期间,我的 View 子类将自身设置为布局管理器的委托(delegate)。在布局管理器的 layoutSublayersForLayer: 方法的末尾,我使用委托(delegate)方法 layoutManager:contentHeightChanged: 调用其委托(delegate)。以下是该方法在我的 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];
}

非常简单,它只是检查新的高度是否大于 ScrollView 的内容大小,并用新的高度设置 View 框架。

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

<强> http://vimeo.com/16987653

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

非常感谢任何建议。

最佳答案

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

关于cocoa - 将 NSScrollView 与 CALayer 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4222158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com