带有 Core Graphics 绘图的 Core Animation

Posted

技术标签:

【中文标题】带有 Core Graphics 绘图的 Core Animation【英文标题】:Core Animation with a Core Graphics drawing 【发布时间】:2009-01-14 08:58:04 【问题描述】:

我在一个 UIView 子类中(下面代码中的 CustomView)。

我正在 UIImageView 子类 (containerView) 中的图像周围绘制边框。核心图形代码位于子类的drawInRect: 中。

Core Animation 过渡是一个翻转,但是在绘制它时,不使用 Core Graphics 代码,即不调用 drawInRect: 来为 CALayer 提供我的渲染图像。

相反,我在没有任何核心图形绘制的情况下将动画从一个图像传递到另一个图像。

如何允许 CALayer 使用我的 Core Graphics 绘图而不是原始图像进行动画处理?

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];

【问题讨论】:

【参考方案1】:

好的,是的,我正在实现 drawRect:,是的,我的绘图在过渡之外工作。

问题在于 UIImageView 子类中的 drawRect: 没有被 CALayer 调用以进行绘图。

因此,当我将这个子类的父类切换为UIView,实现了我自己的图像属性,并调整了动画 - 一切都融合在一起了。

上述代码中动画的containerView 已更改为普通的UIView 实例。动画代码必须稍作更改以适应这一点:

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView addSubview:aViewSubclass];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[aViewSubclass removeFromSuperview];
[containerView addSubview:anotherInstanceOfTheViewSubclass];
[CustomView commitAnimations];

即来自 Apple 的有关此类转换的文档:

如果你想改变外观 过渡期间的视图——对于 例如,从一个视图翻转到 另一个——然后使用容器视图,一个 UIView的实例,如下:

    开始一个动画块。 在容器视图上设置过渡。 从容器视图中删除子视图。 将新的子视图添加到容器视图中。 提交动画块。

【讨论】:

【参考方案2】:

您正在实施drawRect:,而不是drawInRect:,对吗?另外,您是否验证过在此过渡之外,它确实有效?

你能粘贴你的drawRect:implementation 吗?我只是担心 UIImageView 直接设置其图层的内容,而不是依靠drawRect: 来做,这意味着你的drawRect: 不起作用。

事实上,考虑到这实际上是多么简单,我建议你只继承 UIView 而不是 UIImageView。在缩放图像以进行绘图时保持纵横比的数学非常简单。

当然,另一种选择是继承 UIImageView,然后重写 setImage: 以基于第一个图像创建一个新图像,但在其周围绘制一个边框,然后将其传递给 super。这样你就不用对drawRect: 做任何事情了。

【讨论】:

以上是关于带有 Core Graphics 绘图的 Core Animation的主要内容,如果未能解决你的问题,请参考以下文章

媒体层:Core Graphics(绘图)

iOS绘图—— UIBezierPath 和 Core Graphics

Core Graphics框架 利用Quartz 2D绘图

使用 Core Graphics 绘图在 Retina 显示屏上看起来很厚实

使用 Core Graphics 绘制圆弧时绘制的额外线

使用 Core Graphics 绘制带有减去文本的路径