如何使用 CAKeyframeAnimation 对 CoreGraphics 形状绘制进行动画处理

2023-11-24

我正在尝试在 UIView 子类中对 UIBezierPath (在我的示例中是三角形)的绘制进行动画处理。然而,整个子视图是动画的,而不是形状。

我在动画中缺少什么吗?

- (void)drawRect:(CGRect)rect {

   CAShapeLayer *drawLayer = [CAShapeLayer layer];

   drawLayer.frame           = CGRectMake(0, 0, 100, 100);
   drawLayer.strokeColor     = [UIColor greenColor].CGColor;
   drawLayer.lineWidth       = 4.0;

   [self.layer addSublayer:drawLayer];

   UIBezierPath *path = [UIBezierPath bezierPath];

  [path moveToPoint:CGPointMake(0,0)];
  [path addLineToPoint:CGPointMake(50,100)];
  [path addLineToPoint:CGPointMake(100,0)];
  [path closePath];

  CGPoint center = [self convertPoint:self.center fromView:nil];

  [path applyTransform:CGAffineTransformMakeTranslation(center.x, center.y)];

  [[UIColor redColor] set];

  [path fill];

  [[UIColor blueColor] setStroke];

  path.lineWidth = 3.0f;

  [path stroke];

  CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

  pathAnimation.duration        = 4.0f;
  pathAnimation.path            = path.CGPath;
  pathAnimation.calculationMode = kCAAnimationLinear;

  [drawLayer addAnimation:pathAnimation forKey:@"position"];
}

  • 您正在创建一个CAShapeLayer,但没有用它做任何有用的事情。让我们解决这个问题。

  • 不要设置图层和动画-drawRect:,因为这严格意味着使用 CoreGraphics 或 UIKit API 进行绘图的时间。相反,您希望 CAShapeLayer 绘制三角形——这样您就可以为它设置动画。

  • CAKeyframeAnimation.path 意味着完全不同的东西(例如沿着路径移动图层)。

  • 你的动画正在动画化position层的值。毫不奇怪,它会移动图层!你想要动画化path值代替。

  • CAKeyframeAnimation 背后的想法是为它提供一个数组values将图层的属性设置为。在关键帧之间的时间里,它将在两个相邻关键帧之间进行插值。所以你需要给它多条路径——每一侧一条。

  • 插值任意路径很困难。当路径具有相同数量和类型的元素时,CA 的路径插值效果最佳。因此,我们确保所有路径都具有相同的结构,只是有些点彼此重叠。

  • 动画的秘密,也许还有一般计算机的秘密:你must准确地解释你想要发生的事情。 “我想对每个点的绘图进行动画处理,因此它看起来是动画的”这还远远不够。

这是我的 UIView 子类think做你所要求的,或者至少接近。要制作动画,请将按钮连接到-animate: action.

SPAnimatedShapeView.h:

#import <UIKit/UIKit.h>

@interface SPAnimatedShapeView : UIView

- (IBAction)animate:(id)sender;

@end

SPAnimatedShapeView.m:

#import "SPAnimatedShapeView.h"
#import <QuartzCore/QuartzCore.h>

@interface SPAnimatedShapeView ()
@property (nonatomic, retain)   CAShapeLayer*   shapeLayer;
@end

@implementation SPAnimatedShapeView

@synthesize shapeLayer = _shapeLayer;

- (void)dealloc
{
    [_shapeLayer release];
    [super dealloc];
}

- (void)layoutSubviews
{
    if (!self.shapeLayer)
    {
        self.shapeLayer = [[[CAShapeLayer alloc] init] autorelease];
        self.shapeLayer.bounds = CGRectMake(0, 0, 100, 100);     // layer is 100x100 in size
        self.shapeLayer.position = self.center;                  // and is centered in the view
        self.shapeLayer.strokeColor = [UIColor blueColor].CGColor;
        self.shapeLayer.fillColor = [UIColor redColor].CGColor;
        self.shapeLayer.lineWidth = 3.f;

        [self.layer addSublayer:self.shapeLayer];
    }
}

