在 UICollectionView/UITableView 中对滚动视图的偏移进行动画处理会导致单元格过早消失

2024-01-06

我们有一个 UICollectionView,其自定义布局与 UITableView 非常相似(它垂直滚动)。 UICollectionView 仅同时显​​示 3 个单元格,其中之一是当前活动的单元格:

[ 1 ]
[*2*]
[ 3 ]

(此处的活动单元格为#2。)单元格大约为 280 点高,因此只有活动单元格在屏幕上完全可见。用户不会直接滚动视图进行导航,而是水平滑动活动单元格以前进到下一个单元格。然后,我们做一些奇特的动画并滚动 UICollectionView,使下一个单元格处于“活动”位置,从而使其成为活动单元格,将旧单元格移走并调出队列中的下一个单元格:

[ 2 ]
[*3*]
[ 4 ]

这里的问题是设置 UICollectionView 的偏移量。我们当前将其设置在 UIView 动画块中(self.collectionView.contentOffset = targetOffset;)以及其他三个动画属性,它们大多工作得很好,但会导致第一个单元格(先前活动的单元格,在后一种情况下为#2)在动画开始运行时立即消失,甚至在延迟间隔完成之前也是如此。这绝对不理想。

我想到了一些解决方案,但无法找出最好的解决方案:

  1. 荒谬地放大 UICollectionView 的框架以容纳五个单元格而不是三个,从而迫使它将单元格保留在内存中,即使它们位于屏幕外。我已经尝试过这个并且它有效,但这听起来像是一个非常肮脏的黑客。

  2. 拍摄消失单元格的渲染内容的快照,将其放入 UIImageView 中,在单元格消失之前将 UIImageView 添加为滚动视图的子视图,并在旧单元格的完全相同的位置上,在动画结束后将其删除。听起来不像以前的选项那么糟糕(至少在记忆方面),但仍然有点老套。我也不知道实现此目标的最佳方法,请为我​​指出正确的方向。

    1. 切换到 UIScrollView 的setContentOffset:animated:。我们实际上曾经有过这个,它修复了消失的单元格问题,但与其他 UIView 动画并行运行显然会争夺主线程的注意力,从而在单核设备(iPhone 3GS/ 4).它还不允许我们更改动画的持续时间或缓动,因此感觉与其他部分不同步。如果我们能找到一种方法让它与 UIView 块动画协调工作,这仍然是一个选择。

    2. 切换到 UICollectionViewscrollToItemAtIndexPath:atScrollPosition:animated:。还没有尝试过这个,但它有一个很大的缺点:它只需要 3 个可能的常量(至少适用于这种情况)作为目标滚动位置:UICollectionViewScrollPositionTop, UICollectionViewScrollPositionCenteredVertically and UICollectionViewScrollPositionBottom。活动单元格可以改变其高度,但它始终必须距窗口顶部 35 点,并且这些选项无法提供足够的控制来完成设计。它也可能像 3.1 一样存在问题。仍然是一个选项,因为可能有一种方法可以绕过我不知道的滚动位置,并且它可能与主线程没有相同的问题,这似乎不太可能。

任何帮助将不胜感激。请询问您是否需要澄清。多谢!


我选择了#2。这是执行渲染和存储的代码片段:

UIGraphicsBeginImageContext(theCell.bounds.size);
[theCell.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *renderedCellImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

该方法的其余部分与我上面描述的差不多,但有一个警告:这必须在实际使用图像之前在后台线程上完成,因为在 iPhone 4 上渲染可能需要长达 1 秒的时间。希望如此帮助某人。

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

在 UICollectionView/UITableView 中对滚动视图的偏移进行动画处理会导致单元格过早消失 的相关文章

  • 如何以编程方式设置 UICollectionViewCell 宽度和高度

    我正在尝试实施一个CollectionView 当我使用自动布局时 我的单元格不会改变大小 但会改变它们的对齐方式 现在我宁愿将它们的尺寸更改为例如 var size CGSize width self view frame width 1
  • 控制 NSLayoutManager 中自定义文本属性周围的间距

    我有一个习惯NSLayoutManager我用来绘制药丸状标记的子类 我使用自定义属性为子字符串绘制这些标记 TokenAttribute 我会画画没有问题 但是 我需要在范围周围添加一些 填充 TokenAttribute 这样标记的圆角
  • UIButton 图像调整大小/缩放以适合

    我有一个非常严重的问题 我不知道如何解决 我正在对 UIButtons 框架进行动画处理 当我对其进行动画处理时 我希望按钮中的图像缩放到与按钮相同的大小 它无需在我的 iPhone 模拟器上执行任何操作即可运行 但是当我在 iPad 模拟
  • Swift 3 Web 视图

    所以我刚刚更新到新的Xcode8 and Swift3但现在我的网络视图不起作用 这是我使用的代码 UIWebView loadRequest webView NSURLRequest URL NSURL string http hardw
  • 如何查看iOS11屏幕录制是否开启?

    为了检测 iOS11 屏幕录制功能的开或关 我使用了 isCaptured 和 UIScreenCapturedDidChange 通知 当我第一次启动应用程序并在 iOS11 内置屏幕录制功能上时 它会通知选择器方法 值为 True 但是
  • 以编程方式访问 Apple Notes 内容

    是否可以以编程方式访问Apple Notes 即macos和ios中预装的应用程序 内容 macOS 上的 Notes 可使用 AppleScript 编写脚本 要注销所有笔记 请打开脚本编辑器并使用以下内容创建一个新脚本 然后单击播放按钮
  • SwiftUI 图像 ClipsToBounds

    尝试使用 SwiftUI Xcode 11 0 beta 2 我尝试用图像填充视图 Image large resizable aspectRatio contentMode fill frame width 80 height 80 al
  • 更新 iOS 应用程序的应用内购买内容?

    我似乎无法在任何地方找到这个问题的答案 所以这里 我正在开发一个 iOS 应用程序 该应用程序将具有非消耗性应用内购买 扩展包 例如 假设我出售一个包含 10 个级别的包 并且在一个月内我想将应用内购买更新为包含 15 个级别 用户无需重新
  • 如果我在新证书上续订我的配置文件(企业分发方法),我的应用程序是否会停止?

    我有一个通过企业分发方法发布的应用程序 分发证书将在一个月后过期 因此我创建了一个新证书 此外 我还根据具有相同捆绑 ID 和应用 ID 的新证书更新了配置文件 旧的配置文件将像旧证书一样在 1 个月后过期 我的应用程序是通过此配置文件和证
  • 如何在 Objective-C 中的导航栏中央添加图像?

    我正在IOS中开发 我使用以下代码来设置背景navigationBar self navigationController navigationBar setBackgroundImage UIImage imageNamed bar ba
  • 在 flutter 应用程序中添加启动屏幕的正确方法是什么?

    我正在开发一个基于 flutter 的应用程序 并研究了几种添加闪屏的方法 但我不确定哪一个是最好实现的 import dart async import package flutter material dart import packa
  • 何时以及为何使用多个 NSManagedObjectContext?

    基本上 我在我的应用程序中只使用了一个 moc 但我认为在某些情况下我应该使用多个 NSManagedObjectContext 什么时候应该使用多个 NSManagedObjectContext 我听说在某些情况下我应该使用 3 moc
  • 如何在 UIView 中获取父导航控制器

    我创建了一个UITabBarController在我的应用程序委托中 其中每个选项卡栏项目都有不同的UINavigationController加载自定义的UIViewController带NIB 使用 pushViewController
  • “找不到开发者磁盘映像”

    最近我收到错误 找不到开发人员磁盘映像 我认为自从我将 iPhone 上的 iOS 更新到 9 1 后就会发生这种情况 如何解决该问题并使 Xcode 支持 iOS 9 1 设 备 Xcode 7 0 1 和 iOS 9 1 不兼容 您需要
  • iOS 上的内存交换和虚拟内存 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Does iOS支持像Linux一样自动运行的内存交换和虚拟内存吗 iOS有虚拟内存 但没有后备存储 因此没有交换内存的调入 调出 A
  • 处理具有不同缩放/分辨率的所有 iPhone 中的 UI [重复]

    这个问题在这里已经有答案了 在 iOS 中处理 iPhone 4 iPhone 5 iPhone 6 iPhone 6 UI 屏幕的最佳方法是什么 iPhone 6 的尺寸 3 倍缩放 坐标空间 414 x 736 像素 iPhone 6
  • 管理 iOS 中的布局

    我是新来的iOS开发方面 我对 JAVA Swing 和 Windows 应用程序有扎实的背景 我想学习如何进行布局iOS 我猜iOS没有 布局管理器 就像 Java Swing 中的那样 发展的唯一出路UI是否指定每个控制器的尺寸和位置
  • 使用 cordova 工具集构建应用程序时出错

    我正在使用 Visual Studio 2017 社区版 并且只需使用 vs 文档中的步骤即可使用 macincloud 服务进行远程构建 我基本上遇到了以下明确的错误 来自构建服务器的远程构建错误https xxxx macincloud
  • Xamarin Form - IOS:如何检测 UIView 大小已更改

    我使用 ContentView 创建了一个 Xamarin 表单 并为 Android 创建了一个渲染器 现在我必须为 IOS 创建一个渲染器 在 android 渲染器中 我可以重写 onSizeChanged 并将这些宽度 高度值传递给
  • 苹果拒绝任何访问UDID的应用程序,不支持Retina、iPhone 5显示屏?

    得到消息来自TNW http thenextweb com apple 2013 03 21 after a year of warnings apple will no longer accept any apps that use ud

随机推荐

  • 安装 slack 应用程序时如何收到通知?

    我有一个要求 我必须为我的 slack bot 进行一些初步设置 我想做的是 当我的 slack 应用程序安装到工作区时收到通知 向工作区管理员发送包含说明 设置手册的私人消息 我在看松弛event API https api slack
  • OSHI:获取给定路径的 HWDiskStore

    我正在使用奥希https github com oshi oshi https github com oshi oshi来监控硬件 有一个方法 HWDiskStore getDisks https github com oshi oshi
  • 保护内存中的凭据[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我将接收用户名和密码并将其存储在结构中 我该如何防止某人查看我的进程的内存并查看用户的用户名 密码 我的第一个想法是对内存中的用户名和密码进行加密 并
  • 打开弹出窗口,单击链接,在父窗口中打开,关闭弹出窗口?

    我需要帮助 我想要在我的页面上做的是打开一个弹出窗口 我使用它 a class txt button Buy Now a 单击弹出窗口上的链接时 我希望它在主窗口中打开并关闭弹出窗口 我已经尝试了很多方法 但无法让它发挥作用 我想你可以使用
  • Dagger 2 - 为什么这是一个依赖循环?

    我正在尝试注入应用程序的Context到另外 2 个对象中 一个AuthManager and an ApiClient 它们都取决于所述上下文 并且ApiClient取决于AuthManager 为什么这是一个依赖循环 如果Context
  • 通过 Azure DevOps 使用专用终结点部署应用服务

    当我使用专用端点运行 Azure 应用程序服务的发布管道时 会发生以下错误 错误 无法获取 Kudu 应用程序设置 错误 IP 被禁止 代码 403 有什么建议吗 原因是当您向 Web 应用程序添加专用端点时 该应用程序的所有 Intern
  • Rails 3:作用域返回一个数组

    我正在使用范围来获取特定用户的项目 在项目模型中 belongs to user scope for user lambda user where user id gt user 用户模型 has many items Problem 打电
  • if __name__ == '__main__' 函数调用

    我正在尝试解决我在需要构建的一段代码中遇到的问题 我有一个 python 模块 我需要能够导入并传递参数 然后由主模块解析这些参数 我得到的看起来像这样 main py if name main sys argv pass argument
  • ViewModel:未解析的参考

    我想实施ViewModel到我的应用程序中 但我无法导入viewModels or activityViewModels 尝试遵循教程 但它对我来说仍然是未解决的参考 private val userViewModel ProfileFlo
  • MyBatis - 一对多 - 未为映射列设置值

    我正在使用 MyBatis 访问数据库 为此 我开设了以下课程 class ClassA private int id private List
  • MS SQL Server 2005 - 存储过程“自发中断”

    客户端在执行存储过程时重复报告非常奇怪的行为 他们的代码可以运行易失性数据集的缓存转置 如果满足以下条件 则编写存储过程来按需重新处理数据集 1 自上次重新处理以来数据集发生了变化2 数据集5分钟内没有变化 第二个条件在变化期间停止大量重复
  • 在 R 中绘制数据;错误:类型“列表”未实现默认方法

    我正在尝试在 ggplot 中绘制数据 我也尝试了来自 github 的 CRAN 版本 但最终出现错误 Error in is finite x default method not implemented for type list 这
  • 默认情况下如何使手风琴打开第一个元素?

    我在我的项目中使用引导手风琴 这里正在工作fiddler http jsfiddle net 68gk8 237 这是 HTML 代码 div div div div
  • .NET Framework 4.5 目录在哪里?

    我已经安装了 Windows 8 Visual Studio 2012 但没有 v4 5 目录 WINDIR Microsoft NET Framework 我是否做错了什么 或者 NET 4 5 与其他版本不同 如果是因为我没有安装工具
  • 我需要什么 uri 模式才能从手持设备与 PC 进行通信?

    正如我被提醒的那样here https stackoverflow com questions 22306678 why am i getting unable to connect to the remote server 我可能需要使用
  • 何时子类化而不是区分行为

    我很难决定何时应该子类化 而不是仅仅添加代表类的不同模式的实例变量 然后让类的方法根据所选模式起作用 例如 假设我有一个base car班级 在我的程序中 我将处理三种不同类型的汽车 赛车 busses and 家庭型号 每个人都有自己的齿
  • 将文本附加到文件末尾

    我使用下面的代码段在每次调用时将文本写入文件末尾 但是 它会擦除 旧数据 然后将新数据写入文件的开头 如何修复以下代码以便附加新数据always文件末尾 public boolean writeToFile String directory
  • Tweepy 搜索查询问题

    我正在开发一个使用 Twitter 的 REST API 分析数据的程序 我希望使用具有多个关键字的查询来获取我正在寻找的结果 但是 我在使用搜索查询获取特定结果时遇到问题 我已按照文档使用 OR 搜索多个单词 但它仅在一定程度上有效 在此
  • 在Shiny中获取用户IP

    有没有办法获取访问闪亮应用程序的人的IP 希望有一个 R Shiny 解决方案 但我也可以接受 javascript 解决方案 我想对 IP 进行反向地理编码 以制作图表来可视化大多数用户从哪些国家 地区访问该应用程序 然后将该信息放入应用
  • 在 UICollectionView/UITableView 中对滚动视图的偏移进行动画处理会导致单元格过早消失

    我们有一个 UICollectionView 其自定义布局与 UITableView 非常相似 它垂直滚动 UICollectionView 仅同时显 示 3 个单元格 其中之一是当前活动的单元格 1 2 3 此处的活动单元格为 2 单元格