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

Posted

技术标签:

【中文标题】iOS 13`withTintColor`不服从我分配的颜色【英文标题】:iOS 13 `withTintColor` not obeying the color I assign 【发布时间】:2019-11-14 22:42:07 【问题描述】:

我发现新的 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。但它是蓝色的:

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

但它变得更加奇怪。我会画出我自己的图像并给 it 着色:

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,它是红色的:

导致不一致的原因是什么?

【问题讨论】:

【参考方案1】:

withTintColor 可能主要用于仅与符号图像一起使用,这些图像始终被视为模板并且没有自己的颜色。不过,能够把一张普通的图片当做模板,给它上色,也是很不错的。

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

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

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

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

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

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

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

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

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

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

【讨论】:

同意,与旧 API 相比,默认行为零意义。模板图像不再被视为这样 从文档中,这可以澄清:对于位图图像,此方法使用 CGBlendMode.destinationIn 模式绘制背景色调颜色,然后是图像内容。对于符号图像,此方法返回始终使用指定色调颜色的图像。

以上是关于iOS 13`withTintColor`不服从我分配的颜色的主要内容,如果未能解决你的问题,请参考以下文章

项目管理之道之团队管理,团队成员不服从怎么办

服从(0,1)上的均匀分布是啥意思,脂肪肝不均匀分布是啥意思

巴西菲勒这种狗怎么样,服从性啊,各方面?

(转)使用K-S检验一个数列是否服从正态分布两个数列是否服从相同的分布

1013少数服从多数

高手进,c语言中如何得到服从正态分布的随机数?