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