UIImageView并不总是着色模板图像

在下面的情况下,有两个UIImageViews具有相同的设置和相同的模板图像…但一个色调图像,一个不

我重复工作UIImageView并将其放置而不是另一个并且它工作。 这发生在我身上多次,这个解决方案总能奏效,但我仍然想知道我做错了什么? 可以是xcode bug吗? 发生过类似事情吗? 我有Xcode 8.1。

在此处输入图像描述

在此处输入图像描述

易修复解决方案:

在此处输入图像描述

只需添加一个新的运行时属性,它将UIImageView的tintColor设置为指定的颜色,并确保图像着色。

您仍然需要将图像设置为在Images.xcassets文件中呈现为模板图像。

这样您就不需要任何额外的sockets,扩展或代码行。

另请注意:如果视图上的tintColor颜色相同,则不会在用户定义的属性中应用tintColor,它们必须不同。

问题源于没有空状态的色调值(在Storyboard / Interface Builder UI中)。 为了让XCode决定是否应该将色调应用于UIImageView ,似乎还有一个额外的测试。 在XCode中,这显然是通过评估应用于UIImageView的约束来完成的。 据我所知,这个测试没有记录。

如果在UIImageView两侧(或一侧)上只有“最近邻居间距”约束,则无论为UIImage.renderingMode设置的值如何,都不会应用该色调。

如果在UIImageView三个(或所有)边上有“最近邻居间距”约束,则在UIImage.renderingMode设置为.alwaysTemplate应用色调。

在纯粹的Storyboard / Interface Builder方法中,您可以通过将图像添加到资产目录,然后将图像集的“渲染为”属性更改为“模板图像”来设置图像的UIImage.renderingMode

尝试以编程方式设置tintColor,它为我解决了问题。

我认为UIImageView中存在一个错误。 如果在故事板中设置了色调,即使资源设置为呈现为模板,它也不会应用该色调。

解决方法是将色调颜色应用于故事板中的UIImageView的父视图。

或者,将tintColor设置为nil,然后通过将UIImageView绑定到sockets再将其设置为代码。

使用此扩展从界面构建器设置UIImageView tintColor。

 extension UIImageView { @IBInspectable var imageColor: UIColor! { set { super.tintColor = newValue } get { return super.tintColor } } } 

我发现最好的解决方案不需要子类或其他IBInspectable属性:

 import UIKit extension UIImageView { override open func awakeFromNib() { super.awakeFromNib() self.tintColorDidChange() } } 

运行时属性技巧对我不起作用。 我做这个课只是为了修理这种东西。 您只需将所有有问题的图像视图设置为此类。

 final class TintedImageView: UIImageView { // WORKAROUND: Template images are not tinted for image views added using the Inteface Builder. override func layoutSubviews() { super.layoutSubviews() let preferredTintColor = tintColor tintColor = nil tintColor = preferredTintColor } }