在我的OSX应用程序中,我有一个NSCollectionView。当我添加的项目超出视图所能容纳的数量时,视图和窗口不会自动调整大小以适合所有内容。
我怎样才能实现?
例如:我有一个可以容纳5个项目的视图。我再添加3个项目,视图将扩展到右侧/底部,将这3个新项目添加到右侧/第二行。
非常感谢任何形式的帮助。
答案 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];
现在您需要调整滚动视图的大小以适应集合视图。您可能需要调整任何包含视图和窗口的大小。如何操作取决于您是否使用自动布局。如果您使用自动布局,则还取决于您如何设置约束。
如果可能足以计算scrollViewSize
和collectionView.enclosingScrollView.frame.size
之间的差异,并将窗口大小调整相同的数量。通常,您也可以调整窗口的原点,以使窗口顶部保持在同一位置。也就是说,如果你将 N 添加到窗口的高度,你也可以从原点的Y坐标中减去 N 。