对贝塞尔曲线点进行动画处理

2023-12-04

我正在尝试对用 Paintcode (很棒的应用程序,顺便说一句)制作的贝塞尔曲线进行动画处理,并在“drawRect”方法中的自定义 UIView 中进行绘制。

绘图工作正常,但我想为贝塞尔曲线中的单个点设置动画。

这是我的非工作方法:

-(void)animateFlame{
    NSLog(@"Animating");
    // Create the starting path. Your curved line.
    //UIBezierPath * startPath;
    // Create the end path. Your straight line.
    //UIBezierPath * endPath = [self generateFlame];
    //[endPath moveToPoint: CGPointMake(167.47, 214)];

    int displacementX = (((int)arc4random()%50))-25;
    int displacementY = (((int)arc4random()%30))-15;
    NSLog(@"%i %i",displacementX,displacementY);

    UIBezierPath* theBezierPath = [UIBezierPath bezierPath];
    [theBezierPath moveToPoint: CGPointMake(167.47, 214)];
    [theBezierPath addCurveToPoint: CGPointMake(181+displacementX, 100+displacementY) controlPoint1: CGPointMake(89.74, 214) controlPoint2: CGPointMake(192.78+displacementX, 76.52+displacementY)];
    [theBezierPath addCurveToPoint: CGPointMake(167.47, 214) controlPoint1: CGPointMake(169.22+displacementX, 123.48+displacementY) controlPoint2: CGPointMake(245.2, 214)];
    [theBezierPath closePath];
    // Create the shape layer to display and animate the line.
    CAShapeLayer * myLineShapeLayer = [[CAShapeLayer alloc] init];

    CABasicAnimation * pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
    pathAnimation.fromValue = (__bridge id)[bezierPath CGPath];
    pathAnimation.toValue = (__bridge id)[theBezierPath CGPath];
    pathAnimation.duration = 0.39f;
    [myLineShapeLayer addAnimation:pathAnimation forKey:@"pathAnimation"];

    bezierPath = theBezierPath;
}

使用此功能,屏幕上根本没有任何移动。生成的随机位移很好,并且 bezierPath 变量是使用类范围声明的 UIBezierPath。

我错过了什么吗? (目标是制作一种类似蜡烛的动画)


快速编辑刚刚看到你的图层代码。您混淆了几个不同的概念。像drawRect,CAShapeLayer,旧的动画代码等等......

通过执行下面的方法,您应该能够实现此目的。

