在常见情况下什么时候适合使用 Core Animation 而不是 UIView 动画

2024-01-21

这与许多小错误有关,这些小错误可能被一个人通常认为是次要的,但另一个人则认为是重大错误。

我越来越注意到的是,当使用所有口味时UIView animateWithDuration:,它实际上修改了不必要的东西,例如我的视图的多个属性,以执行简单的隐藏/显示样式动画等。

在某些场景中,事情似乎很挑剔,例如 UINavigationBar 未针对特定旋转过渡正确动画到位,或者标题视图在帧更新时未与状态栏一起动画,当视图的子层在其父视图时隐式动画不同时属性改变...

我一直在重新审视其中的许多内容,并将其转换为 CAAnimations,因为它们似乎更易于管理,因为它们实际上并没有修改我的视图的目标属性值。

一个简单的例子是,使用[view setHidden:],然后对其进行动画处理或使其在视图之外,但在动画运行时视图实际上已经可见或隐藏。

另一个是,需要转换/旋转/缩放 UINavigationController 的视图,并使用 CAAnimation 来执行此操作,因为如果我修改 UINavigationController 的视图及其任何父视图的转换属性值,UINavigationBar 不会移动到正确的位置。

因此,在总结这个问题时,我来来回回,一直在寻找一种比另一种更适合我的情况的地方,但主要是,我想听听其他人对这些场景的看法,以及是否有一些深入了解 Apple 所提供的内容,我可以更好地了解自己的方法。

提前致谢。


最终,所有 UIKit 风格的动画都会转换为 Core Animation 风格的动画;也就是说,所有内容实际上都是使用 Core Animation 进行动画处理的。 API 之间的区别主要在于便利性:UIKit 风格的动画函数更新模型值,提交动画以反映表示层中随时间的变化。

您还必须小心,您正在对 UIKit 表示可以设置动画的属性进行动画处理。例如,虽然您可以在技术上为属性设置动画UIScrollView like contentSize and contentOffset,它们没有得到官方支持,因此您必须应对潜在的副作用。

此外,frame是一个特殊情况,因为它实际上是一个派生属性,由center, transform, and bounds(此外anchorPoint on CALayer, which UIView不暴露)。动画视图frame可能会出现一系列意想不到的问题,通常涉及轮换。 Core Animation 不存在这个问题,因为frame不是显式可动画化的属性CALayer。尝试使用bounds and center在 UIKit 风格的动画中,如果您遇到涉及该视图的仿射变换(例如缩放、平移、旋转)的奇怪行为。

确实,在 UIKit 中对某些视图进行动画处理可能会产生意想不到的副作用或错误,因为除了对它们进行动画处理之外,您还要更新模型值。另一方面,核心动画更加灵活,因为您可以精细控制它更新模型层或表示层的方式和时间。

但我不同意 UIKit 进行不必要的修改。它修改需要修改的内容,以便提交您请求的动画更改以及更新其模型值。当您对属性进行动画处理时,例如frame,这将隐式调用layoutSubviews()在当前运行循环之后的该视图上,它可以级联到其他子视图等。

如果您希望 UIKit 在制作动画之前执行所有布局逻辑,请调用setNeedsLayout()随着layoutIfNeeded() before您调用动画块。如果您希望 UIKit 在提交动画的同时实际对整个子视图层次结构的更改进行动画处理,请指定UIViewAnimationOptions.layoutSubviews选项。这将立即在动画块内触发子视图布局,因此这些值也会被动画化。否则,动画更改的模型值将在下一个运行循环中触发布局更新。

一般来说,我很少注意到使用 UIKit 风格的动画函数的问题。因此,作为一个在 iOS 上花费了大量时间制作动画的人,我会说:

在任何可以使用的地方使用 UIKit 风格的动画,因为它们真的很方便。当您遇到 UIKit 风格的动画问题或者需要对如何更新图层的模型和表示值进行特定控制时,应使用核心动画风格的动画。

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

