是否有可能修改UIImage
的renderingMode
从故事板或XIB编辑器?
目标是应用于tintColor
特定UIImageView
对象。
是否有可能修改UIImage
的renderingMode
从故事板或XIB编辑器?
目标是应用于tintColor
特定UIImageView
对象。
Answers:
您可以在.xib或情节提要文件中执行以下操作:
(OBJ-C)在上创建一个类别UIImageView
:
@interface UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode;
@end
@implementation UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode
{
NSAssert(self.image, @"Image must be set before setting rendering mode");
self.image = [self.image imageWithRenderingMode:renderMode];
}
@end
(快速4)为UIImageView
以下项创建扩展名:
extension UIImageView {
func setImageRenderingMode(_ renderMode: UIImage.RenderingMode) {
assert(image != nil, "Image must be set before setting rendering mode")
// AlwaysOriginal as an example
image = image?.withRenderingMode(.alwaysOriginal)
}
}
然后在xib文件的Identity Inspector中,添加运行时属性:
您可以不在.xib
文件中而是在.xcassets
库中设置图像渲染模式。
将图像添加到资产库后,选择图像并打开Xcode右侧的属性检查器。找到属性“渲染为”并将其设置为“模板”。
设置图像的渲染模式后,可以UIImageView
在.xib
或.storyboard
文件中向其添加色调颜色以调整图像颜色。
这会在图像的使用位置(而不是仅在一个界面生成器文件中)设置属性,但是在几乎所有情况下(我已经遇到),这都是您想要的行为。
注意事项:
UIImageView
。我还没有深入研究。UIKitComponents
为图像,UIButton
年代和UIBarButtonItem
的。UIImageView
,因此在运行应用程序时并非总是显示色调颜色。
在iOS 7和iOS 8上,在情节提要或xib中将模板渲染模式与UIImageView一起使用非常容易出错。
UIImage没有从情节提要/ xib正确解码。如果检查方法中的imageView.image.renderingMode
属性,即使将其设置为xcassets文件中的“ 作为模板图像渲染”viewDidLoad
,也会注意到它始终是。UIImageRenderingModeAutomatic
要解决此问题,您必须手动设置渲染模式:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImage已正确解码,其renderingMode
属性反映了在xcassets文件中选择的内容,但图像未着色。
要解决此问题,您有两种选择:
tintColor
在属性定义运行时用户属性而不是属性检查器窗格。要么
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
您可以选择自己喜欢的选项,都可以正确着色图像。
(如果您正在使用Xcode 6.2进行编译,则只需这样做self.imageView.tintColor = self.imageView.tintColor;
就足够了,但是如果您正在使用Xcode 6.3进行编译,那么它将不再起作用)
如果需要同时支持iOS 7和iOS 8,则需要两种解决方法。如果您只需要支持iOS 8,则只需一种解决方法。
您可以使用扩展名解决.xib问题:
import UIKit
// fixing Bug in XCode
// http://openradar.appspot.com/18448072
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
self.tintColorDidChange()
}
}
资料来源:https : //gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
令人惊讶的是,此错误已经存在了大约4-5年。
您renderingMode
无法通过storyboard
或进行设置xib
。它可以通过编程方式访问。
例如:
UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
在情节提要中设置tintColor和Class。
//
// TintColoredImageView.swift
// TintColoredImageView
//
// Created by Dmitry Utmanov on 14/07/16.
// Copyright © 2016 Dmitry Utmanov. All rights reserved.
//
import UIKit
@IBDesignable class TintColoredImageView: UIImageView {
override var image: UIImage? {
didSet {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
override init(image: UIImage?) {
super.init(image: image)
initialize()
}
override init(image: UIImage?, highlightedImage: UIImage?) {
super.init(image: image, highlightedImage: highlightedImage)
initialize()
}
func initialize() {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
修复起来很容易
只需创建类UIImageViewPDF并将其在情节提要中使用
IB_DESIGNABLE
@interface UIImageViewPDF : UIImageView
@end
@implementation UIImageViewPDF
- (void) didMoveToSuperview
{
[super didMoveToSuperview];
self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
id color = self.tintColor;
self.tintColor = color;
}
@end
另一个解决方案是创建一个UIImageView
子类:
final class TemplateImageView: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
guard let oldImage = image else { return }
image = nil
image = oldImage.withRenderingMode(.alwaysTemplate)
}
}
然后只需将“接口生成器”中的类设置为即可TemplateImageView
。
通过情节提要设置的简单方法:
@IBDesignable
public class CustomImageView: UIImageView {
@IBInspectable var alwaysTemplate: Bool = false {
didSet {
if alwaysTemplate {
self.image = self.image?.withRenderingMode(.alwaysTemplate)
} else {
self.image = self.image?.withRenderingMode(.alwaysOriginal)
}
}
}
}
在iOS 10和Swift 3上正常运行
如果创建IBOutlet,则可以像这样在awakeFromNib方法中对其进行更改...
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
虽然@Moby的答案更正确-这可能更简洁。