沿弧线对 UIView 进行动画处理

2023-11-23

我希望沿着图中所示的弧线对视图进行动画处理,从位置 1 到位置 2。

enter image description here

实际发生的情况是,视图动画描述的是一个完整的圆而不是圆弧。我的问题是:

  1. 我应该使用CGPath添加弧 or CGPath添加圆弧到点 ?
  2. 我需要使用吗CGPath移动到点是否描述视图的初始位置?

当我单步执行代码时,CGPoints 值与我预期的一样,角度也是如此。

我使用以下函数来获取圆上的 CGPoints

CGPoint pointOnCircle(CGPoint centre, float radius, float angle)
{
    float x = centre.x + radius * cosf(angle);
    float y = centre.y + radius * sinf(angle);

    return CGPointMake(x, y);
}

我正在使用以下代码及其变体,但到目前为止我还没有成功破解它。

CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
pathAnimation.duration = duration;
pathAnimation.repeatCount = 1;

CGPoint viewCenter = dynamicView.objectCenter;
CGMutablePathRef arcPath = CGPathCreateMutable();
//  CGPathMoveToPoint(arcPath, NULL, viewCenter.x, viewCenter.y);

//work out the half way point
float halfwayAngle = dynamicView.angle + (0.5f * self.angleIncrement);
float fullwayAngle = dynamicView.angle + self.angleIncrement;
CGPoint halfwayPoint = pointOnCircle(self.center, self.radius, halfwayAngle);
CGPoint fullwayPoint = pointOnCircle(self.center, self.radius, fullwayAngle);

CGPathAddArc(arcPath, NULL, halfwayPoint.x, halfwayPoint.y, self.radius, dynamicView.angle, fullwayAngle, clockwise);
//    CGPathAddArcToPoint(arcPath, NULL, viewCenter.x, viewCenter.y, fullwayPoint.x, fullwayPoint.y, self.radius);

pathAnimation.path = arcPath;
CGPathRelease(arcPath);

[dynamicView.layer addAnimation:pathAnimation forKey:@"arc"];

我编写了一个快速示例,希望能够将所有内容组合在一起。我从“单视图”应用程序模板开始,并将此操作以及触发该操作的按钮添加到视图控制器中。

