2013-02-27 17 views
1

基本上我的代码大量使用[UIImage imageNamed],它默认从应用程序包中获取图像。覆盖UIImage imageNamed - 我的选择是什么?

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

我已经通过this去,但不能完全弥补我应该怎么做的,什么是最好的:

  1. 制作的UIImage
  2. 的类别
  3. 创建的UIImage
  4. 方法混写的子类

我也不知道是否必须照顾@ 2x图像。我目前的捆绑包包括他们一堆,我想我的实现也将不得不照顾它。但不知道如何。

回答

5

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

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

因为您不需要实例方法,所以不需要为您要执行的操作创建子类UIImage。

+0

你所建议的不是取代默认的imageNamed。但由此我甚至不需要在UIImage上的类别,因为imageNamed是类方法,而不是实例方法。我所需要的就是一个来自特定路径的UIImage,它可以从我自己的类方法中返回。不必在UIImage上。但是我正在寻找一些更优雅的方法,以最好的方式挤压OOPS。正如我在发布的链接中所显示的那样,这并不罕见。无论如何感谢您的投入。 – 2013-02-28 05:29:18

+0

你说得对。如果打晕,imageNamed中确实存在未公开的错误。我在dealloc上崩溃了。 – mafonya 2014-08-28 11:08:56

0

最好的和最简单的方法是使用类别。它使代码可读。 子类可以工作 这Question期间迷惑你会向你解释为什么没有使用方法混写

+0

请参阅我对@melsam的评论。 – 2013-02-28 05:30:02

1

如果是从文件目录尝试retrive图像唯一的问题:

[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; 
} 
+1

虽然我知道imageWithContentsOfFile解决方案,并且正在考虑将它作为我的最后手段,但您仍然可以为我解决此问题,并为此向您提供帮助。不过,我仍然对可能的UIImage扩展感到好奇。所以保持这个问题的开放。 – 2013-02-28 07:45:25