跟踪 Core Animation 动画

2023-11-24

我有两个在屏幕上移动的圆圈。这些圆圈都是包含其他 UIView 的 UIView。每个圆圈之外的区域是透明的。

我编写了一个函数来创建一个 CGPath,它将两个圆与四边形连接起来。我将这条路径填充到跨越整个屏幕的透明 CALayer 中。由于该层位于两个圆形 UIView 的后面,因此它似乎将它们连接起来。

最后,使用 Core Animation 对两个 UIView 进行动画处理。这位置和大小在此动画期间,两个圆圈的形状都会发生变化。

到目前为止,我取得成功的唯一方法是使用 NSTimer 定期中断动画,然后根据圆的presentationLayer 的位置重新计算并绘制光束。然而,四边形落后动画加速时的圆圈。

有没有更好的方法使用核心动画来实现这一点?或者我应该避免核心动画并使用 NSTimer 实现我自己的动画?


我遇到了类似的问题。我使用图层而不是动画视图。你可以尝试这样的事情。

  1. 将每个元素绘制为 CALayer 并将它们作为容器 UIVIew 图层的子图层包含在内。 UIView 更容易制作动画,但您的控制权会更少。请注意,对于任何视图,您都可以使用 [view layer] 获取它的图层;
  2. 为您的四边形创建一个自定义子图层。该图层应该具有您想要为此图层设置动画的一个或多个属性。我们将此属性称为“customprop”。因为它是自定义图层,所以您需要在动画的每一帧上重绘。对于您计划设置动画的属性,您的自定义图层类应返回 YES needDisplayForKey:。这样你就可以确保-(void)drawInContext:(CGContextRef)theContext每帧都会被调用。
  3. 将所有动画(圆形和四边形)放在同一个事务中;

对于圆圈,您可以使用 CALayers 并设置内容,如果它是图像,则标准方式:

layer.contents = [UIImage imageNamed:@"circle_image.png"].CGImage;

现在,对于四层,子类 CALayer 并以这种方式实现:

- (void)drawInContext:(CGContextRef)theContext{
  //Custom draw code here
}   
+ (BOOL)needsDisplayForKey:(NSString *)key{
   if ([key isEqualToString:@"customprop"])
      return YES;
    return [super needsDisplayForKey:key];
}   

交易看起来像:

[CATransaction begin];
CABasicAnimation *theAnimation=[CABasicAnimation animationWithKeyPath:@"customprop"];

theAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(1000, 1000)];
theAnimation.duration=1.0;
theAnimation.repeatCount=4;
theAnimation.autoreverses=YES;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
theAnimation.delegate = self;
[lay addAnimation:theAnimation forKey:@"selecting"];

[CATransaction setValue:[NSNumber numberWithFloat:10.0f]
                     forKey:kCATransactionAnimationDuration];
circ1.position=CGPointMake(1000, 1000);
circ2.position=CGPointMake(1000, 1000);
[CATransaction commit];

现在所有抽奖例程将同时发生。确保您的drawInContext:实现速度很快。否则动画会滞后。

将每个子图层添加到 UIViews 图层后,请记住调用 [layer setNeedsDisplay]。它不会被自动调用。

我知道这有点复杂。但是,生成的动画比使用 NSTimer 并在每次调用时重绘要好。

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

