ios - 在框架中覆盖 Storyboard中的图像

标签 ios objective-c swift ios10 ios-app-extension

我有一个包含 Storyboard和一组默认图像的框架。该框架可以包含在多个应用程序中,其目的是应用程序可以在需要时使用自己的变体覆盖所有默认图像。

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

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

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

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

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

有没有一种方法可以成功涵盖这三种情况:

默认图像在框架中,应用 A 和应用 B 都不想用他们的自定义图像覆盖它 默认图像在框架中,应用程序 A 想要覆盖它,但应用程序 B 没有。 默认图像在框架中,应用程序 A 和应用程序 B 都想用自己的变体覆盖它。 (我有一个大型 Storyboard,框架中有几十张图片,理想情况下,我希望有一个解决方案,如果可能的话,根本不涉及任何代码 - 即默认图像名称是通过 Xcode 的属性检查器为 ImageView 设置的,如果应用程序在其 Assets 目录中提供自己的图像版本,该图像会自动显示)

最佳答案

此代码有效,但看起来有点笨拙,如果有一个可能的无代码解决方案,那就太好了——例如,只需使用 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")

关于ios - 在框架中覆盖 Storyboard中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39006955/

相关文章:

ios - 将动画叠加图像添加到视频

ios - 如何更改导航返回项功能,返回rootView

ios - 如何有条件地使 StackView 中的图像居中

iphone - 当输入文本时,UITextView 在 UIScrollView 内部滚动父级

iphone - 如何 "cancel"一个 UIStoryBoardSegue

objective-c - AppleScriptObjc 中的@autoreleasepool 与 ARC

objective-c - 我应该释放这个 NSString 吗?

objective-c - 调整 UITableViewCell 的 contentView 大小时 UILabel 的过渡效果

ios - 在从函数返回之前等待 Firebase 加载

swift - 为什么将 void 赋给局部变量