我可以以编程方式在资产目录之间切换吗?

Sta*_*ger 5 xcode objective-c interface-builder ios swift

在我的应用程序中有一个设置,您可以选择“猫”或“狗”。根据此设置,应用程序中的所有图像都应该不同:图标、背景等

\n\n

我不想为所有图像创建单独的出口并编写将替换这些图像的代码。是否有一种机制允许我有条件地使用一组图像或另一组图像,具体取决于我的内部变量。

\n\n

最接近我需要的是 iOS 资产目录支持深色外观 \xe2\x80\x94 我的应用程序中的所有图像(包括通过界面生成器设置的没有插座的图像)都会被神奇地替换,具体取决于应用程序外观。我想要相同的行为,但基于我的内部设置。

\n

小智 1

在 iOS 和 Xcode 中都不能以编程方式在资产目录之间进行切换(至少不能以您所描述的方式),因此必须使用一些解决方法。原因是应用程序包中的所有 xcasset 都已加载,您可以在运行时使用其中任何一个的图像,而无需指定资源的选项。iOS Resources Bundle它可以通过使用XCAssets来实现:

  • 创建两个Resource Bundles,根据您的需要命名它们,它们将代表您所在州的数据集合。
  • 在每个包中添加*.xcassets并分配图像
  • 创建一个代表应用程序状态的枚举

`

enum AppState {

    case dog
    case cat

    var bundle: Bundle {
      switch self {
      case .dog:
        return Bundle(identifier: "com.dog")!
      case .cat:
        return Bundle(identifier: "com.cat")!
    }
}
Run Code Online (Sandbox Code Playgroud)

`

就是这样,瞧。当然,您可以通过扩展图像来使您的生活更轻松。我想您会使用相同的图像名称,只有状态会改变。

extension UIImage {
  func getImage(named: String, state: AppState) {
    return UIImage(named: named, in: state.bundle!)
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这是您所需要的。