在下面的例子中,有两个UIImageViews具有相同的设置和相同的模板图像...但是一个着色图像,一个没有
我重复工作UIImageView
并将其放置而不是另一个并且它有效。这发生在我身上多次,这个解决方案总能奏效,但我仍然想知道我做错了什么?它可以是Xcode错误吗?你有类似的事吗?我有Xcode 8.1。
答案 0 :(得分:95)
简易修复解决方案:
只需添加一个新的运行时属性,该属性将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)外,所有插座的颜色都不是默认的。我尝试了所有建议的答案,但是通过选择默认的色调颜色以编程方式对其进行更改,此问题得以解决。
可能是个错误吗?
答案 9 :(得分:0)
正如@richardjsimkins所提到的,这似乎至少在某些情况下与约束有关。就我而言,我想将图像添加到启动屏幕的中央,因为在这种情况下,我无法以编程方式设置tintColor。我必须找到一个纯粹的Storyboard解决方案。
我发现在以约束为中心的图像视图居中时未设置tintColor,即在安全区域中水平/垂直居中,这与它没有“到最近邻居的间距”约束相对应。
相反,我向安全区域的前/后/顶部/底部添加了带有约束的堆栈视图,然后将图像视图嵌入到具有对齐中心,分布填充的安全区域中。这解决了与将imageView直接在安全区域中居中相同的位置,并使tintColor生效。
我不喜欢不得不使用堆栈视图来强制tintColor起作用,但是我认为这是解决该错误的一个很小且非常干净的解决方法。
答案 10 :(得分:0)
答案 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
。