菜鸟教程小白 发表于 2022-12-12 15:31:10

ios - UICollectionView 的分页以在屏幕上显示一个完整单元格和两个部分单元格


                                            <p><p>我以这样一种方式使用 UICollectionView,即 Collection View 单元格将位于屏幕中心,左右单元格部分可见。感染,UICollectionView 宽度等于屏幕宽度,单元格宽度更小,因此左右单元格应该部分可见。
为了启用分页,我实现了将中心单元格设置在屏幕中心的自定义代码。现在它产生了一些问题;我想获得任何默认方式来避免导致问题的自定义实现。</p>

<p>我想以这样一种方式启用分页,以便我可以实现下图中描述的行为。</p>

<p>如果我禁用自定义实现并启用默认分页,则会部分显示两个单元格,但它不是我想要的预期行为。</p>

<p> <img src="/image/R1CD4.png" alt="enter image description here"/> </p>

<p>谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>据我所知,“默认”你不能这样做,你需要自定义你的collectionView。我实现这一点的方法是继承 collectionView 的流布局并像这样实现以下方法:</p>

<pre><code>- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
    CGFloat offSetAdjustment = MAXFLOAT;
    CGFloat horizontalCenter = (CGFloat) (proposedContentOffset.x + (self.collectionView.bounds.size.width / 2.0));

    CGRect targetRect = CGRectMake(proposedContentOffset.x, 0.0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);

    NSArray *array = ;

    UICollectionViewLayoutAttributes *currentAttributes;

    for (UICollectionViewLayoutAttributes *layoutAttributes in array)
    {
      if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell)
      {
            CGFloat itemHorizontalCenter = layoutAttributes.center.x;
            if (ABS(itemHorizontalCenter - horizontalCenter) &lt; ABS(offSetAdjustment))
            {
                currentAttributes   = layoutAttributes;
                offSetAdjustment    = itemHorizontalCenter - horizontalCenter;
            }
      }
    }

    CGFloat nextOffset          = proposedContentOffset.x + offSetAdjustment;

    proposedContentOffset.x   = nextOffset;
    CGFloat deltaX            = proposedContentOffset.x - self.collectionView.contentOffset.x;
    CGFloat velX                = velocity.x;

    // detection formgist.github.com/rkeniger/7687301
    // based on http://stackoverflow.com/a/14291208/740949
    if(deltaX == 0.0 || velX == 0 || (velX &gt; 0.0 &amp;&amp; deltaX &gt; 0.0) || (velX &lt; 0.0 &amp;&amp; deltaX &lt; 0.0)) {

    } else if(velocity.x &gt; 0.0) {
      for (UICollectionViewLayoutAttributes *layoutAttributes in array)
      {
            if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell)
            {
                CGFloat itemHorizontalCenter = layoutAttributes.center.x;
                if (itemHorizontalCenter &gt; proposedContentOffset.x) {
                  proposedContentOffset.x = nextOffset + (currentAttributes.frame.size.width / 2) + (layoutAttributes.frame.size.width / 2);
                  break;
                }
            }
      }
    } else if(velocity.x &lt; 0.0) {
      for (UICollectionViewLayoutAttributes *layoutAttributes in array)
      {
            if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell)
            {
                CGFloat itemHorizontalCenter = layoutAttributes.center.x;
                if (itemHorizontalCenter &gt; proposedContentOffset.x) {
                  proposedContentOffset.x = nextOffset - ((currentAttributes.frame.size.width / 2) + (layoutAttributes.frame.size.width / 2));
                  break;
                }
            }
      }
    }

    proposedContentOffset.y = 0.0;

    return proposedContentOffset;
}
</code></pre>

<p>(这段代码的灵感很大程度上来 self 在 SO 上找到的其他内容,但我现在找不到引用)。</p>

<p>在我的例子中,collection view 没有分页,但是这个方法让它表现得像原来那样。</p>

<p>另外,如果你想让 Collection View 的第一个单元格从屏幕的中心开始(最后一个单元格也是一样),你必须在 <code>UICollectionViewDelegateFlowLayout</code> 中重写这个方法></p>

<pre><code>- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    CGFloat leftInset = (self.view.bounds.size.width - CELL_WIDTH) / 2;    // CELL_WIDTH is the width of your cell
    return UIEdgeInsetsMake(0, leftInset, 0, leftInset);
}
</code></pre>

<p>此方法假定 collectionView 与屏幕一样宽。如果您不是这种情况,请通过计算 collectionView 的左右插图来调整它以适应您的需求。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UICollectionView 的分页以在屏幕上显示一个完整单元格和两个部分单元格,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30861991/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30861991/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UICollectionView 的分页以在屏幕上显示一个完整单元格和两个部分单元格