核心动画进度回调

2023-12-05

当核心动画在运行时达到某些点(例如,完成的 50% 和 66% 时)是否有一种简单的方法可以回调?

我目前正在考虑设置一个 NSTimer,但这并不像我想要的那么准确。


我终于为这个问题开发了一个解决方案。

本质上,我希望每一帧都能被回调并做我需要做的事情。

没有明显的方法来观察动画的进度,但实际上是可能的:

  • 首先,我们需要创建一个新的 CALayer 子类,它有一个名为“progress”的可动画属性。

  • 我们将图层添加到树中,然后创建一个动画,该动画将在动画持续时间内将进度值从 0 驱动到 1。

  • 由于我们的进度属性可以进行动画处理,因此我们的子类上会为动画的每一帧调用drawInContext。这个函数不需要重绘任何东西,但是它可以用来调用委托函数:)

这是类接口:

@protocol TAProgressLayerProtocol <NSObject>

- (void)progressUpdatedTo:(CGFloat)progress;

@end

@interface TAProgressLayer : CALayer

@property CGFloat progress;
@property (weak) id<TAProgressLayerProtocol> delegate;

@end

以及实施:

@implementation TAProgressLayer

// We must copy across our custom properties since Core Animation makes a copy
// of the layer that it's animating.

- (id)initWithLayer:(id)layer
{
    self = [super initWithLayer:layer];
    if (self) {
        TAProgressLayer *otherLayer = (TAProgressLayer *)layer;
        self.progress = otherLayer.progress;
        self.delegate = otherLayer.delegate;
    }
    return self;
}

// Override needsDisplayForKey so that we can define progress as being animatable.

+ (BOOL)needsDisplayForKey:(NSString*)key {
    if ([key isEqualToString:@"progress"]) {
        return YES;
    } else {
        return [super needsDisplayForKey:key];
    }
}

// Call our callback

- (void)drawInContext:(CGContextRef)ctx
{
    if (self.delegate)
    {
        [self.delegate progressUpdatedTo:self.progress];
    }
}

@end

然后我们可以将图层添加到主图层中:

TAProgressLayer *progressLayer = [TAProgressLayer layer];
progressLayer.frame = CGRectMake(0, -1, 1, 1);
progressLayer.delegate = self;
[_sceneView.layer addSublayer:progressLayer];

并将其与其他动画一起设置动画:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"progress"];
anim.duration = 4.0;
anim.beginTime = 0;
anim.fromValue = @0;
anim.toValue = @1;
anim.fillMode = kCAFillModeForwards;
anim.removedOnCompletion = NO;

[progressLayer addAnimation:anim forKey:@"progress"];

最后,随着动画的进行,委托将被回调:

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

