2

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

我在 UIImageView 子类(containerView)中的图像周围绘制边框。为此,Core Graphics 代码位于drawInRect:子类内部。

核心动画转换是一个翻转,但是当它被绘制时,核心图形代码没有被使用,即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];
4

2 回答 2

3

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

问题是drawRect:UIImageView子类内部没有被 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 的一个实例,如下所示:

  1. 开始一个动画块。
  2. 在容器视图上设置过渡。
  3. 从容器视图中移除子视图。
  4. 将新的子视图添加到容器视图。
  5. 提交动画块。
于 2009-01-15T08:09:16.260 回答
2

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

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

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

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

于 2009-01-14T11:20:07.980 回答