我有一个集合视图,它可以水平滚动并跨越其父视图的整个宽度。实现此页面调度的最便宜的方法是将单元格宽度设置为等于集合视图宽度的1/3,并设置与左右内容插图相同的宽度。

我禁用了IB中的滚动功能,并替换为左右滑动识别器。我的代码几乎不需要设置contentInset就可以工作,但是设置contentInset似乎可以防止任何滚动

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGFloat itemWidth = self.collectionView.bounds.size.width/3.0;
    NSInteger count = [self collectionView:self.collectionView numberOfItemsInSection:0];
    self.collectionView.contentSize = (CGSize){ .width=itemWidth*count, .height=self.collectionView.bounds.size.height };
    // uncomment this line, and the scroll code in the swipes below fails to work
    //self.collectionView.contentInset = UIEdgeInsetsMake(0, itemWidth, 0, itemWidth);
    self.collectionView.contentOffset = (CGPoint){ .x=self.collectionView.contentSize.width/2.0, .y=0 };
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat width = self.view.bounds.size.width/3.0;
    return (CGSize){ .width=width, .height=collectionView.bounds.size.height };
}

这段代码可以处理滑动...
- (NSIndexPath *)centerIndexPath {
    CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
    CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
    return [self.collectionView indexPathForItemAtPoint:visiblePoint];
}

- (void)swipeLeft:(UISwipeGestureRecognizer *)gr {
    NSIndexPath *centerIndexPath = [self centerIndexPath];
    NSLog(@"at %@", centerIndexPath);

    if (centerIndexPath.row < [self collectionView:self.collectionView numberOfItemsInSection:0]-1) {
        [self.collectionView scrollToItemAtIndexPath:centerIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];
    }
}

- (void)swipeRight:(UISwipeGestureRecognizer *)gr {
    NSIndexPath *centerIndexPath = [self centerIndexPath];
    NSLog(@"at %@", centerIndexPath);

    if (centerIndexPath.row > 0) {
        [self.collectionView scrollToItemAtIndexPath:centerIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:YES];
    }
}

所有这些都有效,除了我在上面的设置中设置contentInsets时。然后,即使我到达调试器中的scrollToItemAtIndexPath:代码,也不会发生滚动。

具有这些插图很重要,因为我希望用户了解中心项目是所选项目。

有人可以解释为什么contentInset破坏滚动以及如何解决吗?

最佳答案

看起来UICollectionView有它自己的内置方法来处理插图:

https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html#//apple_ref/doc/uid/TP40012334-CH3-SW1

使用节插图调整内容的边距
截面插图是一种用于调整可用于布置单元格的空间的方法。您可以使用inset在节的页眉视图之后和页脚视图之前插入空格。您还可以使用插图在内容的两侧插入空格。图3-5演示了插图如何影响垂直滚动流布局中的某些内容。

图3-5截面插图更改了用于布置单元的可用空间

ios - 设置contentInset后,UICollectionView不滚动-LMLPHP

10-06 05:16
查看更多