Cocoa touch 具有核心图形绘图的核心动画

Cocoa touch 具有核心图形绘图的核心动画,cocoa-touch,core-animation,core-graphics,Cocoa Touch,Core Animation,Core Graphics,我在UIView子类(下面代码中的CustomView)中 我正在UIImageView子类(containerView)中的图像周围绘制边框。该类的核心图形代码位于子类的drawInRect:中 核心动画过渡是翻转,但在绘制时,不会使用核心图形代码,即不会调用drawInRect:为CALayer提供渲染图像 相反,我得到的动画从一个图像到另一个没有任何核心图形绘制发生 如何允许CALayer使用我的核心图形绘制而不是原始图像来设置动画 [CustomView beginAnimations:

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

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

核心动画过渡是翻转,但在绘制时,不会使用核心图形代码,即不会调用
drawInRect:
为CALayer提供渲染图像

相反,我得到的动画从一个图像到另一个没有任何核心图形绘制发生

如何允许CALayer使用我的核心图形绘制而不是原始图像来设置动画

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

您正在实现
drawRect:
,而不是
drawInRect:
,对吗?另外,您是否验证了在这个转换之外,它实际上是有效的

你能粘贴你的
drawRect:
实现吗?我只是担心UIImageView直接设置其层的内容,而不是依赖
drawRect:
来完成,这意味着您的
drawRect:
无法工作

事实上,考虑到这实际上是多么简单,我建议您将UIView子类化,而不是UIImageView。在为绘图缩放图像时,保持纵横比的数学方法非常简单


当然,另一个选项是将UIImageView子类化,然后重写
setImage:
,以基于第一个图像创建新图像,但在其周围绘制边框,然后将其传递给super。这样,您就不必对
drawRect:
做任何事情。

好的,是的,我实现了
drawRect:
,是的,我的绘图在转换之外工作

问题是,CALayer没有为图形调用
UIImageView
子类中的
drawRect:

因此,当我将这个子类的父类切换到
UIView
时,实现了我自己的图像属性,并调整了动画-所有内容都在一起

上面代码中动画的
containerView
已更改为vanilla
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];
也就是说,从苹果的文档中可以看出这些类型的转换:

如果要更改外观 在视图的转换期间对视图的 例如,从一个视图翻转到另一个视图 另一个则使用容器视图 UIView的实例,如下所示:

  • 开始一个动画块
  • 在容器视图上设置转换
  • 从容器视图中删除子视图
  • 将新子视图添加到容器视图
  • 提交动画块