如何在NSCollectionView获取或丢失项目时调整包含窗口/视图的大小?

时间:2014-10-06 16:42:29

标签: macos cocoa nscollectionview

在我的OSX应用程序中,我有一个NSCollectionView。当我添加的项目超出视图所能容纳的数量时,视图和窗口不会自动调整大小以适合所有内容。

我怎样才能实现?

例如:我有一个可以容纳5个项目的视图。我再添加3个项目,视图将扩展到右侧/底部,将这3个新项目添加到右侧/第二行。

非常感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:2)

此处没有内置支持。部分原因在您的问题中暗示:

  

...视图将扩展到右/底部,将这3个新项目添加到右侧/第二行

嗯,它应该/应该做什么,向右延伸或向下延伸?没有正确的答案,因此集合视图无法自行决定。

基本上,当您添加或删除项目时,您需要计算集合视图的所需大小,并调整包含视图和/或窗口的大小以适应它。

计算结果如下:

// This part only need to be done once
NSCollectionViewItem* collectionViewItem = [[[NSCollectionViewItem alloc] initWithNibName:@"IconViewItem" bundle:nil] autorelease];
NSSize itemSize = collectionViewItem.view.frame.size;

NSUInteger count = collectionView.content.count;
NSUInteger itemsPerRow;
if (count * itemSize.width < maximumDesiredWidth)
    itemsPerRow = count;
else
{
    itemsPerRow = floor(maximumDesiredWidth / itemSize.width);
    if (itemsPerRow == 0)
        itemsPerRow = 1;
}
NSUInteger rowsNeeded = (count + itemsPerRow - 1) / itemsPerRow;
if (!rowsNeeded)
    rowsNeeded = 1;
NSSize collectionViewSize = NSMakeSize(itemsPerRow * itemSize.width, rowsNeeded * itemSize.height);

NSSize scrollViewSize = [NSScrollView frameSizeForContentSize:collectionViewSize
                                      horizontalScrollerClass:nil
                                        verticalScrollerClass:nil
                                                   borderType:collectionView.enclosingScrollView.borderType
                                                  controlSize:NSRegularControlSize
                                                scrollerStyle:collectionView.enclosingScrollView.scrollerStyle];

现在您需要调整滚动视图的大小以适应集合视图。您可能需要调整任何包含视图和窗口的大小。如何操作取决于您是否使用自动布局。如果您使用自动布局,则还取决于您如何设置约束。

如果可能足以计算scrollViewSizecollectionView.enclosingScrollView.frame.size之间的差异,并将窗口大小调整相同的数量。通常,您也可以调整窗口的原点,以使窗口顶部保持在同一位置。也就是说,如果你将 N 添加到窗口的高度,你也可以从原点的Y坐标中减去 N