在运行时替换从XIB加载的UIImage的内容

时间:2010-08-09 12:40:14

标签: iphone objective-c uiimageview uiimage swizzling

对于我正在开发的概念,我需要手动加载XIB文件,并使用类和实例方法调配我已经能够截取对UIImage类的调用imageCustomNamed,imageCustomWithContentsOfFile和imageCustomWithCGImage以及UIImageView的initCustomWithImage。我想要的是检测图像名称,并将其替换为动态渲染的一些内容,而不是设计时在IB中设置的内容。

例如:

当XIB有一个UIImageView对象,其Image属性设置为“About.png”时,我需要拦截该图像的加载,并根据特定条件替换另一个图像。在UIImageView对象在设计时加载图像集后,甚至可以替换图像,但看起来像用于设置UIImageView内容的UIImage的原始名称不会存储在任何地方。

我不能使用IBOutlets,因为我不知道XIB文件的内容;这个类应该适用于任何XIB而不仅仅是特定的XIB。

自定义方法实际上是在默认方法中调用的,但看起来像加载XIb时系统使用imageCustomWithCGImage接受CGImageRef作为参数;从中无法知道原点(即:图像文件名)

有关如何拦截图像加载的任何想法吗?

2 个答案:

答案 0 :(得分:1)

在OS 3中,至少可以覆盖UIImageNibPlaceholder的initWithCoder:。替换为这样的东西:

-(id)hack_UIImageNibPlaceholder_initWithCoder:(NSCoder*)coder
{
  NSString * name = [coder decodeObjectForKey:@"UIResourceName"];
  [self release];
  return [[UIImage imageNamed:name] retain];
}

如果您从其他软件包(例如框架)加载nib,我不确定会发生什么。

答案 1 :(得分:0)

也许您可以在xib文件中设置UIImageView的另一个属性,然后引用该属性?例如label或tag ...