首页 > 解决方案 > NSCollectionView,与组合布局左对齐

问题描述

我一直在尝试实现一个左对齐的标记列表(NSTextField 在一个盒子 NSBox 内)。

这就是我想要得到的:

在此处输入图像描述

我正在使用具有组合布局的 NSCollectionView 配置:

这个想法是,当项目获得它们的实际字段内容时,自动布局约束将自动计算框宽度并将项目一个接一个地放置,换行到一个新行以容纳更多项目。

应用数据快照时不会发生这种情况。

相反,我得到的是:

在此处输入图像描述

有趣的是,当我调整封闭窗口的大小时,就实现了所需的布局!!!

看起来像第一次使用估计的大小呈现集合视图。

示例代码:

////

- (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];
}

标签: macosnscollectionview

解决方案


  1. 创建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
  1. 在您的applySnapshot:animatingDifferences:代码上,替换为:
#import "NSCollectionViewDiffableDataSource+Private.h"

[self.dataSource applySnapshot:snapshot animatingDifferences:NO completion:^{
    [self.collectionView.collectionViewLayout invalidateLayout];
}];

如果您想避免使用 Private 方法,请使用并调用观察NSCollectionView框架。NSViewFrameDidChangeNotification- [NSCollectionViewLayout invalidateLayout]


推荐阅读