你不能这样做:(你不能对drawRect的内容进行动画处理(即你不能让它在动画过程中多次绘制)。

您也许可以使用计时器或其他东西来创建自己的动画类型代码。 (即创建一个每秒触发 30 次的计时器并运行一个函数来计算您在动画中的位置并更新您想要更改的值并调用[self setNeedsDisplay];触发绘制矩形方法。

除此之外,你无能为力。

另一个编辑

只是在这里添加另一个选项。使用 CAShapeLayer 执行此操作可能会导致性能非常差。您可能最好将 UIImageView 与一系列 UIImage 一起使用。

UIImageView 上有内置属性、animationImages、animationDuration 等。

可能的解决方案

The path的财产CAShapeLayer是可动画的,所以你可以使用它。

就像是...

// set up properties for path
@property (nonatomic, assign) CGPath startPath;
@property (nonatomic, assign) CGPath endPath;
@property (nonatomic, strong) CAShapeLayer *pathLayer;

// create the startPath
UIBezierPath *path = [UIBezierPath //create your path using the paint code code
self.startPath = path.CGPath;

// create the end path
path = [UIBezierPath //create your path using the paint code code
self.endPath = path.CGPath;

// create the shapee layer
self.pathLayer = [CAShapeLayer layer];
self.pathLayer.path = self.startPath;
//also set line width, colour, shadows, etc...

[self.view.layer addSubLayer:self.pathLayer];

那么你应该能够像这样为路径设置动画......

- (void)animatePath
{
    [UIView animateWithDuration:2.0
        animations^() {
            self.pathlayer.path = self.endPath;
    }];
}

文档中有很多关于 CAShapeLayer 和动画路径属性的注释。

不过这应该可行。

另外,摆脱旧的动画代码。自 iOS4.3 以来它已经消失了,您应该使用更新的块动画。

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

对贝塞尔曲线点进行动画处理 的相关文章

  • 使用 popToRootViewController 时我丢失了导航栏

    我有一个 iOS 应用程序 其中主屏幕是 UICollectionViewController 从集合视图中选择项目时 视图将推送到该项目的详细信息视图 在细节视图中 我构建了一个从侧面移出的抽屉 滑块 为了让视图看起来像我想要的那样 我隐
  • 从 Xcode 6 安装失败:“存在内部 API 错误”

    我尝试在 ipad ios 7 1 2 上运行一个在我的手机 ios 8 4 1 上运行良好的应用程序 Xcode 提示 存在内部 API 错误 仅此而已 我不确定如何解释日志 怎么了 我该如何解决 ipad日志 Aug 29 17 39
  • 使用本地化故事板进行即时本地化

    我正在开发一个应用程序 它有一个切换按钮可以在英语和阿拉伯语之间切换 并且应该是动态的 我正在使用该方法https github com maximbilan ios language manager https github com ma
  • 电话号码的 Swift 2 国家/地区代码

    我正在尝试从 iPhone 用户处获取国家 地区代码 我不确定是否有有关该国家 地区以及某些应用程序 如 Viber 如何建议拨号代码的信息 我到目前为止 let currentLocale NSLocale currentLocale l
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • Google Maps iOS SDK:地图上东西点之间的距离

    如何计算地图东点和西点之间的距离 以米为单位 假设用户更改了滚动地图的位置 然后我使用 mapView didChangeCameraPosition delegate 方法捕获移动 但我不知道如何计算距离 这是一个辅助函数 可用于计算两个
  • MapKit 注释未显示在地图上

    我无法让 MKAnnotationViews 显示在 MapKit 的地图上 我正在使用 iOS 7 现在已经在论坛和网络上搜索了很多小时 尝试不同的示例和设置 下面我有 我认为 使其工作的最基本的设置 该应用程序包含一个 ViewCont
  • iOS 以编程方式撤销位置服务权限

    有没有一个功能CLLocationManager or UIApplication撤销位置权限类似功能unregisterForRemoteNotifications撤销推送通知权限 The stopUpdatingLocationCLLo
  • 如何在iOS应用程序中实现信号量?

    是否可以在ios应用程序中实现计数信号量 对的 这是可能的 有很多可用的同步工具 同步 NSLock NS条件 NS条件锁 GCD 信号量 并行线程锁 我建议阅读 线程编程指南 http developer apple com librar
  • 更改“返回”键盘按钮的文本

    如何将 返回 按钮的标准文本更改为其他内容 我希望它是 添加 不幸的是 您可以使用以下命令将 Return 更改为这些预定义标签之一 returnKeyType财产 返回 默认 Go Google Join Next Route Searc
  • 工作表关闭后 SwiftUI 导航栏项目框架未对齐

    在 SwiftUI 中关闭工作表后 导航栏按钮不可点击 以下是重现该问题的步骤 出示一张单子 将应用程序移至后台一小段时间 2 秒 恢复应用程序并向下滑动关闭工作表 现在导航栏按钮框架未对齐 点击的工作框架与按钮的可见框架不同 这在 iOS
  • 如何在iOS社交框架中使用SLRequest获取facebook的电子邮件参数

    我尝试使用以下代码来获取登录 iOS 设置 Facebook 的人的电子邮件 请帮助我如何从 SLRequest 获取电子邮件 void getMyDetails if accountStore accountStore ACAccount
  • 为什么这会破坏 UILabel adjustmentFontSizeToFitWidth?

    iOS 7 Xcode 5 使用 UILabel 此代码可以工作 自动调整文本大小以适应 self testLabel numberOfLines 0 self testLabel lineBreakMode NSLineBreakByWo
  • NSURLSessionDownloadTask 出现存储几乎已满磁盘警告的问题

    我在使用 NSURLSessionDownloadTask 处理 ios 上的 空间不足 磁盘已满 错误时遇到问题 如果由于应用程序中完成下载而导致磁盘已满 我会接到电话 URLSession 会话 NSURLSession 任务 NSUR
  • 在选择器视图中为行实现的标题没有改变字体?

    我尝试更改选择器视图中标题的字体 但由于某种原因我不能 我可以更改标题的颜色 但字体保持不变 func pickerView pickerView UIPickerView attributedTitleForRow row Int for
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • 使用 Xcode 6 和(可能)cocoapods 生成错误

    在构建使用 cocoapods 和最新 Xcode 6 GM 版本的 iOS 项目时 我收到以下静态分析器错误 error error reading pic error no analyzer checkers are associate
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • 如何在ios上定义可达性超时

    我使用 Reachability 类来了解我是否有可用的互联网连接 问题是当wifi可用但不能上网时 NetworkStatus currentReachabilityStatus方法花费太多时间 my code Reachability
  • GIDSignIn 在提示前指定范围

    我在 iOS 上升级到 GoogleSignIn 6 0 但找不到在登录时指定登录范围的方法 我只能看到一个名为 addScopes 的 API 我可以在基本登录后指定范围 但这会导致两个单独的登录提示 这很奇怪 之前 我们可以简单地指定登

随机推荐

  • 从文件读取文本到 unsigned char 数组

    我希望使用 OpenSSL 来加密文件中的文本 并且在加密之前需要将文本放在 unsigned char 数组中 从文件读取文本到无符号字符数组的最简单方法是什么 Your question is tagged both C and C w
  • 方法内的 Ruby 数组操作

    在下面的 input 1变化 def method 1 a a lt lt new value end input 1 method 1 input 1 input 1 gt new value 在下面的 input 2不改变 def me
  • 如何从 .NET 中的图标文件中提取特定图像?

    图标文件 ico 可能包含多个不同大小和不同颜色深度的图像 我怎样才能获得System Drawing Image对象从一个 ico file 一种选择是Image FromFile 但对于具有多个图像的图标文件 无法指定要返回的图像大小和
  • SymfonyRequirements.php 的更改是否应该包含在版本控制中?

    运行后composer update I got app SymfonyRequirements php在我的 symfony 2 7 beta 应用程序的工作更改中进行了更新 那个文件是什么 我应该提交文件的更改吗 这些文件用于check
  • 如何在 RDF 中表示 5 元组?

    在 RDF 中我见过这样的例子 John Is a Friend of James James Is a friend of Jill Jill Likes Snowboarding Snowboarding Is a Sport 但是如果
  • 两个 Android 设备之间的 RFCOMM 连接?

    我有两个 Android 设备 我想使用蓝牙进行连接 并通过 RFCOMM 通道传输数据 我只有一台设备接收数据 而另一台设备发送数据 使用此代码 我可以连接到其他设备并开始侦听 RFCOMM 通道 Method m device getC
  • ios swift 中的核心数据分组不工作

    我是 php 网络开发人员 最近学习了ios swift 我正在尝试从核心数据中获取记录 并根据一列或更恰当地根据 ios swift 中的一个属性对记录进行分组 我已经尝试过 Stack Overflow 的解决方案 但没有一个对我有用
  • Xcode 相当于 Visual Studio 的“查找源”

    我正在开发一个 Qt 项目 并已将 Qt 从他们的安装程序安装到我的计算机上 在 Visual Studio 中 调试单步调试 Qt 源代码非常简单 当我在未知文件中输入函数时 它将打开一个文件浏览器 让我找到原始的 Qt 源代码 Xcod
  • Hibernate @Formula 在运行时设置值

    我有一个带有注释 Formula 的字段的 Java 实体 其中执行包含 Firebird 数据库的某些特定函数的 SQL 查询 现在我必须迁移到 Oracle 数据库 并且需要替换 Formula 中的 SQL 代码 有办法实现这一点吗
  • 不使用游标为每行调用过程,并使用过程的结果设置该行

    我有这个程序 CREATE PROC dbo HTMLtoMARKDOWN text nvarchar 500 returnText nvarchar 500 output AS BEGIN DECLARE counter tinyint
  • MySQL ON DUPLICATE KEY UPDATE 语法错误

    我想知道是否有人能发现我的 sql 语句中的任何错误 如果我的表中尚不存在一条新记录 我希望它能够插入一条新记录 如果确实存在 则只需更新它即可 我的主键在日期字段中 这是我在 php 中出现的声明以及我收到的错误 INSERT INTO
  • 是否有任何 sdk 或套件可以在 iOS 中处理 Microsoft Office 格式?

    我正在开发一个通用文档编辑器 注释器 我正在将所有内容放在一起 我可以用 pdf 文件做几乎所有我想做的事情 但是 MS Office 格式呢 有没有什么SDK或者什么可以做的 实际上有一个库可以打开 Excel 文件 称为LibXLS 要
  • 从字符串中删除所有空格和标点符号(非字母的任何内容)?

    在Java中 如何将字符串作为参数 然后删除所有标点符号和空格 然后将其余字母转换为大写 示例1 Input How s your day going Output HOWSYOURDAYGOING 示例2 Input What s you
  • UIScrollView:单击将其滚动到顶部

    我将 UIScrollView 的 pagingEnabled 设置为 YES 并以编程方式将其内容滚动到底部 CGPoint contentOffset scrollView contentOffset contentOffset y s
  • 如何使用 Android 后退按钮在我的应用程序中返回而不是关闭我的应用程序?

    我的应用程序有三个活动 A B 和 C 我通过 确定 按钮从 A 移动到 B 并且想使用 Android 设备的默认后退按钮从 B 移回 A 但是 当我按下按钮时 整个应用程序都会关闭 我该如何解决这个问题 我怀疑你打电话finish 在您
  • Tomcat 在 7.0.27 版本之后不支持 blazeds 流式传输?

    我发现我的 Flex 应用程序在 tomcat 版本 subject 之后不再工作 请帮助我解决这个问题 我尝试了很多事情但没有成功 这是我的配置 火焰 4 x Tomcat 最新 7 0 32 爪哇7 应用程序只是挂起 没有任何错误或任何
  • 数据库优先 - Mono 上的 EF6

    Context 我需要在我的本地计算机 Macbook 上运行一个 遗留 Net 应用程序 我们的大部分堆栈是 dotnetcore 但这个特定的应用程序有点旧 虽然我确实意识到可能只启动一个 Windows 虚拟机并在那里构建它会更容易
  • 在 Android 中哪里可以找到保存的图像?

    打扰一下 快速提问 我有这样的视频流例程 我接收数据包 将它们转换为 byte 然后转换为位图 然后将它们显示在屏幕上 dsocket receive packetReceived receive packet byte buff pack
  • 如何使向量的元素唯一? (删除不相邻的重复项)

    我有一个包含一些不相邻重复项的向量 作为一个简单的例子 请考虑 2 1 6 1 4 6 2 1 1 我正在尝试做这个vector通过删除不相邻的重复项并保持元素的顺序来保持唯一性 结果将是 2 1 6 4 我尝试的解决方案是 插入 std
  • 对贝塞尔曲线点进行动画处理

    我正在尝试对用 Paintcode 很棒的应用程序 顺便说一句 制作的贝塞尔曲线进行动画处理 并在 drawRect 方法中的自定义 UIView 中进行绘制 绘图工作正常 但我想为贝塞尔曲线中的单个点设置动画 这是我的非工作方法 void