核心动画进度回调 的相关文章

  • watchOS 错误:控制器接口描述中的未知属性

    我将 WKInterfacePicker 添加到情节提要中 并将其连接到界面控制器中的 IBOutlet 运行应用程序时 它在控制台中显示一条错误消息 控制器的接口描述 watchPicker 中的未知属性 Code interface I
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • CAShapeLayer 上的渐变颜色效果

    我正在尝试在 CAShapeLayer 上应用渐变颜色 为此我编写代码 void addCircle Drawing code UIBezierPath aPath UIBezierPath bezierPathWithArcCenter
  • 寻找可靠的方法来选择iPhone 13微距相机设备

    我正在使用 objc 开发一个应用程序 我必须选择 iPhone 13 Pro 和 13 Pro Max 中配备的新微距摄像头 目前 我在所有其他设备上选择我的相机 并剪掉此代码 AVCaptureDeviceDiscoverySessio
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • CSS 安全区域属性在 iPhone X 上不起作用

    就我而言 我正在 iPhone X 上运行一个 Web 应用程序 我尝试在顶部添加一个填充 以使用 Webkit 的安全区域 css 属性将我的身体推到安全区域padding top constant safe area inset top
  • iOS9 Sprite 套件问题

    一切都很顺利 直到我升级到 xCode 7 和 iOS 9 我当前的项目是一个 2D 平台游戏 自从升级以来 我就陷入了我们许多人似乎都面临的精灵套件错误 错误的困扰 我的问题是 每次游戏在模拟器或设备上运行时 所有精灵的 zPositio
  • tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

    我有一个带有UITableView 我允许通过滑动来编辑 删除 的行 就像在邮件应用程序中一样 我用以下方法来做到这一点 BOOL tableView UITableView tableView canEditRowAtIndexPath
  • ios GPUImage,小尺寸图像处理效果不好?

    我正在尝试为 OCR 准备图像 我使用 GPUImage 来完成 代码工作正常 直到我裁剪图像 裁剪后我得到了糟糕的结果 作物面积 https www dropbox com s e3mlp25sl6m55yk IMG 0709 PNG h
  • 如何将 RGB 值转换为十六进制字符串 iOS swift

    我想将 RGB 值转换为十六进制字符串 我将十六进制转换为 RGB 如下所示 但反之亦然 func hexStringToRGB hexString String gt red CGFloat green CGFloat blue CGFl
  • iOS UITableView:使用 CAGradientLayer 将背景颜色指定为渐变

    我刚刚开始使用 Xcode 4 3 中的主从视图模板 我试图更改主视图的背景颜色并将其设置为颜色渐变 这是我尝试过的 Colors m import Colors h implementation Colors UIColor naviga
  • iOS 中第一响应者的正式定义是什么?

    据我所知 第一响应者对象是根据输入活动等接收回调信号 并且它将沿着链向上冒泡 直到找到愿意处理它的响应者 但更正式地说 第一响应者的范围是什么 例如 它是应用程序范围的响应程序吗 似乎作为第一响应者只是说这个特定的对象将收到交互通知 其他响
  • 从应用程序打开/关闭 iPhone 的 Wifi

    我需要打开或关闭 iPhone 中的 wifi 有什么方法可以做到吗 还是被禁止了 私有框架 所有使用公共 SDK 编写的应用程序都经过沙箱处理 他们只能访问苹果认为可以在该沙箱中使用的属性和数据 恐怕 Wi fi 不在列表中 请看一下这个
  • Xcode 7.2 无法连接到装有 iOS 9.2 的 iPhone

    出于开发目的 我已经在我的 iPhone 5s 上安装了 iOS 9 2 beta 当然 我还安装了Xcode 7 2 beta 当我想在设备上运行应用程序扩展 键盘 时 该应用程序会正确构建 安装在 iPhone 上并启动 然而 然后我在
  • -[_SwiftValueencodeWithCoder:]:无法识别的选择器发送到实例

    尝试使用 NSCoder 时出现错误 玩家 swift class Player NSObject NSCoding private var playerName String private var playerScore Int pri
  • 如何动态添加XCTestCase

    我正在为一个白标签项目编写 UI 测试 其中每个应用程序都有一组不同的菜单项 测试点击每个菜单项并截取屏幕截图 使用快车道快照 https docs fastlane tools actions snapshot 目前这一切都发生在一个内部
  • iOS 上的推送通知渐进式 Web 应用程序

    我需要开发一个集成了推送通知的渐进式网络应用程序 在网上搜索我发现了关于这个主题的不同意见 如果我理解正确的话 目前我们无法在移动版 safari 中推送通知 但仅限桌面版 这样对吗 你有什么建议来获得相同的结果吗 我不是iOS专家 我想知

