Apple TV UICollectionView 边距错误

Apple TV UICollectionView margin bug

我在 viewController 中有简单的集合视图。我已经用下面的代码配置了它。

- (void)viewDidLoad {
    [super viewDidLoad];

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
    layout.minimumInteritemSpacing = 0;
    layout.minimumLineSpacing = 0;
    layout.itemSize = CGSizeMake(372, 200);
    layout.scrollDirection = UIAccessibilityScrollDirectionDown;
    self.collection.collectionViewLayout = layout;

    [self.collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
    self.collection.dataSource = self;
    self.collection.delegate = self;
}

我有 2 个视图单元格。请找到 cellForItemAtIndexPath

的代码库
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 2;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.layer.borderWidth = 1;
    [cell setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];

    return cell;
}

当此代码运行时,它看起来像这样。

如果项目宽度更改为 373 并且超过它看起来像这样;

单元格间距必须为零但不会改变。有人知道这个错误吗?

这不是错误。对于 UICollectionViewFlowLayout 的实例,您设置了最小的行和项目空间,而不是精确值。如果您需要删除项目之间的空格,您可以减少 sectionInset of UICollectionViewFlowLayout。试试这个代码:

-(void)viewDidLayoutSubviews {

    [super viewDidLayoutSubviews];
    CGFloat leftMargin = 10.0;
    UICollectionViewFlowLayout* collectionViewLayout = (UICollectionViewFlowLayout*)self.collection.collectionViewLayout;
    CGFloat currentRowWidth = leftMargin;

    for (; currentRowWidth + collectionViewLayout.itemSize.width < self.collection.frame.size.width; currentRowWidth += collectionViewLayout.itemSize.width) {

    }
    CGFloat rightMargin = MAX(0.0, self.collection.frame.size.width - currentRowWidth);


    collectionViewLayout.sectionInset = UIEdgeInsetsMake(0, leftMargin, 0, rightMargin);
    [collectionViewLayout invalidateLayout];
}

SectionInset 不是项目间距。它是所有 UICollectionView 的 space。因此,在 viewDidLoad 之后计算所有项目 spaces 的所有项目宽度。

- (void)viewDidLoad {
    [super viewDidLoad];

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    layout.minimumInteritemSpacing = 5;
    layout.minimumLineSpacing = 0;
    layout.itemSize = CGSizeMake(200, 200);

    CGFloat itemWidth = layout.itemSize.width + layout.minimumInteritemSpacing;

    CGFloat allItemWitdh = itemWidth * (int)(_collection.frame.size.width / itemWidth);
    CGFloat rightMargin = _collection.frame.size.width - allItemWitdh;
    layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, rightMargin);

    layout.scrollDirection = UIAccessibilityScrollDirectionDown;
    self.collection.collectionViewLayout = layout;

    [self.collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
}