objective-c - 通过切换布局触发动画 UICollectionView 单元格调整大小

标签 objective-c animation uicollectionview

我正在尝试在各种 UICollectionViewFlowLayout 子类之间制作动画。每个流布局指定不同的项目大小。一个显示横跨 3 个项目的网格,另一个显示横跨 2 个项目的网格,第三个显示横跨 1 个项目的网格(看起来像 UITableView)。

我正在调用 setCollectionViewLayout:animated: 来执行此操作。单元格大小的动画效果很好。然而, subview 有点乱。每个单元格包含一个图像和一个标签(现在已经删除了标签)。我希望图像随着单元格大小的变化而改变其大小,标签也是如此。

如果我使用自动布局(目前还不是很擅长)来布局我的单元格的 subview ,那么在动画开始时图像会调整到目标单元格框架。我了解 UIView 动画的工作原理,因为它们会立即更改动画属性并且动画是在表示层中完成的,但我希望自动布局以某种方式以不同方式工作。

如果我删除自动布局并在 initWithFrame 中执行以下操作:

[[self imageView] setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin];

然后图像 subview 的大小动画效果非常好,但是在循环播放一些动画后,图像 subview 的大小和位置在某些情况下不正确。

我试过在 layoutSubviews 中布置 subview ,但这给出了与 AutoLayout 相同的结果。

我在 github 上看到的所有在 UICollectionViewLayout 之间设置动画的演示都只有一个彩色背景或一个填充整个单元格的 subview 。有没有人设法让这个工作?

下面是正在发生的事情的图像(红线是 UIImageView 的边框):

First Layout

Second Layout

Third Layout

Back to first layout, but subview frames are wrong

最佳答案

要让它与 AutoLayout 一起工作,您需要将以下内容放入您的 UICollectionViewCell 子类中:

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [UIView animateWithDuration:animationDuration animations:^{
        [self layoutIfNeeded];
    }];
}

默认动画持续时间约为 0.33 秒(根据实验确定)。

关于objective-c - 通过切换布局触发动画 UICollectionView 单元格调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20087187/

相关文章:

ios - 当带有动画的pushViewcontroller为true时,UINavigationBar立即消失

ios - UITableViewCell 内的 UIDatePicker 不显示小时数

javascript - 使用 JS 和 CSS 转换切换 Flex 的展开和折叠

ios - 在 iOS 中重新加载 tableview 部分时出现残像

javascript - jQuery 动画总是以相同的速度

html - 使用 CSS3 动画将 div 从屏幕顶部移动到底部?

ios - 使用自动布局将 float View 置于第二行

iOS越狱根据类名获取对象

iphone - 从其他 ViewController 的 locationManager 方法访问 newLocation

iphone - 当对象移动到特定帧时如何停止 UIPanGestureRecognizer