UICollectionViewCell - 内容不会与单元格的 contentView 一起动画

2024-05-01

问题看起来像这样:http://i.imgur.com/5iaAiGQ.mp4 https://i.imgur.com/5iaAiGQ.mp4(红色是cell.contentView的颜色)

这是代码:https://github.com/nezhyborets/UICollectionViewContentsAnimationProblem https://github.com/nezhyborets/UICollectionViewContentsAnimationProblem

当前状态:UICollectionViewCell 的 contentView 的内容不会随着 contentView 框架的更改而动画化。它立即获取大小而无需动画。

执行任务时遇到的其他问题:contentView 也没有随着单元格的帧更改而动画化,直到我在 UICollectionViewCell 子类中执行此操作:

override func awakeFromNib() {
    super.awakeFromNib()

    //Because contentView won't animate along with cell
    contentView.frame = bounds
    contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}

其他注意事项:下面是单元格大小动画涉及的代码

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.selectedIndex = indexPath.row

    collectionView.performBatchUpdates({
        collectionView.reloadData() 
    }, completion: nil)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let isSelected = self.selectedIndex == indexPath.row
    let someSize : CGFloat = 90 //doesn't matter
    let sizeK : CGFloat = isSelected ? 0.9 : 0.65
    let size = CGSize(width: someSize * sizeK, height: someSize * sizeK)

    return size
}

使用时我得到相同的结果collectionView.setCollectionViewLayout(newLayout, animated: true),并且使用时根本没有动画collectionView.collectionViewLayout.invalidateLayout()代替reloadData() inside batchUpdates.

UPDATE当我打印时imageView.constraints集合视图内部willDisplayCell方法,它打印空数组。

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    for view in cell.contentView.subviews {
        print(view.constraints)
    }

    //Outputs
    //View: <UIImageView: 0x7fe26460e810; frame = (0 0; 50 50); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x608000037280>>
    //View constraints: []
}

这是一个棘手的问题,而且您已经非常接近解决方案了。问题在于,动画布局更改的方法会有所不同,具体取决于您是否使用自动布局或调整蒙版大小或其他方法,并且您当前在 ProblematicCollectionViewCell 类中使用混合方法。 (其他可用的方法最好在回答一个单独的问题时得到解决,但请注意,苹果通常似乎避免在自己的应用程序中对单元格使用自动布局。)

以下是您需要执行的操作来为特定单元格设置动画:

  1. 当选择或取消选择单元格时,告诉集合视图布局对象单元格大小已更改,并在其可以执行的范围内对这些更改进行动画处理。最简单的方法是使用performBatchUpdates,这将导致从以下位置获取新的尺寸sizeForItemAt,然后将新的布局属性应用到其自己的动画块内的相关单元格:

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        self.selectedIndex = indexPath.row
        collectionView.performBatchUpdates(nil)
    }
    
  2. 每次集合视图布局对象更改其布局属性时(这将发生在performBatchUpdates动画块):

    // ProblematicCollectionViewCell.swift
    
    override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
        super.apply(layoutAttributes)
        layoutIfNeeded()
    }
    

如果您想更好地控制动画,可以将调用嵌套到performBatchUpdates在对其中之一的调用中UIView.animate基于块的动画方法。 iOS 10 中集合视图单元格的默认动画持续时间为 0.25。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UICollectionViewCell - 内容不会与单元格的 contentView 一起动画 的相关文章

