如何在 Xcode 6 Interface Builder 中使用模板渲染模式?

Posted

技术标签:

【中文标题】如何在 Xcode 6 Interface Builder 中使用模板渲染模式?【英文标题】:How to use template rendering mode in Xcode 6 Interface Builder? 【发布时间】:2014-09-23 14:41:31 【问题描述】:

我正在尝试使用在 Interface Builder 中启用了模板渲染模式的图像,但我无法让它工作。使用按钮一切正常,但使用 ImageViews tintColor 不适用于图像。

我在图像资源中启用了“矢量类型”(我使用的是 pdf)和“渲染为模板图像”。我做错了什么?

【问题讨论】:

这个问题与Modify UIImage renderingMode from storyboard/xib file重复 【参考方案1】:

我遇到了同样的问题。我认为这是一个错误。

你可以复制这个雷达http://openradar.appspot.com/radar?id=5334033567318016,它指的是这个最小的示例应用https://github.com/algal/TemplateImagesBrokenDemo。

我知道这个问题有两种解决方法

包裹在 UIButton 中

由于 tintColor 适用于 UIButton,一种解决方法是使用自定义类型的 UIButton,而不是 UIImageView,而 userInteractionEnabled=false。如果您使用 UIView.userInteractionEnabled(而不是使用 UIControl.enabled)禁用按钮的交互性,则不会更改图像的外观。

在代码中手动重新设置图片

另一种解决方法是在从笔尖加载 UIImageView 后,在代码中重新设置 .image 属性。这是有效的,因为在代码中设置图像似乎是触发模板逻辑的原因。为此,您需要以不会在编译器中优化的方式将图像重新设置为其现有值。 awakeFromNib 中这样的 sn-p 对我有用:

override func awakeFromNib() 
  super.awakeFromNib()

  if shouldSetImagesManually 
    // the following three-lines should in theory have no effect.
    // but in fact, they ensure that the UIImageView
    // correctly applies its tintColor to the vector template image

    let image = self.templateImageView.image
    self.templateImageView.image = nil
    self.templateImageView.image = image
  

【讨论】:

所以,这确实是一个错误。感谢您确认。好吧,这可能是一种解决方法,只需注意按钮不得为自定义按钮以获取 tintColor。 我认为你可能错了。在 github 链接的示例应用程序中,按钮是自定义的,它确实获得了 tintColor。 我发现在 UIImageView 上调用tintColorDidChange 就足够了。 Jaroslav 解决方案可用于修复 UIImageView 扩展的问题:gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac ios 11 仍未修复。【参考方案2】:

在我的情况下,如果应用程序是使用 iOS8 SDK 构建并在 iOS 7 上运行,则会出现问题。

我的解决方法是:

// this is the code that *should* work and does so on iOS 8
UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3];
[self.iconImageView setTintColor:tintColor];
self.iconImageView.image = [self imageForIconImageView]; // image is loaded from a pdf-resource (asset catalog set as Template) with imageNamed:@"resourceName"

// this is the workaround to get tint on iOS 7    
if (!IS_IOS8_OR_HIGHER)  // macros checking iOS version*

    UIImage *templateImage = [self.iconImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    self.iconImageView.image = templateImage;


// * - macros is defined like so:
// #define IS_IOS8_OR_HIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

【讨论】:

我也有同样的问题。只要在 IB 中或以编程方式将渲染模式设置为“始终模板”,色调颜色就可以应用于 iOS 8 中的矢量图像。但在 iOS 7 中,仅当图像本身设置了渲染模式然后添加到图像视图时,色调颜色才有效。【参考方案3】:

这是我找到的最简单的无代码解决方案:

【讨论】:

【参考方案4】:

另一个似乎对我有用的解决方法是设置 controller.view 的 tintColor。要使默认系统色调颜色正常工作:

self.view.tintColor = self.view.tintColor;

就像@algal 的解决方案一样,它不应该有所作为,但确实如此。

【讨论】:

以上是关于如何在 Xcode 6 Interface Builder 中使用模板渲染模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 6 的 XIB Interface Builder 中为 Mac 应用程序分配按钮

Xcode 5 Interface Builder 设计的轻量文本在 iOS 6 上出现常规重量

Interface Builder文件中的Xcode 6未知类

XCode 6.3 错误:Interface Builder 文件中的未知类

Interface Builder 在 Xcode 6.3 中的视网膜显示屏上显得模糊

Xcode 6 Interface Builder 视图大小错误