UIImageView并不总是着色模板图像

Zuz*_*lis 47 xcode objective-c uiimageview ios

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

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

Xcode截图

Xcode截图

Dav*_*ees 121

易修复解决方案:

在此输入图像描述

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

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

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

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

  • 惊人的,令人震惊的是,这是有效的.但它的确如此.谢谢,大卫! (9认同)
  • 最后的注释是它起作用的原因,谢谢大卫! (4认同)
  • 不幸的是,这在LaunchScreen.storyboard中是不可能的.但它很好,它在普通的故事板中工作. (2认同)
  • 阅读最后的笔记! (2认同)
  • 非常感谢,它确实解决了问题。但是现在我想知道,我应该如何向下一位开发人员解释自己?:O (2认同)

all*_*ire 50

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

import UIKit

extension UIImageView {
    override open func awakeFromNib() {
        super.awakeFromNib()
        tintColorDidChange()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,这并未标记为答案..这是我在所有项目中唯一一致的工作*和*它适用于所有图像视图.好的解决方案,谢谢! (4认同)
  • 解决此问题的简单解决方案.运行时属性修复程序对我来说也不起作用,这使我仍然可以按照预期使用Interface Builder中的设置.希望新版本的xCode能解决这个问题. (3认同)

ric*_*ins 24

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

如果在您的两侧(或一侧)上只有"最近邻居间距"约束,UIImageView那么无论设置的值如何,都不会应用色调UIImage.renderingMode.

如果在您的三个(或所有)边上有"间隔到最近邻居"约束,UIImageView则如果UIImage.renderingMode设置为,则应用色调.alwaysTemplate.

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

  • 这永远不会让我感到惊讶.典型的苹果风格的废话,仍然在他们的代码多年,似乎没有人关心.这不是我们必须付出代价来工作......哦等等 (11认同)
  • 哇.非常感谢@richardjsimkins揭露这一点.这是Xcode 9中的一个错误(为什么约束会影响图像渲染模式?).我填写了rdar:// 34279759 http://www.openradar.me/radar?id=5005434293321728,并鼓励你欺骗,以便快速修复. (4认同)

Par*_*ram 17

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

  • 2017年仍然很奇怪为什么会如此. (13认同)
  • 现在,2018 年年中,仍然是同样的问题。雷达已满。:'( (2认同)
  • 2019 年依然强劲 (2认同)

小智 15

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

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

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

  • 这也对我有用。将tintColor设置为情节提要中的默认值,然后在代码中进行设置至关重要。 (2认同)

Min*_*ina 6

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

extension UIImageView {
    @IBInspectable var imageColor: UIColor! {
        set {
            super.tintColor = newValue
        }
        get {
            return super.tintColor
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 好的扩展.顺便说一下,不需要在getter或setter中使用'super'. (3认同)

Mar*_*ato 5

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

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
    }

}
Run Code Online (Sandbox Code Playgroud)