如何在 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 文件中的未知类