【问题标题】:Override UIImage imageNamed - what are my options?覆盖 UIImage imageNamed - 我有什么选择?
【发布时间】:2013-02-13 20:08:23
【问题描述】:

基本上我的代码大量使用[UIImage imageNamed],它默认从应用程序包中获取图像。

现在我希望从 Documents(或库或其他)深处的目录中返回图像,而不是从主包中返回。并且由于 imageNamed 调用的实例太多,因此我正在考虑扩展(读取替换) UIImage ImageNamed 实现。

我已经通过this,但无法完全弥补我应该做什么,什么是最好的:

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

我也不知道我是否需要处理@2x 图像。我当前的捆绑包包括其中的一堆,我想我的实现也必须处理它。但不确定如何。

【问题讨论】:

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


    【解决方案1】:

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

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

    没有必要为你想要做的事情子类化 UIImage,因为你不需要实例方法。

    【讨论】:

    • 您的建议是不要替换默认的 imageNamed。但是我什至不需要 UIImage 上的类别,因为 imageNamed 是类方法,而不是实例方法。我想要的只是来自特定路径的 UIImage,甚至可以从我自己的类方法中返回。不必在 UIImage 上。但我正在寻找更优雅的方法,以最大限度地压缩 OOPS。正如我在发布的链接中所显示的那样,这并不少见。无论如何感谢您的意见。
    • 你是对的。如果 swizzling,imageNamed 中确实存在未记录的错误。我在 dealloc 上遇到崩溃。
    【解决方案2】:

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

    【讨论】:

    • 请参考我的cmets到@melsam。
    【解决方案3】:

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

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

    【讨论】:

    • 虽然我知道 imageWithContentsOfFile 解决方案并将其视为我最后的手段,但您仍然为我解决了这个问题,并为此投了赞成票。但是我仍然对可能的 UIImage 扩展感到好奇。所以保持这个问题的开放性。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多