- (IBAction)animate:(id)sender
{
    UIBezierPath* path0 = [UIBezierPath bezierPath];
    [path0 moveToPoint:CGPointZero];
    [path0 addLineToPoint:CGPointZero];
    [path0 addLineToPoint:CGPointZero];
    [path0 addLineToPoint:CGPointZero];

    UIBezierPath* path1 = [UIBezierPath bezierPath];
    [path1 moveToPoint:CGPointZero];
    [path1 addLineToPoint:CGPointMake(50,100)];
    [path1 addLineToPoint:CGPointMake(50,100)];
    [path1 addLineToPoint:CGPointMake(50,100)];

    UIBezierPath* path2 = [UIBezierPath bezierPath];
    [path2 moveToPoint:CGPointZero];
    [path2 addLineToPoint:CGPointMake(50,100)];
    [path2 addLineToPoint:CGPointMake(100,0)];
    [path2 addLineToPoint:CGPointMake(100,0)];

    UIBezierPath* path3 = [UIBezierPath bezierPath];
    [path3 moveToPoint:CGPointZero];
    [path3 addLineToPoint:CGPointMake(50,100)];
    [path3 addLineToPoint:CGPointMake(100,0)];
    [path3 addLineToPoint:CGPointZero];

    CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"path"];    
    animation.duration = 4.0f;
    animation.values = [NSArray arrayWithObjects:(id)path0.CGPath, (id)path1.CGPath, (id)path2.CGPath, (id)path3.CGPath, nil];
    [self.shapeLayer addAnimation:animation forKey:nil];
}

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

如何使用 CAKeyframeAnimation 对 CoreGraphics 形状绘制进行动画处理 的相关文章

  • UIView transitionFromView:如何在转换过程中实现黑色背景?

    我使用下一个代码 UIView transitionFromView viewA toView viewB duration 1 0 options UIViewAnimationOptionTransitionFlipFromLeft c
  • UIView 框架更改时阴影层不调整大小

    问题图像截图 https i stack imgur com cyc5o png class ViewController UIViewController var shadow UIView override func viewDidLo
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 在 iOS 11 中创建 Gif 图像颜色贴图

    最近 我在创建 Gif 时遇到了一个问题 如果它太大 颜色就会丢失 然而 感谢 SO 的帮助 有人能够帮助我找到解决方法并创建我自己的颜色图 上一个问题在这里 保存动画 Gif 时 iOS 颜色不正确 https stackoverflow
  • UIView 子类不会自动调整大小

    我一直在寻找有关调整大小的背景信息 但找不到太多 我知道我需要设置autoresizesSubviews在超级视图和autoresizingMask在子视图上 我已经这样做了 并且我的 UIImageViews 正确调整了大小 但我的自定义
  • Core Animation 是否为 iBook 样式卷页过渡提供公共 API?

    Core Animation 是否为 iBook 样式卷页过渡提供公共 API 我见过this http blog steventroughtonsmith com 2010 02 apples ibooks dynamic page cu
  • 将 CALayer 旋转 90 度?

    如何旋转CALayer90度 我需要旋转所有内容 包括子图层和坐标系 Obj C theLayer transform CATransform3DMakeRotation 90 0 180 0 M PI 0 0 0 0 1 0 Swift
  • CALayer 抗锯齿不如 UIView 抗锯齿

    我一直在尝试使用 CALayer 制作圆形绘图的动画 一切都运行良好 但问题是 绘制的圆不够抗锯齿 它的边界有点太粗糙 或者如果使用光栅化则模糊 抗锯齿已启用 还尝试过 边缘抗锯齿遮罩 kCALayerLeftEdge kCALayerRi
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 获取 NSLayoutConstraints 关联视图

    我试图循环遍历视图约束 我向 view1 添加了 顶部 尾部 前导和高度约束 top trailing 和leading 是主ViewControllers 视图 如果我循环查看 view1 的约束 我只会看到高度约束 for constr
  • 立即调用 Swift UIView animateWithDuration 完成闭包

    我期望在指定的持续时间后调用此 UIView 动画的完成闭包 但它似乎立即触发 UIView animateWithDuration Double 0 2 animations self frame CGRectMake 0 self bo
  • iPhone 旋转时 CALayer 自动旋转

    我有一个 UIViewController 其中我将 CALayer 子类添加到视图层 self view layer addSublayer myObject backgroundLayer 当我旋转设备时 视图会旋转 但 CALayer
  • 如何使用 didMoveToView 作为 initWithSize ?

    我将 Xcode 更新到版本 6 从那时起 我就无法使用以前在 Xcode 5 中使用 Objective C 编写的代码了 有一些新文件 GameScene h 和 GameScene m 以及 GameScene sks 而不是 MyS
  • 为什么 animateWithDuration 动画和完成块之间会暂停?

    按照Apple的建议 我通过将后续调用链接到UIView动画 animationWithDuration animation in the completion 阻止另一个调用aanimateWithDuration animation c
  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • 自动调整大小完成后如何获取帧大小

    我想知道 如何以及何时 viewDidLoad viewWillAppear viewDidAppear 可以获得自动调整大小以适合其父视图的 UIViews 框架大小 从你的问题中不清楚你为什么想要它 但我想这是为了布局你的子视图 幸运的
  • UIAlertView 之上的 UIView

    在我的应用程序中 使用了锁定屏幕 有时一个UIAlertView如图所示 现在当用户将应用程序发送到后台并再次将其置于前面时 UIAlertview会显示在锁定屏幕上方 是否有可能添加一个UIViewController的观点高于一切 即高
  • 在 iPhone 上处理电子标签

    知道如何在客户端处理电子标签吗 我们计划在我们的应用程序中使用带有来自服务器的图像的电子标签 关于什么是 eTag 请参阅 http en wikipedia org wiki HTTP ETag http en wikipedia org
  • iPhone 上的摇动视觉效果(不是摇动设备)

    在登录失败时 我宁愿避免显示警报 它太短暂了 显示警报 然后在登录屏幕上的某处显示文本似乎是重复的 因此 当用户输入错误的用户 ID 和密码时 我希望它能像 Mac 登录屏幕那样以图形方式摇动我的登录视图 有人知道是否有办法实现这一点 或者

