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"];
}
我在 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"];
}