覆盖UIImage imageNamed - 我的选择是什么?

时间:2013-02-27 20:37:44

标签: ios objective-c uiimage objective-c-category imagenamed

基本上我的代码大量使用[UIImage imageNamed],默认情况下会从应用包中提取图片。

现在我想要从Documents(或库或其他)深处的目录中返回图像 - 而不是主束。由于有很多imageNamed调用实例,我正在考虑为此目的扩展(读取替换)UIImage ImageNamed实现。

我已经完成了this,但无法完全理解我应该做什么,以及什么是最好的:

  1. 制作UIImage类别
  2. 创建UIImage的子类
  3. 方法调整
  4. 我也不知道是否需要照顾@ 2x图像。我目前的捆绑包包括一堆,我想我的实现也必须要处理它。但不确定如何。

3 个答案:

答案 0 :(得分:5)

最干净,最优雅,最容易维护的长期解决方案是在UIImage上使用类别。在UIImage上定义自定义方法,然后使用Find&替换以将所有imageNamed调用替换为新方法。

不要使用调配(它会引入奇怪的,未记录的错误),并且很难维护或调试。 (另外,如果你调侃,它会在想要使用imageNamed的默认实现的地方中断)。

由于您不需要实例方法,因此无需为您尝试执行的操作创建UIImage的子类。

答案 1 :(得分:1)

如果这是从文档目录中检索图像的唯一问题,请尝试:

[UIimage imageWithContentsOfFile:yourFilePath];

//您可以使用这些方法来检索文件路径

- (NSString *) rootPath{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
}

- (NSString *) pathFoResourse : (NSString *) resourseName ofType: (NSString *)type{
    NSString *path = [[self rootPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", resourseName, type]];
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        path = [[NSBundle mainBundle] pathForResource:resourseName ofType:type];
    }
    NSLog(@"**path:%@**", path);
    return path;
}

答案 2 :(得分:0)

最好和最简单的方法是使用Category。它使代码可读。 子类可能会在工作期间使您感到困惑 这个Question将向您解释为什么不使用Method Swizzling