2

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

例如:

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

我不能使用 IBOutlets,因为我事先不知道 XIB 文件的内容;这是一个应该在任何 XIB 上工作的类,而不仅仅是一个特定的类。

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

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

4

3 回答 3

1

至少在 OS 3 中,您可以覆盖 UIImageNibPlaceholder 的 initWithCoder:。将其替换为以下内容:

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

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

于 2010-08-09T18:22:15.613 回答
0

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

于 2011-03-13T03:11:08.973 回答
0

调配私有类(UIImageNibPlaceholder)的方法不是一个好主意。

但是你可以重载它的超类(UIImage)的方法。似乎 UIImageNibPlaceholder 没有实现“awakeAfterUsingCoder”,所以你可以安全地做到这一点,直到有一天苹果做到了。

#import "UIImage+xib.h"

@implementation UIImage (xib)

- (id)awakeAfterUsingCoder:(NSCoder *)coder{
  NSString* imageName = [coder decodeObjectForKey:@"UIResourceName"];
  if(imageName){
     return [UIImage imageNamed:imageName];
  }
  return self;
}

@end
于 2021-08-17T09:51:36.757 回答