随机推荐

  • 用MySQL计算中位数的简单方法

    使用 MySQL 计算中位数的最简单 希望不会太慢 的方法是什么 我用过AVG x 寻找平均值 但我很难找到计算中位数的简单方法 现在 我将所有行返回给 PHP 进行排序 然后选择中间行 但肯定有一些简单的方法可以在单个 MySQL 查询中
  • 如何设置 Apache ProxyPass 以保留 Express 路由

    在我的 Apache 配置中 我转发所有流量 node到港口3000 Express 服务器正在侦听
  • 如何在 Bash 中转义单引号字符串中的单引号?

    我想在 Bash 中显示一个字符串 如下所示 I m a student 当然你可以这样做 echo I m a student 但是如何在字符串周围使用单引号来实现这一点呢 echo I m a student 不起作用 但以下有效 ec
  • DoCmd.DeleteObject acTable 与 DoCmd.DeleteObject acTable 之间有什么区别?掉落表

    Details 我有一个 MS Access 数据库过程 可以在数据库中本地创建表 但是 我想确保我创建的表经过测试 如果测试失败 我需要删除 删除已创建的其他表 我猜基本上是一个回滚过程 问题 我遇到了两种删除表的方法 但无法弄清楚其中一
  • android中从包名获取应用程序名称

    我正在尝试开发一个android应用程序 它可以列出所有具有缓存的应用程序 我成功地获取了有关缓存的信息 但现在我想在屏幕上显示那些具有缓存的应用程序 我有包名称 但是问题是如何从包名称中获取应用程序名称 假设包名称是com android
  • 如何将字典中的值添加到电子表格?

    我有一个模板电子表格文档 其中有两列 服务器名称和 IP 地址 如何填充电子表格 以便每个字典键位于 服务器 列中自己的单元格中 而相应的值位于 IP 列中它旁边的单元格中 我正在使用 EPPlus 库 但找不到有关该主题的任何内容 以下是
  • Django:如何使用子查询注释 M2M 或 OneToMany 字段?

    I have Order物体和OrderOperation代表订单操作 创建 修改 取消 的对象 从概念上讲 一个订单有一对多的订单操作 每次对订单进行操作时 都会在该操作中计算总计 这意味着当我需要查找订单的属性时 我只需使用子查询获取最
  • 如何查明“调试模式”是否已启用

    Java 程序如何知道它是否在调试模式下运行 应用程序在常规 全速 模式下的行为应与 调试模式 下 当连接调试器时 在调试模式下运行时 略有不同 应用程序通过 TCP 与另一台计算机 另一个进程或自身内部进行通信 我的同事希望我们使用Soc
  • 如何使用 Composer 安装 Zend Framework 2 Tool

    我不知道如何在使用 Composer 引导时运行 zf php Zend Framework 2 Tool 首先 我根据文档引导 Composer 和 zftool mkdir tmp cd tmp curl s https getcomp
  • docker-compose 在启动使用 create-react-app 创建的 React 应用程序后立即停止

    我正在尝试使用以下命令创建一个反应应用程序create react app所描述的工具here 我想用docker compose在 docker 容器内运行 React 应用程序 我已采取以下步骤 在我的机器上我创建了一个目录调用app并
  • 全局引用命名空间?

    有没有办法在整个解决方案中全局引用命名空间 因此 不要在每个代码文件中都包含这些行 using System using MyNamespace 只需声明一次 每个代码文件都会使用它们 顺便说一句 我正在使用 Visual Studio 不
  • 如何编译 Hive UDF

    我正在尝试编译这个 UDF package com dataminelab hive udf import org apache hadoop hive ql exec UDF import org apache hadoop io Tex
  • 在Python中接收16位整数

    我正在通过串行端口从硬件读取 16 位整数 使用Python 我怎样才能得到正确的LSB和MSB 并使Python明白它是我正在摆弄的16位有符号整数 而不仅仅是两个字节的数据 尝试使用struct module import struct
  • 如何将角度材料步进器步数更改为任何图标或文本?

    角度材料步进器对我来说有以下问题 我无法从文档中找到这些问题 如何显示任何字符串或 html 而不是步进索引 数字 怎么才能显示mat工具提示当鼠标悬停在任何垫子步骤上时 我正在使用最新版本材质 角 IO 不幸的是 现在不可能使用材料中的本
  • 云上的 Node.js TCP 套接字服务器 [Heroku/AppFog]

    可以在 Node js 上运行面向 TCP 套接字的应用程序Cloud 更具体地说Heroku or AppFog 它不会是一个 Web 应用程序 而是一个用于客户端程序访问的服务器 基本思想是利用Cloud 扩展和易于使用的平台 我知道这
  • jQuery 中文档就绪的不同方式?

    这些是同一件事吗 即表示文档准备就绪的方式 function and function jQuery 或者两者之间是否有区别 如果有那么我什么时候应该使用哪个 第一个是快捷方式 ready 第二个是无效的 因为您试图调用一个不可调用的对象
  • 使用 JavaScript 清除 HTML 页面

    有没有办法使用 JavaScript 函数删除页面上现有内容的部分内容 像这样 i i
  • Chrome 和 Firefox 中的 Javascript 提升

    在 Chrome 和 Firefox 中运行它会给出不同的答案 function if true function f alert yes else function f alert no f 在 Chrome 中 结果是 否 在 Fire
  • 形成和排序正整数数组的最快策略

    在 Java 中 什么更快 创建 填充然后排序一个整数数组 如下所示 int a int 1000 for int i 0 i lt a length i not sure about the syntax a i Maths rand 1
  • 如何使用 CAKeyframeAnimation 对 CoreGraphics 形状绘制进行动画处理

    我正在尝试在 UIView 子类中对 UIBezierPath 在我的示例中是三角形 的绘制进行动画处理 然而 整个子视图是动画的 而不是形状 我在动画中缺少什么吗 void drawRect CGRect rect CAShapeLaye