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,显示透明度
图像在资产目录中以编程方式设置为模板模式。每个背景都设置了 UITabBar
s 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")
}
}
我的标签栏中的图标背后显示白色背景,即使资产目录中的图像集已 "Render As" 设置为 "Template Image"。以下是一些案例:
UITabBar
同一图像变暗并更改对比度以突出图标后面的背景
相同的图片,但使用红色背景设置 UITabBar.appearance().barTintColor = red
这是从 Sketch 的 iOS UI 库中导出的新形状,使用 iOS 设置和所有 3 种尺寸导出:
我使用的最终 PNG
从 Pixelmator 查看的 PNG,显示透明度
图像在资产目录中以编程方式设置为模板模式。每个背景都设置了 UITabBar
s 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")
}
}