UICollectionViewFlowLayout 中的自定义动画 - 水平滚动方向

Posted

技术标签:

【中文标题】UICollectionViewFlowLayout 中的自定义动画 - 水平滚动方向【英文标题】:Custom animation in UICollectionViewFlowLayout - scroll direction horizontal 【发布时间】:2017-03-31 14:03:26 【问题描述】:

我正在实现一个自定义 UICollectionViewFlowLayout,我想做这样的事情:

基本上,这是一个简单的集合视图,滚动方向设置为UICollectionViewScrollDirectionHorizontal

活动单元格 A(中间的单元格)必须具有固定大小(例如:300x300),而其他单元格(在本例中为 B)应该更小(例如:275x275)。​​

当在它们之间执行滚动时,两个单元格都应该改变它们的大小。

A 码 -> B 码 B 码 -> A 码。 B 现在在中间

我可能需要覆盖- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 并实现某种CGAffineTransformMakeScale。我想对了吗?以前有人这样做过吗?

【问题讨论】:

这不是答案,但我想建议iCarousel iCarousel 将是一个有效的替代方案,但我真的不想坚持使用第 3 方组件。无论如何,谢谢。 【参考方案1】:

问题解决了。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

    CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5;

    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

    for (UICollectionViewLayoutAttributes *attrs in attributes) 

        CGFloat diff = ABS(attrs.center.x - centerX);

        CGFloat newScale = diff * scaleFactor / (self.itemSize.width + self.minimumLineSpacing);

        if (newScale > scaleFactor) 
            newScale = scaleFactor;
        

        attrs.transform = CGAffineTransformMakeScale(1 - newScale, 1 - newScale);
    

    return attributes;

【讨论】:

以上是关于UICollectionViewFlowLayout 中的自定义动画 - 水平滚动方向的主要内容,如果未能解决你的问题,请参考以下文章