首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UICollectionView:像Safari标签或App Store搜索那样的分页

UICollectionView:像Safari标签或App Store搜索那样的分页
EN

Stack Overflow用户
提问于 2013-04-10 15:22:58
回答 6查看 9.7K关注 0票数 13

我想在我的应用程序中实现“卡片”,比如Safari标签或app Store搜索。

我将在屏幕中央显示用户一张卡,在左侧和右侧显示前一张和下一张卡的一部分。(例如,参见App Store搜索或Safari标签)

我决定使用UICollectionView,我需要改变页面大小(不知道怎么做)或者实现自己的布局子类(不知道怎么做)?

有什么需要帮忙的吗?

EN

回答 6

Stack Overflow用户

发布于 2013-04-18 05:28:31

下面是我找到的获得这种效果的最简单的方法。它包括你的收藏视图和一个额外的秘密滚动视图。

设置您的收藏视图

  • 设置集合视图及其所有数据源方法。
  • 设置集合视图的框架;它应显示您希望的全宽。
  • 设置集合视图的contentInset_collectionView.contentInset = UIEdgeInsetsMake(0,(self.view.frame.size.width-pageSize)/2,0,pageSize

这有助于正确地偏移单元格。

设置您的秘密滚动视图

  • 创建一个滚动视图,把它放在你喜欢的任何地方。如果您愿意,可以将其设置为hidden
  • 将滚动视图的边界大小设置为所需的页面大小。
  • 将您自己设置为集合视图的预期内容大小的scrollview.
  • Set的委派。

移动您的手势识别器

  • 将秘密滚动视图的手势识别器添加到集合视图,并禁用集合视图的手势识别器:

_collectionView addGestureRecognizer:_secretScrollView.panGestureRecognizer;_collectionView.panGestureRecognizer.enabled = NO;

委派

代码语言:javascript
复制
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.x = contentOffset.x - _collectionView.contentInset.left;
    _collectionView.contentOffset = contentOffset;
}

随着滚动视图的移动,获取它的偏移量,并将其设置为集合视图的偏移量。

我在这里写了这个博客,所以请查看以下链接以获取更新:http://khanlou.com/2013/04/paging-a-overflowing-collection-view/

票数 26
EN

Stack Overflow用户

发布于 2014-03-17 20:39:00

您可以子类化UICollectionViewFlowLayout并覆盖,如下所示:

代码语言:javascript
复制
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)contentOffset 
                                 withScrollingVelocity:(CGPoint)velocity
{
    NSArray* layoutAttributesArray = 
   [self layoutAttributesForElementsInRect:self.collectionView.bounds];

    if(layoutAttributesArray.count == 0)
        return contentOffset;


    UICollectionViewLayoutAttributes* candidate = 
    layoutAttributesArray.firstObject;

    for (UICollectionViewLayoutAttributes* layoutAttributes in layoutAttributesArray)
    {
        if (layoutAttributes.representedElementCategory != UICollectionElementCategoryCell)
            continue;


        if((velocity.x > 0.0 && layoutAttributes.center.x > candidate.center.x) ||
           (velocity.x <= 0.0 && layoutAttributes.center.x < candidate.center.x))
            candidate = layoutAttributes;


    }

    return CGPointMake(candidate.center.x - self.collectionView.bounds.size.width * 0.5f, contentOffset.y);
}

这将根据速度获得下一个或上一个单元格...但是,它不会捕捉到当前单元格。

票数 6
EN

Stack Overflow用户

发布于 2016-08-17 21:07:35

Swift…中的@Mike M's answer

代码语言:javascript
复制
class CenteringFlowLayout: UICollectionViewFlowLayout {

    override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {

        guard let collectionView = collectionView,
            let layoutAttributesArray = layoutAttributesForElementsInRect(collectionView.bounds),
            var candidate = layoutAttributesArray.first else { return proposedContentOffset }

        layoutAttributesArray.filter({$0.representedElementCategory == .Cell }).forEach { layoutAttributes in

            if (velocity.x > 0 && layoutAttributes.center.x > candidate.center.x) ||
                (velocity.x <= 0 && layoutAttributes.center.x < candidate.center.x) {
                candidate = layoutAttributes
            }
        }

        return CGPoint(x: candidate.center.x - collectionView.bounds.width / 2, y: proposedContentOffset.y)
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15919457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档