【问题标题】:Subclassing UIImage子类化 UIImage
【发布时间】:2012-05-05 21:10:50
【问题描述】:

我想创建我自己的 UIImage 子类,这将允许我创建一个可实现/可拉伸的图像,并且在四个边的每一边都有帽。

iOS 5 的 resizableImage 不适合我的需要,因为它不允许我拉伸中间部分,现在已弃用的 stretchableImage 也不适合,因为它只允许我重复一个像素,而我可能想要重复某种渐变。

到目前为止一切正常,我在-drawInRect: 中实现了自己的绘图代码,它的行为符合预期。
但是,当将我的自定义子类实例分配为UIImageView 的图像时,我的代码会中断。图像被渲染为正常的 UIImage 会。 (在所有方向上缩放,没有任何大写)

我尝试在所有四种绘图方法中设置断点(drawInRectdrawAtPoint,无论是独立的还是带有 blendMode: 的,但它们似乎没有被调用。

UIImageView 中使用UIImage 时,有没有办法为UIImage 提供自定义绘图代码,而无需子类化UIImageView

另外,我担心性能。默认的可拉伸图像在动画期间效果很好,但我想知道在为我的UIImageView 的大小属性(宽度和高度)设置动画时效果如何。我的渲染代码会在每一帧都被调用吗?

【问题讨论】:

  • 为什么不直接编写自己的 UIView 子类而不是使用 UIImageView?你可以使用你的 UIImage 子类甚至 CGImageRef 来代替。
  • 我知道我可以做到这一点,但我说我有一个大型项目,其中包含许多可拉伸图像,当不再受支持时会中断。我只是想更改调用以使其可扩展,同时保留其余代码。我不想用我自己的 UIView 替换每一个 UIImageView。

标签: ios uiimageview uiimage


【解决方案1】:

Apple Documentation 中明确表示您不能覆盖UIImageView-drawRect:,因此子类化UIImageView 也不起作用。您必须实现自己的 UIView 类。

子类化UIImage 也不起作用,我已经尝试过了,根本没有调用公共方法,甚至没有调用CGImage 的附属方法。我认为您需要覆盖一些私有 API 才能使其工作。

不用担心调整大小,您的渲染代码只会在最后一帧被调用。 尽管如此,在大多数情况下,性能还是比使用UIImageView 差。 Apple 优化了该类,使其在 GPU 上运行。

【讨论】:

  • 当我只“渲染”最后一帧时,动画如何才能流畅运行?假设我在左侧和右侧都有一个帽子,并且想让视图宽 100 像素。中心部分应调整大小,右帽向右移动。 -drawRect: 只被调用一次真的有可能吗?
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多