在常见情况下什么时候适合使用 Core Animation 而不是 UIView 动画 的相关文章

  • 本地化 watchkit 配套应用程序的显示名称

    我在 Apple Watch 配套应用程序上本地化应用程序显示名称时遇到一些问题 按照指导方针 我将 CFBundleName 本地化如下 CFBundleDisplayName 我的应用程序 CFBundleName 我的应用程序 我为我
  • iOS 5 中的新错误:WebKit 丢弃了未捕获的异常

    我正在尝试加载一个UIWebView与 Facebook OAuth 授权 URL 我使用以下代码 当我的UIWebView加载 Facebook 登录页面 我输入我的凭据 然后按 登录 按钮 当我点击按钮时 我收到以下错误 WebKit
  • UISlider 的自定义 UIImage 设置为 UIImageRenderingModeAlwaysTemplate

    我正在尝试自定义外观UISlider通过为拇指 minimumTrack 和 MaximumTrack 设置自定义图像 如下所示 let sliderThumbImage UIImage named slider thumb volumeS
  • 自定义过渡动画在animationControllerForPresentedController和animateTransition之间未知延迟

    我的目标是使动画在第一个视图控制器中开始并在第二个视图控制器中结束 我正在尝试使用符合以下条件的对象进行过渡动画UIViewControllerAnimatedTransitioning and UIViewControllerTransi
  • Cocoapods 框架不支持配置文件

    我是 iOS 开发领域的新手 我正在从事 iOS 应用程序开发工作 我正在使用 Cocoapods 集成 Alamofire 和 KeychainSwift 等第三方库 当我导出存档以从本地生成 ipa 文件时 它工作正常 但是当我尝试在
  • Xcode 9.2 UIDocumentBrowserViewController:无法从 bookmarkableString 创建 url

    Update Xcode 9 3 已修复它 在创建 UIDocument 文件时UIDocumentBrowserViewController 默认 错误 无法解析书签 错误 错误域 NSFileProviderInternalErrorD
  • 如何用手指 ontouch 事件 android 制作按钮动画?

    我想用手指在屏幕上移动来移动按钮 但我找不到任何有关手指运动动画的帮助 我制作了一个假电话应用程序 我想在其中制作如下图所示的来电布局 我如何在android中制作接收或拒绝按钮 我可以为此动画使用触摸事件吗 if event getAct
  • xcode 9 中的 Facebook 登录按钮终止

    我正在使用 Xcode 9 并将编译器设置为 Swift 3 2 我使用 Cocoapods 安装了 Facebook Login 一切都编译没有任何错误 但每当我在模拟器中运行它时 我单击登录按钮 它就会崩溃 控制台中仅打印以下内容 li
  • 我可以/如何确定设备是否有振动?

    我有一些设置可以启用 禁用某些操作的振动 但我发现如果设备没有振动能力 则显示它们毫无意义 有没有办法检查用户是否正在使用 iPod touch 以及它是否有振动 我不确定除了进行模型检查之外还有其他方法可以做到这一点 这可能不是一个很好的
  • iOS游戏大小问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我开发了一款 iOS 通用游戏 我想
  • iOS 从另一个类更新 ViewController UILabel

    我是开发新手 一直在用头撞墙试图弄清楚这一点 我确信 我错过了一些愚蠢的东西 但在尝试了各种不同的解决方案后 我仍然无法得到结果我在寻找 我希望能够从另一个类更新 ViewController 中的 UILabel 这是一个我无法运行的小演
  • 删除 UISearchBar 中的清除按钮

    我想从 UISearchBar 中删除清除按钮 灰色 x 我尝试按照中的描述进行操作这个答案 https stackoverflow com a 19458201 但它不起作用 我将 Objective C 代码从下面的答案和评论翻译为以下
  • 如何获取 iTunes connect 团队 ID 和团队名称?

    我正在写下一个Appfile for fastlane 我的问题是我已经有了team name and team id在 Apple 开发中心 但我无法获取iTunes Connect ID itc team id 我正在与不同的团队合作
  • 在 Grand Central Dispatch 中使用dispatch_sync

    任何人都可以用非常清晰的用例解释其目的是什么dispatch sync in GCD是为了 我不明白在哪里以及为什么我必须使用它 Thanks 当您想要执行一个块并等待结果时可以使用它 其中一个示例是使用调度队列而不是锁进行同步的模式 例如
  • AVAssetExportSession.requestExportSession 回调从未被调用(swift 3,iOS10)

    以下代码从不调用导出回调 导出会话创建得很好 我没有看到任何错误 也没有任何进展 CPU 为 0 我认为没有例外 状态为 1 进行中 进度为 0 错误为零 视频在画廊中播放 我可以成功获取视频的图像 我已将代码提取到单个 UIViewCon
  • NSString cString 已弃用。还有什么选择呢?

    我还有一个新手问题 我编写了一段代码 将 NSString 转换为 NSMutableData 以模拟 webService 结果 然而事实证明 cString 已被弃用 你能帮我更换它吗 这是我的代码 NSString testXMLDa
  • iOS 上服务器发送事件的 webkit 的推荐替代方案 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的本机 iOS 应用程序中接收服务器发送的事件 但我不使用 webkit Safari 根据我
  • DFP 问题:无广告可展示

    我的应用程序在 UIScrollView 中提供三个广告 通过 DoubleClick for Publisher 我使用旧版本的适用于 iOS 的 AdMob SDK 一切正常 我决定下载新版本 因为 AppStore 出现一些问题 添加
  • iOS - 当应用程序被终止时处理静默推送通知

    我目前在 iOS 中遇到推送通知问题 我的应用程序收到包含标识符的静默推送通知 然后 该标识符用于从创建本地通知的远程服务器获取数据 据我所知 如果用户强制退出应用程序 即通过双击主页按钮并滑动关闭应用程序 则静默推送通知不会传递到 App
  • 隐藏标签栏并删除空格

    有没有办法隐藏选项卡栏并删除剩余的空间 大约 50px I tried self tabBarController tabBar hidden true self extendedLayoutIncludesOpaqueBars true

