【问题标题】:How to override images in a storyboard which is within a framework如何覆盖框架内故事板中的图像
【发布时间】:2016-07-28 16:55:29
【问题描述】:

我有一个包含故事板和一组默认图像的框架。 该框架可以包含在多个应用程序中,其目的是应用程序可以根据需要使用自己的变体覆盖任何、部分或全部默认图像。

我面临的问题是我还没有找到适用于所有场景的解决方案,例如: 如果框架包含一个名为 Person 的图像,并且该框架由应用程序 A 使用,应用程序 A 提供了它自己的 Person 版本,而该框架由应用程序 B 使用,而应用程序 B 不提供自己的 Person 版本,则:

如果框架使用如下代码设置图片:

    let image = UIImage.init(named: "Person")
    someImageView.image = image

然后,当应用程序 A 运行时,它的 Person 图像变体被找到并正确显示。 (应用 A 在其资产目录中有其 Person 的变体) 但是,当应用程序 B 运行时,不会显示任何内容。

另一方面,如果我不使用代码设置图像(即它在 Xcode 的故事板图像视图的属性检查器中设置),那么当运行应用程序 B 时,现在默认框架图像会正确显示,但是现在应用程序不显示 A 的自定义 Person 图片。

有没有办法可以成功覆盖这三种场景:

  1. 默认图像在框架中,既不是应用程序 A 也不是应用程序 B 希望用他们的自定义图像覆盖它
  2. 默认图片在 框架和应用 A 想要覆盖它,但应用 B 不想。
  3. 默认图像在框架中,应用 A 和应用 B 都想要 用他们自己的变体覆盖它。

(我在框架中有一个包含几十个图像的大型故事板,理想情况下,如果可能的话,我希望有一个完全不涉及代码的解决方案 - 即默认图像名称是通过 Xcode 的图像视图属性检查器设置的如果应用在其资产目录中提供了自己的图像版本,则该图像会自动显示)

【问题讨论】:

    标签: ios frameworks storyboard


    【解决方案1】:

    此代码有效,但似乎有点笨拙,如果有可能的无代码解决方案,那就太好了 - 例如,只需使用 xcode/storyboard 设置。

    extension UIViewController {
        func getImage(name:String) -> UIImage?
        {
            var bundle = Bundle.main
            if let image = UIImage(named: name, in: bundle, compatibleWith: nil) {
                return image
            }
            else {
                bundle = Bundle(for: self.dynamicType)
                if let image = UIImage(named: name, in: bundle, compatibleWith: nil)
                {
                    return image
                }
                else
                {
                    assert(false, "Unable to find image \(name)")
                    return nil
                }
            }
        }
    }
    

    ...

     theImage.image = getImage(name: "Person")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多