核心动画“翻转”动画

2024-04-20

我希望使用 Core Animation 在 Mac 应用程序中模拟翻转时钟动画。目前我有三个 CALayer 代表数字的上半部分和下半部分,第三个用于代表翻转动画(在以下文章中找到了解决方案:使用 Core Animation 创建 iPad 翻转时钟 http://www.voyce.com/index.php/2010/04/10/creating-an-ipad-flip-clock-with-core-animation/.

翻转层的动画分为两个阶段:从数字顶部翻转到数字中间,然后从中间翻转到底部。为了实现这一点,我使用了一个委托函数,每当动画结束时就会调用该函数:

- (void)animationDidStop:(CAAnimation *)oldAnimation finished:(BOOL)flag
{
    int digitIndex = [[oldAnimation valueForKey:@"digit"] intValue];    
    int currentValue = [[oldAnimation valueForKey:@"value"] intValue];

    NSMutableArray *digit = [digits objectAtIndex:digitIndex];
    CALayer *flipLayer = [digit objectAtIndex:tickerFlip];
    CALayer *bottomLayer = [digit objectAtIndex:tickerBottom];

    if([[oldAnimation valueForKey:@"state"] isEqual:@"top"] && flag) {
        NSLog(@"Top animation finished");

        [CATransaction begin];
        [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
        flipLayer.contents = [bottomImages objectAtIndex:currentValue];
        flipLayer.anchorPoint = CGPointMake(0.0, 1.0);
        flipLayer.hidden = NO;
        [CATransaction commit];

        CABasicAnimation *anim = [self generateAnimationForState:@"bottom"];
        [anim setValue:[NSString stringWithFormat:@"%d", digitIndex] forKey:@"digit"];
        [anim setValue:[NSString stringWithFormat:@"%d", currentValue] forKey:@"value"];
        [flipLayer addAnimation:anim forKey:nil];
    } else if([[oldAnimation valueForKey:@"state"] isEqual:@"bottom"] && flag) {
        NSLog(@"Bottom animation finished");

        // Hide our flip layer
        [CATransaction begin];
        [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
        bottomLayer.contents = [bottomImages objectAtIndex:currentValue];
        flipLayer.hidden = YES;
        flipLayer.anchorPoint = CGPointMake(0.0, 0.0);
        [CATransaction commit];
    }
}

此委托函数使用辅助函数,该函数根据翻转层的状态生成翻转层的变换:

- (CABasicAnimation *)generateAnimationForState:(NSString *)state
{
    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    anim.duration = 0.15;
    anim.repeatCount = 1;

    // Check which animation we're doing
    if([state isEqualToString:@"top"]) 
    {
        anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0f, 1, 0, 0)];
        anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI/2, 1, 0, 0)];
    } 
    else 
    {
        anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(-M_PI/2, 1, 0, 0)];
        anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0f, 1, 0, 0)];
    }

    anim.delegate = self;
    anim.removedOnCompletion = NO;

    // Set our animations state
    [anim setValue:state forKey:@"state"];

    return anim;
}

此解决方案有效,但在动画进行时会导致一些轻微的闪烁。我相信这是由于我的翻转层在“顶部”和“底部”动画之间重置的转换造成的。需要注意的是,在动画的第一阶段完成后,我将翻转图层锚点设置到图像的顶部,以确保翻转枢轴正确。

目前我不确定我的动画是否已设置最佳。总的来说,我对转换和核心动画很陌生。有人能指出我正确的方向吗?


After

anim.removedOnCompletion = NO; 

尝试插入此代码:

anim.fillMode = kCAFillModeForwards;

让我知道。本质上,代码片段应该防止导致闪烁的“重置”。

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

