iOS 模拟器使用模板渲染模式在透明图像上显示白色背景

iOS Simulator shows white background on transparent images with template rendering mode

我的标签栏中的图标背后显示白色背景,即使资产目录中的图像集已 "Render As" 设置为 "Template Image"。以下是一些案例:

UITabBar

上根本没有设置背景

同一图像变暗并更改对比度以突出图标后面的背景

相同的图片,但使用红色背景设置 UITabBar.appearance().barTintColor = red

这是从 Sketch 的 iOS UI 库中导出的新形状,使用 iOS 设置和所有 3 种尺寸导出:

我使用的最终 PNG

从 Pixelmator 查看的 PNG,显示透明度

图像在资产目录中以编程方式设置为模板模式。每个背景都设置了 UITabBars appearance(),我没有子类化 UITabBarController,我也没有使用故事板,这里是我用 var 名称重现这个问题的所有代码简化:

// AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    let tabBarController = UITabBarController()
    // let controllers = [...]
    tabBarController.setViewControllers(controllers, animated: false)
    UITabBar.appearance().tintColor = UIColor.brown
    UITabBar.appearance().barTintColor = // red, green, etc
    window!.rootViewController = tabBarController
    window!.makeKeyAndVisible()
    return true
}

这里是我在控制器中设置 UITabBarItem 的地方:

// The controller with the tab icon
override init(style: UITableViewStyle) {
    super.init(style: style)        
    let booImage = UIImage(named: "boo")?.withRenderingMode(.alwaysTemplate)
    self.tabBarItem = UITabBarItem(title: "Controller", image: booImage, tag: 1)
}

除了这几行代码,这是一个全新的项目,没有其他变化。似乎看到图像是一个模板,因为我可以为形状着色任何我想要的颜色,但白色背景始终存在。

根据文档,将模板图像用作 UITabBarItem 图标不需要其他步骤。任何人都知道为什么白色背景出现在 UITabBarItems 上?它与它在模拟器中的运行有什么关系吗?

UITabBar 可能有背景=白色。尝试将标签栏的背景设置为清除。您可以在情节提要中执行此操作。还有一些您可能想要扩展默认 UITabBar 并在代码中更新它的原因。

Storyboard Color

无法重现。这是我在 5s 模拟器(横向)中的应用程序 运行;没有 "white background":

完整代码如下:

// AppDelegate.swift

import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions
        launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            self.window = self.window ?? UIWindow()
            let tabBarController = UITabBarController()
            let controllers = [ViewController()]
            tabBarController.setViewControllers(controllers, animated: false)
            UITabBar.appearance().tintColor = .yellow
            UITabBar.appearance().barTintColor = .red
            self.window!.rootViewController = tabBarController
            self.window!.makeKeyAndVisible()
            return true
    }
}

// ViewController.swift

import UIKit
class ViewController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
        let booImage = UIImage(named: "ghost")?.withRenderingMode(.alwaysTemplate)
        self.tabBarItem = UITabBarItem(title: "Controller", image: booImage, tag: 1)
        self.view.backgroundColor = .white
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}