UIImageView并不总是着色模板图像

时间:2016-12-13 12:42:05

标签: ios objective-c xcode uiimageview

在下面的例子中,有两个UIImageViews具有相同的设置和相同的模板图像...但是一个着色图像,一个没有

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

Xcode screenshot

Xcode screenshot

12 个答案:

答案 0 :(得分:95)

简易修复解决方案:

enter image description here

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

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

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

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

答案 1 :(得分:36)

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

import UIKit

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

答案 2 :(得分:23)

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

如果你只有一个"间隔到最近邻居"约束UIImageView的两个(或一个)边,无论UIImage.renderingMode的值设置如何,都不会应用色调。

如果你有一个"与最近邻居的间距"约束UIImageView的三个(或所有)边,如果UIImage.renderingMode设置为.alwaysTemplate,则会应用色调。

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

答案 3 :(得分:15)

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

答案 4 :(得分:12)

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

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

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

答案 5 :(得分:6)

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

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

答案 6 :(得分:2)

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

final class TintedImageView: UIImageView {

    // WORKAROUND: Template images are not tinted when set using the Interface Builder.
    override func layoutSubviews() {
        super.layoutSubviews()
        let preferredTintColor = tintColor
        tintColor = nil
        tintColor = preferredTintColor
    }

}

答案 7 :(得分:2)

通过删除现有的UIImageView并添加一个新的UIImageView,问题解决了。 显然,情况是您应该在将图像添加到Assets文件夹之后添加UIImageView。

答案 8 :(得分:2)

也许这会有所帮助,因为我I了一个钟头直到我意识到自己仍然不太了解。

我在.nib文件中拥有视图,除一个(UIImageView)外,所有插座的颜色都不是默认的。我尝试了所有建议的答案,但是通过选择默认的色调颜色以编程方式对其进行更改,此问题得以解决。

enter image description here

enter image description here

可能是个错误吗?

答案 9 :(得分:0)

正如@richardjsimkins所提到的,这似乎至少在某些情况下与约束有关。就我而言,我想将图像添加到启动屏幕的中央,因为在这种情况下,我无法以编程方式设置tintColor。我必须找到一个纯粹的Storyboard解决方案。

我发现在以约束为中心的图像视图居中时未设置tintColor,即在安全区域中水平/垂直居中,这与它没有“到最近邻居的间距”约束相对应。

相反,我向安全区域的前/后/顶部/底部添加了带有约束的堆栈视图,然后将图像视图嵌入到具有对齐中心,分布填充的安全区域中。这解决了与将imageView直接在安全区域中居中相同的位置,并使tintColor生效。

我不喜欢不得不使用堆栈视图来强制tintColor起作用,但是我认为这是解决该错误的一个很小且非常干净的解决方法。

答案 10 :(得分:0)

在情节提要中保留默认的色泽颜色 enter image description here

并使用您选择的颜色添加用户定义的运行时属性 enter image description here

情节提要将显示具有默认色调的图像,但运行时,它将显示您选择的颜色。

答案 11 :(得分:0)

我在XCode 10.3中遇到了这个问题。这是一个XCode错误,似乎与在将图像添加到资产之前将图像添加到情节提要有关。

帮助我的是将色调颜色更改为某种随机颜色,然后将其更改为默认颜色。

结果是XCode将<color key="tintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>添加到了以前没有的情节提要XML中。尽管将其添加为colorSpace="custom",但XCode构建器将其显示为default