macos - NSCollectionView,与组合布局左对齐
问题描述
我一直在尝试实现一个左对齐的标记列表(NSTextField 在一个盒子 NSBox 内)。
这就是我想要得到的:
我正在使用具有组合布局的 NSCollectionView 配置:
- ITEM,估计宽度(初始值 = 80)和固定高度 (16)
- GROUP,具有分数宽度(1.0,冰全宽度)和固定高度(16)项目将放置在部分内(上面示例中的“流派”和“组合艺术家”)
这个想法是,当项目获得它们的实际字段内容时,自动布局约束将自动计算框宽度并将项目一个接一个地放置,换行到一个新行以容纳更多项目。
应用数据快照时不会发生这种情况。
相反,我得到的是:
有趣的是,当我调整封闭窗口的大小时,就实现了所需的布局!!!
看起来像第一次使用估计的大小呈现集合视图。
示例代码:
////
- (void)configureLayout
{
float iWW = 80;
float iHH = 16;
////////////////////
// Item Definition
NSCollectionLayoutSize *itemSize = [NSCollectionLayoutSize sizeWithWidthDimension:[NSCollectionLayoutDimension estimatedDimension:iWW]
heightDimension:[NSCollectionLayoutDimension absoluteDimension:iHH]];
NSCollectionLayoutItem *item = [NSCollectionLayoutItem itemWithLayoutSize:itemSize];
////////////////////
// Group Definition
NSCollectionLayoutSize *groupSize = [NSCollectionLayoutSize sizeWithWidthDimension:[NSCollectionLayoutDimension fractionalWidthDimension:1.0]
heightDimension:[NSCollectionLayoutDimension estimatedDimension:iHH]];
NSCollectionLayoutGroup *group = [NSCollectionLayoutGroup horizontalGroupWithLayoutSize:groupSize subitems:@[item]];
group.interItemSpacing = [NSCollectionLayoutSpacing fixedSpacing:4.0];
////////////////////
// Section Definition
NSCollectionLayoutSection *section = [NSCollectionLayoutSection sectionWithGroup:group];
NSCollectionLayoutSize *headerSize = [NSCollectionLayoutSize sizeWithWidthDimension:[NSCollectionLayoutDimension fractionalWidthDimension:1.0]
heightDimension:[NSCollectionLayoutDimension absoluteDimension:22]];
NSCollectionLayoutBoundarySupplementaryItem *sectionHeader = [NSCollectionLayoutBoundarySupplementaryItem
boundarySupplementaryItemWithLayoutSize:headerSize
elementKind:sectionHeaderElementKind
alignment:NSRectAlignmentTop];
section.boundarySupplementaryItems = @[sectionHeader];
section.contentInsets = NSDirectionalEdgeInsetsMake(2, 0, 4, 10);
section.interGroupSpacing = 4.0;
////////////////////
// Prepare Layout
collectionView.collectionViewLayout = [[NSCollectionViewCompositionalLayout alloc]initWithSection:section];
}
解决方案
- 创建
NSCollectionViewDiffableDataSource+Private.h
(.m
文件不是必需的)
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSCollectionViewDiffableDataSource (Private)
- (void)applySnapshot:(NSDiffableDataSourceSnapshot *)snapshot animatingDifferences:(BOOL)animatingDifferences completion:(void(^ _Nullable)(void))completion;
@end
NS_ASSUME_NONNULL_END
- 在您的
applySnapshot:animatingDifferences:
代码上,替换为:
#import "NSCollectionViewDiffableDataSource+Private.h"
[self.dataSource applySnapshot:snapshot animatingDifferences:NO completion:^{
[self.collectionView.collectionViewLayout invalidateLayout];
}];
如果您想避免使用 Private 方法,请使用并调用观察NSCollectionView
框架。NSViewFrameDidChangeNotification
- [NSCollectionViewLayout invalidateLayout]
推荐阅读
- python - 如何将数据集转换为 glove 或 word2vec 格式?
- python - POST 400 错误请求 Django
- javascript - axios.post 在搜索栏中显示用户输入
- python-3.x - 使用加入与否?XML Python API
- python - 定位一个只有 'd' 属性和 selenium 的路径元素
- r - 如何将股票代码读入函数?
- c++ - C++ - 将二维数组传递给函数
- python - 使用json标签水平翻转数据集中图像的简单方法?
- php - 使用数据表时,具有一列复选框的表格显示被隐藏
- amazon-ecs - 如何从 Docker 实例内部将多个日志流式传输到 AWS CloudWatch?