iOS 13 `withTintColor` 不服从我分配的颜色

标签 ios swift uiimage ios13

我发现新的 iOS 13 UIImage 属性 withTintColor(_:renderingMode:) 的行为难以理解。它有什么用,它与图像出现的上下文的色调颜色有什么关系?

例如:

let im = UIImage(systemName:"circle.fill")?.withTintColor(.red)
let iv = UIImageView(image:im)
iv.frame.origin = CGPoint(x: 100, y: 400)
self.view.addSubview(iv)

我说的是.red。但它是蓝色的:

enter image description here

显然它是蓝色的,因为它的颜色来自周围环境的色调。但是,为图像本身赋予色调颜色有什么意义呢?

但它变得更加奇怪。我将绘制自己的图像并为赋予色调颜色:

let sz = CGSize(width: 20, height: 20)
let im = UIGraphicsImageRenderer(size:sz).image { ctx in
    ctx.cgContext.fillEllipse(in:CGRect(origin:.zero, size:sz))
}.withTintColor(.red)
let iv = UIImageView(image:im)
iv.frame.origin = CGPoint(x: 100, y: 400)
self.view.addSubview(iv)

我说 .red 它是红色的:

enter image description here

不一致的原因是什么?

最佳答案

withTintColor 可能主要用于符号图像,它们始终被视为模板并且没有自己的颜色。然而,能够将普通图像视为模板并为其赋予颜色也是非常好的。

假设您正在自定义 UIView 的 draw(_:) 方法中绘图,或者在 UIImageView 图形上下文中绘图。模板 View 一直存在问题;您在这里无法访问它们的模板行为,因此无法对它们进行着色。 withTintColor 解决了这个问题。

但是,毫无疑问,当您以任何其他方式使用这些方法时,它们的行为会非常奇怪:

  • 只要您说withTintColor,生成的图像就会被视为模板图像,即使您说.alwaysOriginal .所以您的渲染模式现在被忽略了!

  • 此外,在已经有 tintColor 的上下文中,现在可以有两种竞争的色调颜色:上下文颜色(周围 View 或继承了 tintColor) 以及当您说 withTintColor 时图像的继承。如果这是一个模板图像——一个符号图像,或者一个.alwaysTemplate图像,或者像按钮这样的模板上下文中的图像——那么上下文的 tintColor 获胜,您通过说 withTintColor 特别应用的颜色 将被忽略!!

例如,即使您专门将符号图像的色调颜色设置为红色,这也会产生蓝色符号图像(因为默认 ImageView tintColor 是蓝色):

let im = UIImage(systemName:"circle.fill")?.withTintColor(.red)
let iv = UIImageView(image:im)

要获得红色符号图像,您必须这样说:

let im = UIImage(systemName:"circle.fill")?.withTintColor(.red,
    renderingMode: .alwaysOriginal)

所以在第一个代码中,您指定的色调颜色被忽略(我们得到蓝色,而不是红色),但在第二个代码中,您指定的渲染模式被忽略(它仍然是一个模板图像,但现在它是根据要求为红色)。很奇怪,嗯?

(我很难相信这是预期的行为,我已经提交了一个错误,但到目前为止苹果还没有回应。)

关于iOS 13 `withTintColor` 不服从我分配的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867627/

相关文章:

ios - 延迟任务直到完成

ios - 如何在 iOS 中更改部分透明图像的颜色?

ios - 如何使用 react 导航触发状态更新?

ios - 用于设置颜色的iOS宏

ios - 每 n 天安排一次本地通知(时区安全)

ios - Swift:将 UIImage 设置为背景

ios - 如何在 ios 的 nsuserdefaults 中保存相机捕获的图像

ios - “The application does not have a valid signature” 在 XCode 5 中显示每一秒

ios - NSPersistentContainer 不创建数据库文件

swift - 后台获取中多个异步请求的最佳实践是什么?