Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 苹果电视UICollectionView边际漏洞_Objective C_Uicollectionview_Tvos - Fatal编程技术网

Objective c 苹果电视UICollectionView边际漏洞

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

我在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;
}
我有两个视图单元格。请查找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方法上重新定位代码。我检查了你的答案是否正确。非常感谢。