随机推荐

  • C++:如何通过时间和本地时间获取实际时间?

    我正在寻找一种在 C 中以 HH MM SS 方式节省时间的方法 我在这里看到它们有很多解决方案 经过一番研究后我选择了time and localtime 然而 似乎localtime函数有点棘手 因为它says http rabbit
  • 如何编写javadoc链接?

    如何将链接写入 javadoc 目前 我有类似的东西 link java lang Math sqrt double Math sqrt 生成文本Math sqrt应该链接到java lang Math sqrt double 然而 API
  • Kafka中如何使用事务以及如何使用abortTransaction?

    我是 kafka 新手 我使用 Kafka Producer Java api 面对Kafka的这个问题 Kafka Invalid transition attempted from state COMMITTING TRANSACTIO
  • 读取pkcs12证书信息

    我在读取证书信息时遇到问题 我想以编程方式在 Android 中使用 java 和 bouncycastle 库来阅读完整信息 现在 我只是在控制台中使用 keytool 命令 gt keytool list keystore 1 p12
  • R: Knit 给出 SQL-chunk 错误

    我想编织 R markdown 的输出 其中包括几个 SQL 块 但是 如果我开始编织 就会收到错误消息 Line 65 Error in eval expr envir enclos object pp dataset not found
  • 使用 OOP 开发 WordPress 插件

    我是插件开发的新手 所以 凡是我说得不对的地方 请大家指正 我有一个网站需要一个具有以下需求的播放器插件 管理员可控的玩家注册表单 其中包含一些详细信息 显示所有注册玩家的列表页面 已注册的玩家可以删除并相互比较 在前端的 WordPres
  • 当 Bool 变量变为 True 时更改标签

    我不太确定如何解释这一点 我将把代码放在伪代码中以便于阅读 我几乎想要一个标签在类的 bool 变量更改时更改其文本 我不确定我需要使用什么 因为我使用的是 WPF 并且该类不能只更改我不更改的标签你不觉得吗 我需要举办某种活动吗 或者 W
  • android 2.2 谷歌地图错误

    我使用 google map api 开发了一个在 android 2 1 上运行良好的项目 但是当我在 android 2 2 上运行相同的项目时 它遇到了一些错误 显示的错误是 Android运行时致命异常 main AndroidRu
  • 无法绑定到“*ngIf”,因为它不是 angular2 中“td”的已知属性

    在我的 Angular 2 应用程序中 在 ts 文件中 我在下面点击了偶数 ViewPages Char string void this selectedPage Char 在html中 我尝试绑定ngif中的选择页面 td name
  • 为什么通过 gmail 的 SMTP 在本地工作但在我的生产服务器上不起作用?

    我正在运行托管在 AWS 爱尔兰 上的 Nodejs 服务器 并使用 emailjs 发送电子邮件 我使用的电子邮件帐户是 gmail 帐户 我可以从本地计算机发送电子邮件 没有任何问题 但电子邮件无法从生产服务器发送 出站防火墙设置为允许
  • Android 如何检查文件是否存在并创建一个?

    我有以下问题 我想将一个名为 data xml 的文件放入 sdcard appname 文件夹中 并使用它来读取和写入应用程序数据 因此 当我的主要活动创建时 我需要检查该文件是否存在 public class appname exten
  • 如何在 Instagram 等应用中使用“@”提及用户

    我正在创建一个具有照片共享功能的应用程序 并且我正在尝试添加提及 或标记 用户的功能 Twitter 最初开始使用 和用户名来标记用户 但现在从 Facebook 到 Instagram 都在使用它 这是iOS端实现的还是后端实现的 我目前
  • 将小数点数字转换为整数 - PowerShell

    我正在编写一个 PowerShell 脚本 它将带小数点的数字转换为整数 val 1024 24 如何将该值转换为整数 我希望它是1024 使用向下取整 四舍五入到较低的整数 Math Floor val 编辑 如果只是丢弃小数部分不是您想
  • 如何使用 Flutter 修复 VSCode 上的自动修复问题?

    我更新了迂腐的软件包并最终出现了 1000 多个问题 其中许多是首选单引号或不必要的等等 只需单击一下即可修复它们 我认为 eslint 或其他一些工具可以在 VSCode 中做到这一点 有没有办法在 Flutter 项目中做到这一点 我找
  • Pandas sklearn one-hot 编码数据帧还是 numpy?

    如何将 pandas 数据帧转换为 sklearn one hot encoded 数据帧 numpy 数组 其中某些列不需要编码 mydf pd DataFrame Target 0 1 0 0 1 1 1 GroupFoo 1 1 2
  • 将 everyauth 与 Restify 结合使用

    我正在尝试使用 everyauth 来处理使用restify 创建的rest api 的身份验证 但却找不到起点 我希望做类似的事情 var restify require restify var everyauth require eve
  • 每次使用 COUNT() 函数,还是存储该值并将其加一?

    我有一个带有用户 投票 表和 用户 表的数据库 我认为数据库会在短时间内变得相当大 所以我想使用最有效的方法 我想我可以每次使用 投票 表中的 WHERE 语句来 COUNT 投票数 或者我可以将分数存储在 用户 表中 每次投票时将其增加
  • C++:ostream 和 ostringstream 有什么区别?

    ostream 和 ostringstream 有什么区别 你什么时候会使用其中一种而不是另一种 简单地说 ostringstream提供了一个streambuf ostream要求用户提供一份 要理解其中的含义 有必要了解一点 流是如何工
  • 当 document.body 长度超过 30,000 像素时,HTML2CANVAS 不会渲染它

    有办法解决这个问题吗 当 document body 高度超过 30 000 像素时 html2canvas 不会呈现 或者我可以只渲染当前视口吗 用户可以看到什么 请帮忙 为了能够仅渲染当前活动视口 您可以使用以下命令初始化 html2c
  • UICollectionViewCell - 内容不会与单元格的 contentView 一起动画

    问题看起来像这样 http i imgur com 5iaAiGQ mp4 https i imgur com 5iaAiGQ mp4 红色是cell contentView的颜色 这是代码 https github com nezhybo