随机推荐

  • Java垃圾收集和图形处理方法

    我正在创建一个游戏 蛇克隆 作为一种爱好 我正在查看 Java API 中 Graphics 类的 dispose 方法 当我注释掉 dispose 方法时 无论有没有它 我的动画都会以相同的方式工作 在 Java API 中 dispos
  • Scala 中“不支持不安全的 HTTP 请求”错误

    尝试运行时出现以下错误sbt run运行我的 Scala 代码 insecure HTTP request is unsupported http repo typesafe com typesafe releases switch to
  • 如何根据用户在文本字段中输入的电子邮件从 Firebase 数据库检索值?

    我正在研究 Firebase 数据库 如何根据用户在文本字段中输入的电子邮件从数据库中检索值 下面是我的数据库结构 请帮忙 这是我的代码 Ref database getReference Registeration Ref orderBy
  • onMeasure() 以 EXACTLY 和规格大小 0 调用

    调试自定义视图覆盖时onMeasure 方法 我看到有几个对此方法的调用 我只处理视图的高度 宽度规格始终保持不变 有时我接到一个关于 高度 MeasureSpec 的电话getMode EXACTLY and getSize 0 This
  • 使用 Symfony 强制使用 HTTPS

    我试图强制所有对 example com checkout 的请求使用 HTTPS 我读了Symfony 文档 http symfony com doc current cookbook security force https html并
  • 是否有不同步的 Java Stack 的直接替代品?

    我有一个使用堆栈数据结构的大型代码库 由我编写 这是为了方便起见 我有时将其用作堆栈 有时将其用作向量 列表 然而 经过性能审查后 我们决定不想为同步安全支付额外费用 我现在需要用非同步结构替换这个结构 并且在代码中多次提到 我很高兴发现
  • golang中资源应该保存在哪里

    我的应用程序使用 json 配置文件和其他资源 我应该将它们放置在项目层次结构中的哪个位置 我找不到答案http golang org doc code html http golang org doc code html 如何编写Go代码
  • Angular.js ui-grid 自定义日期过滤器

    我正在使用角度网格 ui grid 位于ui grid info http ui grid info 我正在尝试制作一个自定义过滤器 它将使用日期输入控件按日期过滤网格 一个用于小于 一个用于大于 我似乎可以在 columnDefs 中使用
  • 动态更改IP地址?

    考虑一下这个案例 我想经常抓取网站 但有一天 限制后我的IP地址被阻止了 那么 如何动态更改我的IP地址或任何其他想法 一种方法使用Scrapy http scrapy org 将使用两个组件 RandomProxy and RotateU
  • 了解oauth 2.0中客户端id、客户端密钥的需求

    我有一个网站 要求用户通过提供电子邮件和密码来登录以获得访问令牌 其中访问令牌令牌用于访问 api 然后 用户可以在访问令牌提供的范围内获得读 写的访问权限 那么 这里我想了解的是 client id 和 client Secret 在这种
  • Automapper、泛型、dto funtimes

    这是交易 我有一个报告设计器 用户可以根据一些预定义的数据集创建报告 他们可以选择要包含在报告中的一组列 然后在运行报告时 通过使用自动映射器将 NHibernate 集合映射到 dto 类集合来创建 IList 这样做的问题是 DTO 集
  • E:软件包“oracle-java8-installer”没有安装候选者

    我尝试使用以下命令安装 java8 sudo add apt repository ppa webupd8team java sudo apt get update sudo apt get install oracle java8 ins
  • React Bootstrap 弹出窗口在外部点击时关闭

    React Bootstrap 提供了一个弹出窗口控件 我希望在单击弹出窗口外部时将其关闭 其方式与模态的工作方式类似 默认情况下点击开箱即用即可将其关闭 有没有办法使用 ReactBootstrap 来做到这一点 或者我需要自定义代码吗
  • SwiftUI – 如何将 NavigationView 的标题设置为大标题(或小标题)?

    使用 SwiftUI 如何更改导航栏的标题大小 在标准标题或大标题之间进行选择 SwiftUI iOS 14 NavigationView TopLevelView navigationBarTitleDisplayMode inline
  • 函数声明与函数定义

    如果我有这个原型 int bar int 对于编译器我是宣告标识符bar 如果我有这样的定义 int bar int a 对于编译器我是defining标识符bar 一般来说 定义会为对象分配存储空间 但是 函数声明也是如此吗 另外在这种情
  • C++:提取分析数学表达式的符号/变量

    我有用户可以提供的表达式 例如 a sin w t a b c x 2 y 2 2 我愿意just获取那里的变量列表 我不需要做任何替换 所以 对于第一个公式 它是 a w t 对于第二个 a b c 对于最后一个 x y 该表达式主要是为
  • 使用 yum 安装同一软件包的多个版本? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一台安装了奇怪的内部版本 MySQL 的服务器 并且想在该节点上安装collectd 不幸的是 collectd 依赖于 MySQL 并且安装失败
  • 用于将数据从业务机会复制到相关自定义对象的自定义按钮

    我有一个自定义对象 用于映射到机会的产品设置 这是一种一对多的关系 一个机会映射到许多设置对象 但一个设置对象仅映射到一个机会 机会有一些设置字段需要充当相关自定义对象的默认值 不幸的是 我不能只在公式中指定它们 出现错误 我想做的是有一个
  • 使用钩子时等待状态更新

    如何使用 Hooks 等待状态更新 当我提交表格时 我需要检查是否termsValidation在运行一些附加代码之前为 false 如果状态刚刚发生变化 它就不会注意到这一点 import React useState from reac
  • 在常见情况下什么时候适合使用 Core Animation 而不是 UIView 动画

    这与许多小错误有关 这些小错误可能被一个人通常认为是次要的 但另一个人则认为是重大错误 我越来越注意到的是 当使用所有口味时UIView animateWithDuration 它实际上修改了不必要的东西 例如我的视图的多个属性 以执行简单