随机推荐

  • 如何链接到动态升压库?

    我编译了 boost lib 并得到了这些 Shared dynamic link libraries 24 03 2010 11 25 PM 53 248 boost thread vc80 mt 1 42 dll 24 03 2010
  • Rails 4 中命名空间路由的单独域

    我正在开发 Rails 4 应用程序 该应用程序的一部分是客户门户 必须从单独的域访问 通过导航到 我一切正常domain com cp 路由使用命名空间控制器 namespace cp do get dashboard to dashbo
  • eclipse中不在工作区中的项目的位置

    我有多个项目存储在我的本地计算机上 但不在我正在使用的 Eclipse 工作区中 但是当我打开同一个 Eclipse 工作区时 项目就在那里 这是如何实现的 工作区的元数据中是否有一个设置指定项目的存储位置 使用这种方法而不是将项目存储在工
  • Angular 4 - rxjs BehaviourSubject 在服务中的使用

    我的服务代码如下所示 数据服务 Injectable export class DataService private serviceRequestDtoSource new BehaviorSubject
  • PFLogInViewController 不再被识别?

    我正在 iOS 8 上使用最新版本的 Parse 构建 iPhone 应用程序 有人知道 PFLogInViewController 是否仍然存在吗 我很难将其纳入我的项目中 Parse 的其他一切都工作得很好 唯一的问题是 PFLogIn
  • PrettyFaces 与必需属性发生错误

    我正在使用开发一个网络应用程序JSF 2 and 漂亮脸蛋 我注释了我的一个 ViewScoped带有漂亮注释的bean 这就是我所拥有的 ManagedBean ViewScoped URLMapping parentId app lis
  • db.collection 不是一个函数 React / Firestore

    尝试使用 React 将 Firestore 实现到 LinkedIn 克隆中 我相信导入 Firebase firestore 的新方式如下 firebase js import initializeApp from firebase a
  • SparkR显示汉字错误

    我是SparkR新手 这几天遇到一个问题 将包含中文字符的文件转换成SparkR后 它不再正确显示 像这样 city c 北京 上海 杭州 A lt as data frame city A city 1 北京 2 上海 3 杭州 然后 我
  • Ruby/Rack 中的多部分响应

    我希望我的服务器发送多部分响应 multipart x mixed replace 我更喜欢使用 Sinatra 框架或通用 Rack 应用程序的某种解决方案 但 ruby 中的任何示例都很好 这相当于我在 PHP 中尝试做的事情 n pr
  • 这个 array_multisort() 为什么/如何工作?

    Code
  • 如何知道 iOS 设备何时插入?

    有没有办法知道我的设备 iPhone 何时插入电源 例如带有 USB 端口的计算机或汽车音响系统 我在我的应用程序中使用本地化服务 我想更改为kCLLocationAccuracyBestForNavigation当设备插入时自动 谢谢 您
  • C#:使用StreamReader从txt文件中读取行,但Peek()返回-1,即使还剩下很多行

    我使用 StreamReader 的 Peek 方法来检查是否还有更多行需要处理 我的文件中有 1000 多行 但是 Peek 在到达第 750 行时突然返回 1 我检查过 但第 750 行和第 751 行似乎没有区别 即使我删除了第750
  • 如何避免 MDIParent 表单调整大小

    我正在设计一个 Windows 窗体应用程序 我有一个 MDIParent 表单 它以最大化状态加载 并以最大化状态加载其子表单 但是 当我打开 OpenFileDialog 或任何数据读取器对象时 MDIParent 及其所有窗体和控件都
  • 如何在R中找到最短路径[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 问题 我有一个数据框 其中包含一组带有纬度和经度信息的点 我们需要从 A 开始 遍历其他每个节点一次 并在任意点结束 目标是最小化总的半正矢距离 df lt data frame name
  • TTS - CHECK_VOICE_DATA_FAIL - 检查引擎是否可用

    我的 TTS 引擎有一个奇怪的问题 我不知道为什么 我的错误在哪里 搜索了几个小时寻找解决方案 但没有任何可提及的结果 当我使用这个时API演示代码一切正常 我可以听到所有已安装语言的声音 但是当我检查时这个方法我收到 CHECK VOIC
  • 将默认光标更改为繁忙光标无法按预期工作

    经过多次尝试JProgressBar按照预期的工作 我终于成功地实现了我的目标 我曾经用过 疯狂程序员 s advice并使用了SwingWorker最终让程序按我想要的方式工作 Now I want the cursor to chang
  • 声明 lambda 必须使用大括号吗?

    准备 C 考试 我对语句 lambda 必须使用大括号 感到困惑 我从底部的控制问题中了解到这一点 下面的 Lambda 没有大括号就可以了 class A public static Func
  • Windows Azure 上的 EF 6 和空间类型 DbGeography

    我花了几天非常沮丧的时间试图让空间类型 DbGeography 在 Windows Azure 上工作 我有一个带有 Webrole 的 Windows Azure 项目 我在其中使用 DbGeography Distance 方法来计算距
  • 如何确保在关闭 fstream 之前将数据写入磁盘?

    下面的内容看起来很合理 但我听说即使在 close 调用之后 理论上数据仍然可以位于缓冲区中而不是磁盘上 include
  • 核心动画进度回调

    当核心动画在运行时达到某些点 例如 完成的 50 和 66 时 是否有一种简单的方法可以回调 我目前正在考虑设置一个 NSTimer 但这并不像我想要的那么准确 我终于为这个问题开发了一个解决方案 本质上 我希望每一帧都能被回调并做我需要做