UIScrollView 分页动画

Posted

技术标签:

【中文标题】UIScrollView 分页动画【英文标题】:UIScrollView paging with animation 【发布时间】:2015-11-26 20:29:41 【问题描述】:

我使用 UIScrollView 实现了以下功能并启用了分页。

我希望滚动视图的中心元素显示得比其他元素大一点。当滚动视图根据其位置滚动时,需要增加/减少文本标签的字体。

我尝试使用转换,但运气不好。

添加标签的代码:

array = [[NSMutableArray alloc] init];

for(int i=0;i<10;i++)
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(x, 0, 150, 50)];
    label.text = [NSString stringWithFormat:@"ID - %d",i];
    label.textAlignment = UITextAlignmentCenter;
    x +=150;
    [self.scrollView addSubview:label];
    [array addObject:label];


[self.scrollView setContentSize:CGSizeMake(x, 50)];

我在 ScollViewDidScroll 中执行的动画

float position = label.center.x - scrollView.contentOffset.x;
float offset = 2.0 - (fabs(scrollView.center.x - position) * 1.0) / scrollView.center.x;
label.transform = CGAffineTransformIdentity;
label.transform = CGAffineTransformScale(label.transform,offset, offset);

代码:到目前为止我所取得的成就:

https://www.dropbox.com/s/h2q4qvg3n4fi34f/ScrollViewPagingPeeking.zip?dl=0

【问题讨论】:

进行仿射变换是做到这一点的方法。根据您在 UIScrollViewDelegate 中更新 scrollViewDidScroll: 中的转换的单元格位置将其应用于标签。你遇到了什么问题? 它曾经是从大到小而不是从小到大的动画。它立即像流行音乐一样出现。我编辑了答案。 【参考方案1】:

不要使用滚动视图,使用 UICollectionView 和使 collectionView 单元格随着屏幕尺寸变大。

并启用它的分页属性而不是使用它的委托方法。

这是一种更可取和更有效的分页方式。

【讨论】:

我什至尝试使用 UICollectionView 但我仍然无法实现动画。【参考方案2】:

它将使用集合视图工作。返回根据位置计算变换比例的布局属性。子类化您正在使用的 UICollectionViewLayout(可能是 UICollectionViewFlowLayout)。为了使基于位置的大小调整起作用,您应该重写它的一些方法:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds

    return YES;


- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect

    NSArray *array = [super layoutAttributesForElementsInRect:rect];

    for (UICollectionViewLayoutAttributes *attributes in array)
    
        [self updateLayoutAttributesForItemAtIndexPath:layoutAttributes];
    

    return array;


- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

    UICollectionViewLayoutAttributes *layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
    [self updateLayoutAttributesForItemAtIndexPath:layoutAttributes]; 


- (UICollectionViewLayoutAttributes *)updateLayoutAttributesScaleForPosition:(UICollectionViewLayoutAttributes *)layoutAttributes

    // NOTE: Your code assigning an updated transform scale based on the cell position here

    return layoutAttributes;

您可能缺少的主要内容是对 shouldInvalidateLayoutForBoundsChange: 方法的覆盖

【讨论】:

我尝试使用它,但仍然搞砸了一切。在集合视图中,如果启用了分页并且剪辑到边界不是,则它仅在滚动时显示上一个和下一个项目。动画我仍然无法实现。

以上是关于UIScrollView 分页动画的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 分页动画

带有 uiscrollview 分页的 iOS 渐变动画

UIScroll 视图 + UIView + UITableview 问题

滚动发生时嵌套 UIScrollViews 并获取信息

UIScrollView 删除子视图动画

UIScrollView 滚动时为对象设置动画