2010-11-19 32 views
3

我试图创建一个网格样式视图(类似于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]; 
} 

这很简单,它只是检查,看看新的高度是否大于滚动视图的内容大小,并设置视图框架上,新的高度。

这在一定程度上起作用。当视图调整大小时,它会正确调整视图的框架大小,因为它应该封装内容的整个高度,从而使滚动条出现。问题:当视图的滚动条可见时调整大小时,网格层抖动的子层。下面是显示问题视频:

http://vimeo.com/16987653

正如你所看到的,有没有问题,当滚动条是不可见的(换句话说,当内容的高度的范围内配合滚动视图)。我可以确认这不是布局管理器和处理单列的问题,因为我在没有滚动视图的情况下测试了相同的东西,并且没有抖动。

任何意见非常感谢。

回答

1

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

+8

你能提供一个你如何实际做到的例子吗? – 2012-04-29 06:44:16