核心动画“翻转”动画 的相关文章

  • 在iphone应用程序中的一个线程之后调度一个线程

    我想在线程完成后安排线程 是否可以 如何 例如 指定我的需要 void connection NSURLConnection connection didReceiveData NSData data 1 response schedule
  • 检测可可上的鼠标右键单击

    我正在尝试在我的原型中管理鼠标事件精灵套件 game 我从问题中使用了以下方法SO q https stackoverflow com questions 17473176 how to detect right and left clic
  • 快速以编程方式清除 NSView

    我有一个NSView连接到自定义类 该视图上有一些图画 class LineDrawer NSView var linear NSBezierPath var storage NSUserDefaults standardUserDefau
  • TextView、iOS 和 OSX 中的彩虹文本

    我正在尝试向我的应用程序添加一些不同的文本颜色以融合到图像中 我收到了很多用户想要彩虹文本颜色并重复的输入 例如这个词 stackoverflow看起来像这样 s red t orange a yellow c green k blue o
  • 如何设置主窗口的位置和大小(以编程方式)?

    我正在使用 OS X 的最新默认项目 10 11 Xcode 7 0 它使用故事板 层次结构如下 Window Controller gt View Controller 我想设置窗口的初始位置和框架大小 显然用户可以更改它 但我希望它以一
  • 使用 NSMutableDictionary 与 NSMutableArray 造成的性能损失>

    我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray 这主要是出于 KVC KVO 的原因 该集合将在我的绘图方法的内循环中经历严重的变化 如果我继续进行此替换 性能是否会受到重大影响 干杯 道
  • NSDateComponents - EXC_BAD_ACCESS 错误

    我确信有一个简单的答案的基本问题 我正在尝试获取照片的时间戳 当我尝试访问 NSDateComponents 以检索特定日期元素 例如 日 时 我收到 EXC BAD ACCESS 错误 首先 我的代码的相关部分 formattedDate
  • iOS 中 NSNotificationCenter 的 if 语句

    我正在尝试在一个动画结束时开始另一个动画 我正在检查这样的回调 NSNotificationCenter defaultCenter addObserver self selector selector animationDidStopNo
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • 在 Cocoa 中实现源代码语法高亮的最佳方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发 Cocoa 应用程序 它应该能够分析和突出显示用 Objective C SQL JavaS
  • 完成后未删除时如何重用 CABasicAnimation?

    很多人都在谈论在使用 CABasicAnimation 对象后保留它 所以通过设置 完成时删除 否 当动画完成时 动画对象保持附加到图层 在不创建新的 CABasicAnimation 的情况下 如何重新启动该动画 保留这个物体有什么意义呢
  • 传递给 NSDecimalNumber +decimalNumberWithString:locale: 的区域设置参数是什么,以便它始终与使用点 (.) 小数点标记的 NSString 一起使用?

    我有一个 NSString 我想将其转换为NSDecimalNumber 该字符串是从服务器接收的 并且始终使用以下格式进行格式化en US语言环境类似XXX YYY不喜欢XXX YYY 我想创建一个NSDecimalNumber它接受XX
  • NSMenuItem 中的自定义 NSView 未接收鼠标事件

    我使用 popUpStatusItemMenu 从 NSStatusItem 中弹出一个 NSMenu 这些 NSMenuItems 显示了一堆不同的链接 每个链接都通过 setAction 连接到目标的 openLink 方法 这种安排长
  • Cocoa 中播客应用程序的 Apple Api

    我正在为 mac 创建一个播客应用程序 用户可以在其中搜索 itunes 上的播客 是否有苹果内置的 api 我可以通过它从苹果 itunes 搜索和播放播客 或任何其他用于从 itunes 搜索播客的 api 谢谢 Edit 现在我找到并
  • Cocoa 基于文档的应用程序中的 MVC

    我目前正在对我的应用程序进行重构和重组 我意识到模型和视图及其控制器之间的一些分离已经减少 我希望进行一些清理 我的应用程序中使用了几个关键类 NSPersistentDocument NSWindowController 和模型类 NSP
  • 如何用Block简化回调逻辑?

    假设我需要与一个提供协议的类进行通信 并在操作完成时调用委托方法 如下所示 protocol SomeObjectDelegate required void stuffDone id anObject void stuffFailed e
  • 如何将字符串从 Applescript 传递到 Objective C

    我正在开发一个应用程序 我需要能够传递一个字符串变量 from 苹果脚本 to 目标C 我已经弄清楚如何从 Objective C 类中的方法运行 Applescript 但我需要能够将 NSString 设置为 Applescript 中
  • 显示器连接或断开连接时的通知

    我正在开发一个 OS X 应用程序 该应用程序在所有连接的显示器的所有可用空间上显示自定义窗口 我可以通过调用 NSScreen Screens 获取可用显示对象的数组 我目前缺少的是一种判断用户是否将显示器连接到系统或从系统断开屏幕的方法
  • 使用基于约束的布局自动调整 NSTokenField 的大小

    有没有办法自动调整大小height使用约束的 NSTokenField 保持宽度恒定 sizeToFit应该有效 但事实并非如此 如果我设置一个约束来保持宽度不变并调用此方法 它将忽略约束并仅调整宽度大小 当我想要的是仅调整高度大小时 基于
  • 为沙盒 Cocoa 应用程序创建临时文件

    我的应用程序是沙箱化的 根据最新的应用程序商店指南 我想创建一些临时文件 我可以这样做吗 如果 是 我可以在哪里这样做 有没有预先指定的路径 还有访问该路径的命令 您应该使用NSTemporaryDirectory 函数 它将查找并返回适合