- (IBAction)animateArc:(id)sender
{
    // Create the arc
    CGPoint arcStart = CGPointMake(0.2 * self.view.bounds.size.width, 0.5 * self.view.bounds.size.height);
    CGPoint arcCenter = CGPointMake(0.5 * self.view.bounds.size.width, 0.5 * self.view.bounds.size.height);
    CGFloat arcRadius = 0.3 * MIN(self.view.bounds.size.width, self.view.bounds.size.height);

    CGMutablePathRef arcPath = CGPathCreateMutable();
    CGPathMoveToPoint(arcPath, NULL, arcStart.x, arcStart.y);
    CGPathAddArc(arcPath, NULL, arcCenter.x, arcCenter.y, arcRadius, M_PI, 0, NO);

    // The layer we're going to animate (a 50x50pt red box)
    UIView* dynamicView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 50, 50)];
    dynamicView.layer.backgroundColor = [[UIColor redColor] CGColor];
    [self.view addSubview: dynamicView];
    dynamicView.center = arcStart;

    // An additional view that shows the arc.
    BOOL showArc = NO;
    UIView* drawArcView = nil;
    if (showArc)
    {
        drawArcView = [[UIView alloc] initWithFrame: self.view.bounds];
        CAShapeLayer* showArcLayer = [[CAShapeLayer alloc] init];
        showArcLayer.frame = drawArcView.layer.bounds;
        showArcLayer.path = arcPath;
        showArcLayer.strokeColor = [[UIColor blackColor] CGColor];
        showArcLayer.fillColor = nil;
        showArcLayer.lineWidth = 3.0;
        [drawArcView.layer addSublayer: showArcLayer];
        [self.view insertSubview: drawArcView belowSubview: dynamicView];
    }

    // The animation
    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.calculationMode = kCAAnimationPaced;
    pathAnimation.duration = 5.0;
    pathAnimation.path = arcPath;
    CGPathRelease(arcPath);

    // Add the animation and reset the state so we can run again.
    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        [drawArcView removeFromSuperview];
        [dynamicView removeFromSuperview];
    }];
    [dynamicView.layer addAnimation:pathAnimation forKey:@"arc"];
    [CATransaction commit];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沿弧线对 UIView 进行动画处理 的相关文章

  • 核心蓝牙在后台进行广告和扫描

    我一直在尝试设置一个应用程序 使设备既扫描外围设备又作为外围设备进行广告 目标是当两个设备通过蓝牙发现彼此靠近时在后台被唤醒 从 Apple 文档来看 您似乎应该能够在后台运行 BLE 启用蓝牙中心和蓝牙外设后台模式 并且当一台设备位于前台
  • 应用程序在第二次运行 nsnull 计数的循环时崩溃

    我有一个循环 第一次运行正常 但第二次循环时我得到 NSNull count unrecognized selector sent to instance 0x3a094a70 Terminating app due to uncaught
  • 如何保存 1 个 xcode 项目中的所有构建设置并在其他 xcode 项目上使用它们?

    我使用 xcode 4 5 和 cordova phonegap 来构建我的应用程序 我投入了大量时间来获取适合我的 Xcode 项目的构建设置 并且我想在我正在构建的多个应用程序上重用这些设置 我正在寻找是否有一种快速的方法来导出这些设置
  • 在 iOS 中管理和解除多个视图控制器

    我是一名 iPhone 新手程序员 在开发我的第一个游戏 应用程序时 我为自己提出了一个问题 创造了一个问题 我对此进行了研究 并认为我已经看到了答案 但我不明白如何使它们适用于我的应用程序 我有一个游戏 有几个视图控制器 欢迎 玩 高分
  • Swift 中的弹出视图

    我有一个弹出视图 没有选项卡栏 它弹出到带有选项卡栏的视图控制器 在带有选项卡栏的视图控制器中 我设置了一个单击按钮 以便弹出视图控制器 IBAction func PopUpClicked sender UIButton gt Void
  • iOS 4.2.1 丢失文件?

    这是我第一次使用最新的 xcode 3 2 5 和新的 iOS 4 2 1 当我在设备上运行应用程序时 我收到以下运行时错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • iOS 解决方案仅当图像尚未使用 SDWebImage 缓存在内存中时才加载带有动画的图像

    我已经为这个问题苦苦挣扎了几天 以前我使用 AFNetworking 类别来加载和缓存图像 但它的回调中没有提供缓存类型 所以我过去常常在每个控制器中跟踪哪些图像已经加载 我浏览了 SDWebImage 它提供了我正在寻找的东西 SDIma
  • 使用隐藏的 SFSafariViewController 获取 Safari cookie

    我正在阅读以下关于从移动网页到本机 iOS 9 应用程序对用户进行身份验证的文章 并且想知道如何最好地实现类似于下面讨论的隐藏控制器的隐藏 safari 视图控制器 https library launchkit io how ios 9
  • 如何在我的 iOS 项目中添加和执行 .sql 文件?

    我找到了很多关于在 iOS 中使用 SQLite 数据库的教程 但没有找到任何直接引用 sql 文件的内容 谁能告诉我如何将现有的 SQL 数据库链接到我的应用程序 编辑 这是一个 MySQL 转储 我们有一个基于浏览器的抽认卡程序 现在我
  • 更改 UITextField 辅助功能描述

    有没有办法将 UITextField 的辅助功能标签设置为 文本字段 之外的其他内容 因此 我不想将其称为 文本字段 而是将其命名为 代码验证字段 我的建议是不要试图在内置语音输出上智取系统 对于盲人用户来说 文本字段正在编辑 相当于 该项
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • 打印附加结构(swift 4)

    我有三个 textifled 用于将数据附加到结构中 如何打印我附加的内容 现在我收到一条错误消息 import UIKit class ViewController UIViewController IBOutlet var c UITe
  • 如何在 Xcode 4 中通过一个操作归档多个目标

    我有一个包含多个目标的项目 这些目标都适用于不同的 iOS 应用程序 例如 一个用于精简版的目标 另一个用于专业版的目标 我想立即构建并归档我的所有应用程序 目前 我对每个目标都有一个方案 我用它来独立归档每个应用程序 但现在我必须开始归档
  • Cognito/IAM 策略和 S3 获取对象

    我正在尝试将 S3 和 Cognito 集成到我的 iOS 应用程序中 但到目前为止尚未成功 我相信该错误与我针对 Auth 和 Unauth 用户的 IAM 策略有关 所以这是我的政策 Version 2012 10 17 Stateme
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String

