沿弧线对 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 进行动画处理 的相关文章

  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • 将 C 转换为 Swift:向 UITextField 添加放大镜图标

    如何在左侧添加一个放大镜图标UITextField 我找到了类似问题的答案here https stackoverflow com questions 11811705 where can i get the magnifying glas
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • UILocalNotification 在后台 10 分钟后不提示

    In didFinishLaunchingWithOptions调用函数的定时器循环httpRequest每 1 分钟间隔一次 BOOL application UIApplication application didFinishLaun
  • 使用远程图像创建 MSSticker

    我正在尝试找出使用网络上托管的图像创建 MSStickers 的方法 我可以使用本地图像创建 MSStickers 例如 NSString imagePath NSBundle mainBundle pathForResource imag
  • UIStackView分布均匀填充

    所以 我有一个UIStackView其中包含四 4 UIViews 如果我删除其中一 1 个UIViews 其他三 3 个将填满UIStackView 我的问题 如何添加最大高度UIView这样它就不会填满整个空间UIStackView即使
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 如何开始复杂级别的跨平台移动应用开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • 错误域=kAFAssistantErrorDomain 代码=209“(空)”

    我面临着一个问题SFSpeechRecognizer 启动应用程序几秒钟后 我开始收到错误消息 错误域 kAFAssistantErrorDomain 代码 209 空 和 错误 域 kAFAssistantErrorDomain 代码 2
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 使用未解析的标识符“FlurryAdInterstitial”

    我正在尝试整合Flurry Interstitial Ads使用cocoapods in Swift and Xcode 7 1 1 我正在关注开发人员雅虎网站上的此文档 https developer yahoo com flurry d
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent
  • CoreBluetooth:检测设备超出范围/连接超时

    我正在设计一个 iOS 框架来处理多个 BLE 设备 均为同一类型 目前一切都运行良好 除了一件事 客户想要一个包含可用设备的列表 但是 我如何检测过去发现的设备何时不再可用 当我尝试连接到不再可用的设备时 会出现另一个问题 文档说 连接尝
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐

  • 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移动到点是否描述