随机推荐

  • 无法让简单的 ParseKit 示例正常工作

    我刚刚发现 ParseKit 但似乎无法让它在一个简单的例子中工作 NSString test FOO BAR NSString grammar get grammar txt file and read it into a string
  • AngularJS - 外部模板

    我正在为 和 的每个内容制作一个模板 因为我有很多数据要显示 但都在相同的结构中 这里是index html div 这是 script js function Ctrl scope scope methods name method1 d
  • Windows 11 权限被拒绝(公钥)

    最近升级到 Windows 11 后 我无法通过 SSH 访问服务器 我不断收到permission denied publickey error 我尝试过重新生成新的公钥ed25519而不是已弃用的rsa我仍然遇到同样的错误 我已经看到了
  • 2D 弹跳公式无法正常工作

    我是 Unity 的新手 我正在尝试创建一个弹跳球 所以我做了很多关于弹跳相关物理的研究 我找到了一个公式 Formula 2 V dot N N V 其中 V 是速度矢量 N 是球弹跳表面的法线 这是我的脚本 using UnityEng
  • 主干表视图消耗行视图 - 如何构造?

    我有一组模型希望在表格视图中呈现 每个模型应由表中的一行表示 并且该行应使用模板生成 我应该能够将事件处理程序附加到该行 例如单击 在事件发生时发出有关与该行关联的模型的一些特定信息 我见过类似的事情的一种常见方法是将每一行分解到它自己的视
  • Java keytool / 使用 java 生成密钥的安全性(一般)

    我们使用与 java 安装捆绑在一起的 keytool 来生成密钥以进行非对称 RSA 加密 鉴于近期events https www schneier com blog archives 2013 09 the nsa is brea h
  • 如何为 Windows Phone 7 应用程序的 UI 编写自动化测试?

    驱动一个普通的应用程序 它的 UI 已经足够困难了 但是当应用程序没有在您的开发平台上运行时 这就更难了 那么哪些工具可以帮助我测试 Windows Phone 7 应用程序的 UI 也可以看看 对于 Windows 7 Phone 代码的
  • IntelliJ IDEA:为什么 readLine() 需要两个用户输入,而不是使用 Kotlin 的一个?

    我编写了一个简单的程序 它从控制台获取用户的输入 然后将其打印出来 但是当用户输入时 它会请求第二个用户输入 并且只读取第二个输入 Code fun main args Array
  • 如何在 Mathematica 8 中并行集成

    有人知道如何使用所有核心来计算积分吗 我需要使用并行化或并行表 但如何使用 f r Sum 1 n 2 r 2 n 7 2 n n r 2 n 1 x r 2 n 1 n 0 r 2 Nw Transpose Table f j i 1 j
  • Clojure:在特定命名空间中启动 repl

    我安装了 boot clj 并且希望能够在外部编辑器中编辑 clj 文件 并单独运行一个命令行 REPL 我可以从中调用我在 clj 文件中更改的函数 不需要特殊的重新加载命令 另一件事是我不想手动键入命令来包含命名空间 我只想运行一个将我
  • 无需打开/保存即可评估 Excel 文件

    有没有一种方法可以在不手动打开文件的情况下计算Excel公式 如果 openxlsx 不是最佳选择 请随时推荐其他软件包 谢谢 我的目标是将数据粘贴到 Excel 文件 已经存在 中 其中的公式引用我要粘贴数据的范围 并让 Excel 刷新
  • 播种数据透视表的更好方法

    我有以下表格users roles和数据透视表角色 用户具有以下表结构 users id username password roles id role 角色 用户 id role id user id
  • 配置 IIS 以接收电子邮件

    根据这个答案 https stackoverflow com a 929797 939213可以配置 IIS 来接收电子邮件 这就是我想做的 但答案说它是在下面完成的IIS SMTP under domains 我使用 IIS 管理器连接到
  • 更改自定义产品类型的 WooCommerce“库存”文本(预购)

    一点背景知识 我目前正在使用WooCommerce 插件的产品预订单 https wordpress org plugins product pre orders for woo 由别墅主题 总的来说 除了这一件事之外 它对于我的目的来说效
  • Python argparse 切换标志

    argparse 有什么方法可以解析类似的标志 a b c d foo py s b 应该将 True 存储在dest of s和 False 中dest of b 很像 Windows 所做的attrib或Linuxchmod 目前 我正
  • 在 Mac osx 中将 .a 转换为 .dylib

    是否可以在 Mac osx 中将 a 文件转换为 dylib 文件 我目前有libraryname a 它似乎无法将其包含在我的程序中 因为仅包含 dylib 库 还有一个命令可以通过 mac osx 终端显示程序中使用的静态库吗 是的 这
  • 如何从字符串列表中提取数字?

    我应该如何仅从中提取数字 a 1 2 3 4 5 6 invalid 我努力了 mynewlist s for s in a if s isdigit print mynewlist and for strn in a values map
  • python 中的 Selenium Webdriver:跨测试用例重复使用相同的 Web 浏览器

    Python 新手在这里 我试图在整个测试用例中重复使用相同的浏览器 但是 我不知道如何传递全局变量来完成这项工作 现在 我有一个 main py 看起来像这样 C Python27 python exe import unittest i
  • 您的目标项目“XXX”未引用EntityFramework。这个包是必需的

    谁能指出我出错的方向 我正在尝试使用 SQLite 进行迁移以在 EFCore 上工作 控制台应用程序 NET Core 3 1 运行任何命令 例如enable migrations或update database 都会出现错误 您的目标项
  • 核心动画“翻转”动画

    我希望使用 Core Animation 在 Mac 应用程序中模拟翻转时钟动画 目前我有三个 CALayer 代表数字的上半部分和下半部分 第三个用于代表翻转动画 在以下文章中找到了解决方案 使用 Core Animation 创建 iP