随机推荐

  • MySQLdb 对于大型结果集非常慢

    我在 phpMyAdmin 和 MySQLdb python 中执行了以下查询 SELECT SELECT CONCAT id name image code FROM model artist WHERE id artist id as
  • Python 是否有相当于 Perl 正则表达式“/x”修饰符的函数?

    Perl 使构建变得容易可读的正则表达式使用 x修饰符 此修饰符允许编写正则表达式字符串并忽略这些字符串中的所有空格 换句话说 正则表达式的逻辑部分可以用空格甚至回车符分隔 从而具有良好的可读性 在Python中 我看到这样做的唯一方法是构
  • Python:json规范化“字符串索引必须是整数”错误

    我在以下代码中收到类型错误 TypeError 字符串索引必须是整数 import pandas as pd import json from pandas io json import json normalize full json d
  • JDBC 参数 verifyServerCertificate=false 无需 clientkeystore 和 truststore 即可连接

    我正在尝试使用以下设置创建到 MYSQL 服务器的 ssl 连接 我注意到 当我在 jdbc url 中指定 verifyServerCertificate false 时 Java 似乎忽略了我通过 System setProperty
  • Android:菜单项的自定义视图

    我希望能够为MenuItem 我想在操作栏中的购物车菜单项上显示一个指示器 显示当前购物车中有多少商品 我可以做到这一点的唯一方法是通过添加自定义视图而不是利用 MenuItem 生命周期等 使用自定义视图MenuItem call set
  • 是否可以将 setup.exe 和 setup.msi 图标更改为不同的图标?

    VS 2008 SP1 我为我们的客户创建了一个设置项目 setup exe 和 setup msi 的图标是标准图标 我们的客户不想要这些图标 他们想要有看起来像他们的标志的图标 是否可以将 exe 和 msi 图标更改为不同的图标 您可
  • 如何在 Visual Studio 中使用 .NET 5(隔离进程)调试 Azure Functions?

    我最近从 NET Core 3 1 迁移到 NET 5 0 使用隔离 进程外运行时 对于 C 中的 Azure Function 项目 一切都按预期进行 但是 每当我调试时 我的断点都不会命中 为什么我以前可以 但现在无法调试 Azure
  • AngularJS ng-view 不工作

    所以我遵循了这个指南 http viralpatel net blogs angularjs routing and views tutorial with example 但是当我试图改变观点时什么也没有发生 有人知道我做错了什么吗 这是
  • Laravel 分组集合返回对象而不是数组

    我有以下查询 outings Outing all gt groupBy function item return Carbon parse item start gt format m d Y return response gt jso
  • std::thread 导致 DLLMain 死锁

    所以 这就是我要说的 std 很复杂 在VS2013中这个简单的程序会导致死锁 include
  • 更改 Flexdashboard 中各个文本部分的字体大小

    我正在使用 flexdashboard 创建报告 并且我只想更改页面一部分的字体大小 我觉得我可以通过添加 CSS 类来做到这一点 但我找不到如何在 R markdown 代码中指定类名 有任何想法吗 您可以将 CSS 直接添加到 Rmar
  • hash_map是STL的一部分吗?

    简单的问题 hash map 是 STL 的一部分吗 The STL has hash map 但是 C 标准库does not Due to 一个常见的误解 您可能会将 C 标准库视为 STL 或者将 C 标准库的工具链实现的部分视为 S
  • Win 7 DllImport C# 奇怪的错误,对内存位置的访问无效?

    我正在使用 DllImport 从 C 应用程序访问 C dll 中的某些函数 该代码在我的开发笔记本电脑 Windows 7 64 位 上运行良好 dll 本身是 32 位 因此我以 32 位运行托管 dll 的进程 并且运行良好 但是
  • 将 QSlider 移动到鼠标点击位置

    我有一个 QSlider 当用户按下鼠标左键时 我想将其移动到鼠标光标的位置 我一直在四处寻找 但找不到任何最近可以解决我的问题的东西 这是我的滑块 我希望能够单击使滑块跳转到鼠标单击的位置 我可以拖动滑块 但我希望能够单击 我测试了单击
  • 日语 ASCII 代码

    在哪里可以获得与日语汉字 平假名和片假名字符对应的 ASCII 代码列表 我正在做一个java函数和Javascript来确定它是否是日语字符 它的ASCII码范围是多少 ASCII代表美国信息交换标准代码 仅包含 128 个字符 并非所有
  • 在 Eclipse 中重命名访问器/修改器方法?

    当他们获取 设置的变量被重构 gt 重命名 Eclipse 3 4 时 有什么方法可以自动重命名访问器 修改器 1 当您对变量选择 重构 gt 重命名 时 Eclipse 会提示您在 内联 框中输入新名称 在它的正下方 有一条帮助消息 旁边
  • 使用 setCompoundDrawables 进行 EditText 时计算图像大小

    当我添加如下图标时 etComment EditText findViewById R id et comment Drawable img getResources getDrawable R drawable warning etCom
  • 如何在Play Framework中定义任意任务? (如红宝石耙子)

    如何在Play Framework中定义任意任务 我的意思是任务从命令行运行 类似于 ruby rake 我知道 ant 工具 但正在寻找更好的替代方案 对于 Play 2 您可以按照此处的文档使用 SBT 创建新任务 http www s
  • 我可以在不使用 HTTPS 连接的情况下使用 SSL 证书吗?

    我有点困惑 如果 SSL 证书有助于识别您已连接到受信任的服务器 那么为什么需要使用加密 HTTPS 连接呢 我可以使用 SSL 证书进行 HTTP 连接吗 这里有一个误解 证书不是 SSL 使用证书的是SSL 但证书是在SSL之前诞生的
  • 沿弧线对 UIView 进行动画处理

    我希望沿着图中所示的弧线对视图进行动画处理 从位置 1 到位置 2 实际发生的情况是 视图动画描述的是一个完整的圆而不是圆弧 我的问题是 我应该使用CGPath添加弧 or CGPath添加圆弧到点 我需要使用吗CGPath移动到点是否描述