跟踪 Core Animation 动画 的相关文章

  • NSSortDescriptor 和多对多关系

    我有两种反对意见 地点和历史项目 我正在尝试获取附加到任何历史记录项目的位置 因此该位置的获取谓词是 history count gt 0 效果很好 我还想使用 NSSortDescriptor 按最新历史项目的日期对位置对象进行排序 据我
  • iOS 5 中的新错误:WebKit 丢弃了未捕获的异常

    我正在尝试加载一个UIWebView与 Facebook OAuth 授权 URL 我使用以下代码 当我的UIWebView加载 Facebook 登录页面 我输入我的凭据 然后按 登录 按钮 当我点击按钮时 我收到以下错误 WebKit
  • Xcode 愚蠢警告:视图正在裁剪其内容

    我在 Xcode 4 中收到这个愚蠢的警告 Clipped Content View is clipping its content 如果我创建一个无边框斜角按钮 其图像大于按钮本身 为什么 我怎样才能抑制它 我也遇到了类似的灰色警告问题
  • 保留“自我”的坏做法?

    我有一个简单的疑问 希望有人能解答 保留自我是不好的做法吗 我有一个想要创建的服务器请求对象 我希望能够通过以下方式使用它 ARequest request ARequest request someParam request delega
  • 仅在导航弹出后分组 UITableViewCell 上才会出现黑色角

    我不是图形专家 但我以某种方式设法通过使用一些 CG 代码将背景视图设置为 backgroundView 来制作一些好看的自定义分组 UITableViewCells 在 3 1 3 之前的所有 SDK 中 也许是 3 2 我还没有在 iP
  • UIFont fontWithName:仅限于每个系列加载 2 个变体

    这个问题与带有自定义字体的 UILabel 显示 错误 自定义字体 https stackoverflow com questions 4622956 uilabel with custom font displays wrong cust
  • 语言混合:模型和视图

    考虑开发一个应用程序 其中模型将使用 C 使用 Boost 编写 视图将使用 Objective C 使用 Cocoa Touch 编写 哪里有一些示例展示了如何集成 C 和 Objective C 来开发 iPhone 应用程序 直接从源
  • 控制 NSLayoutManager 中自定义文本属性周围的间距

    我有一个习惯NSLayoutManager我用来绘制药丸状标记的子类 我使用自定义属性为子字符串绘制这些标记 TokenAttribute 我会画画没有问题 但是 我需要在范围周围添加一些 填充 TokenAttribute 这样标记的圆角
  • UIControlEventTouchDragEnter 似乎不适用于捕获滑入控件的点击

    如果手指从外部拖动到控件的边界内 我想允许调用一个方法 我以为 UIControlEventTouchDragEnter 会做到这一点 但似乎并没有 有谁知道是否有一种方法可以根据点击滑入控件来触发操作 这就是我正在尝试的 但没有接到我的
  • 具有同步功能的 iPhone 离线应用程序

    我正在考虑构建一个可以在离线状态下和在线状态下一样运行的应用程序 由于应用程序在离线状态下无法与服务器通信 因此需要进行某种程度的同步 在规划 iPhone 同步离线操作时 有哪些值得阅读和开始思考的好工具 与苹果已经提供的工具来帮助解决这
  • 为什么我不能同时在 viewWillAppear:animated 中调用 reloadData 和 deselectRowAtIndexPath ?

    我有一个 UITableView 其中的单元格在选择时将 viewControllers 推入堆栈 子视图控制器接受用户输入 然后从堆栈中弹出 当子 viewController 弹出时 我希望父 tableView 更新所选单元格的值 然
  • [UIView beginAnimations] 如何工作?

    我想知道 Cocoa Touch 中的动画是如何工作的 例如 UIView beginAnimations nil context nil UIView setAnimationDuration 1 0 view1 alpha 1 0 vi
  • UIDatePicker 仅显示月份和日期

    我想要一个UIDatePicker用户可以选择月份和日期 但不能选择年份 我知道闰年有额外的一天 所以为了简单起见 让我们把这一天扔掉 有没有办法删除年份列或有 2 个带有月 日的卷轴 其作用类似于UIDatePicker 所选月份中不存在
  • iPhone SDK 3.0 和 symbolicatecrash 相处不好?

    更新 我已经重新安装了 Snow Leopard 全新安装 完全清除了我现有的 Leopard 安装 同样的问题仍然存在 我已经尝试了多个版本的 symbolicatecrash 来解析崩溃报告中的符号 从 Apple 提供的版本 到 Al
  • 将 NSData 转换为 JSON

    我有一个NSData对象 我需要将其转换为NSDictionary object NSData data 现在我需要将其转换为NSDictionary 我如何以编程方式执行此操作 注意 我保存后NSData to the NSDiction
  • Xcode 5 部署目标仅限于 iOS 7

    What should be done for me to have the deployment target lower that 7 0 in my project preferences Now any new project I
  • 使用自动布局以编程方式添加视图会出现“NSGenericException”,原因:“无法在视图上安装约束”

    我使用添加一个视图作为子视图 self view addSubview myView 这在纵向模式下效果很好 然而 它在风景中根本不起作用 如何以编程方式添加布局约束 我的视图当前看起来像纵向矩形 我需要它在横向模式下看起来像横向矩形 我尝
  • 处于编辑模式时滑动即可删除

    我有一个使用 uitableview 的 iPhone 应用程序 我希望始终显示 重新排序 控件 并让用户滑动以删除行 我目前采取的方法是将表格视图置于编辑模式并允许在编辑模式下进行选择 self tableView editing YES
  • 带有子视图的 UIView beginAnimations

    我有一个漂亮且简单的视图 缩放 动画 它以一个点开始并动画到全屏尺寸 UIView beginAnimations nil context NULL UIView setAnimationBeginsFromCurrentState YES
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会

随机推荐