Objective c 苹果电视UICollectionView边际漏洞
我在viewController中有简单的集合视图。我已经用下面的代码配置了它Objective c 苹果电视UICollectionView边际漏洞,objective-c,uicollectionview,tvos,Objective C,Uicollectionview,Tvos,我在viewController中有简单的集合视图。我已经用下面的代码配置了它 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); layout.minimumInte
- (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;
}
我有两个视图单元格。请查找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
实例,您设置的是最小的行和项空间,而不是精确的值。如果需要删除项目之间的空格,可以减少UICollectionViewFlowLayout
的sectionInset
。请尝试以下代码:
-(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];
}
-(void)ViewDidLayoutSubView{
[超级视图布局子视图];
CGFloat leftMargin=10.0;
UICollectionViewFlowLayout*collectionViewLayout=(UICollectionViewFlowLayout*)self.collection.collectionViewLayout;
CGFloat currentRowWidth=左边距;
对于(;currentRowWidth+collectionViewLayout.itemSize.width
章节插图不是项目间距。它是所有UICollectionView的空间。因此,计算viewDidLoad上所有项目空间的所有项目宽度
- (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"];
}
谢谢,但这是虫子。因为,我定义了sectionInset,右边距值为零。还可以在viewDidLayoutSubviews上为每个子项重新设置它。它可以工作,但如果我想设置1像素的边距,必须覆盖viewDidLayoutSubviews。此外,viewDidLoad上的sectionInset定义毫无意义。@BeyazBaron是的,您已经将sectionInset设置为零,并且在屏幕截图上sectionInset为零(但行中的最后一项有更大的空间来满足您的要求)。如果你想在一行的开头有一些空白,你需要做更小的右空白,就这样。我将修改我的答案以显示它。我用你的答案准备了一个答案。我理解插入逻辑。但如果我设置项目宽度372px,一切正常,但设置373px默认项目边距显示。我想,是虫子。谢谢您所做的一切。@BeyazBaron这看起来像是一种未定义的行为。您确定_集合在viewDidLoad中的大小正确吗?如果动态创建约束或更改集合的框架,此代码将失败。这就是为什么我将代码添加到viewDidLayoutSubviews中,因为在这个函数中,所有子视图的大小都是正确的。请更新你的问题,我写的答案没有这个属性。@Roman Podymov,你的答案是正确的。我删除了代码中的itemCount属性,不想将其调整为collectionView。我只需要修改collectionView一次,因此只需在viewDidLoad方法上重新定位代码。我检查了你的答案是否正确。非常感谢。