Art*_*nko 89 ios xcode-storyboard ios7
是否有可能修改UIImage的renderingMode从故事板或XIB编辑器?
目标是应用于tintColor特定UIImageView对象.
Ant*_*tox 188
您可以将图像渲染模式设置为不在.xib文件中,而是在.xcassets库中.
将图像添加到资源库后,选择图像并打开Xcode右侧的属性检查器.找到属性"渲染为"并将其设置为"模板".
设置图像的渲染模式后,可以UIImageView在文件.xib或.storyboard文件中添加色调颜色以调整图像颜色.
这会在图像的任何位置设置属性,而不是仅在一个界面构建器文件中,但在几乎所有情况下(我遇到过),这都是您想要的行为.

有几点需要注意:
UIImageView.我没有深入研究过这个问题.UIKitComponents如UIButtons和UIBarButtonItems中的图像.Sno*_*man 98
以下是在.xib或storyboard文件中执行此操作的方法:
(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
Run Code Online (Sandbox Code Playgroud)
(Swift 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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后在xib文件的Identity Inspector中添加运行时属性:

0xc*_*ced 43
在故事板或xib中使用模板渲染模式和UIImageView是非常错误的,在iOS 7和iOS 8上都是如此.
无法从storyboard/xib中正确解码UIImage.如果imageView.image.renderingMode在viewDidLoad方法中检查属性UIImageRenderingModeAutomatic,即使在xcassets文件中将其设置为" 渲染为模板图像",也会注意到它始终存在.
要解决此问题,您必须手动设置渲染模式:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Run Code Online (Sandbox Code Playgroud)
UIImage被正确解码,其renderingMode属性反映了在xcassets文件中选择的内容,但图像没有着色.
要解决此问题,您有两种选择:
tintColor在属性用户定义的属性运行,而不是在属性检查器面板.要么
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
Run Code Online (Sandbox Code Playgroud)
您可以选择您喜欢的选项,同时正确地着色图像.
(如果您正在使用Xcode 6.2进行编译,那么只需执行即可self.imageView.tintColor = self.imageView.tintColor;,但如果您使用Xcode 6.3进行编译,这将不再起作用)
如果您需要同时支持iOS 7和iOS 8,则需要两种解决方法.如果您只需要支持iOS 8,则只需要一种解决方法.
小智 15
将imageView RenderingMode设置为使用故事板中的色调可以简化为单行:
[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
Run Code Online (Sandbox Code Playgroud)
然后可以在故事板中设置图像和色调颜色.
nik*_*ans 13
您可以使用扩展程序修复.xib问题:
import UIKit
// fixing Bug in XCode
// http://openradar.appspot.com/18448072
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
self.tintColorDidChange()
}
}
Run Code Online (Sandbox Code Playgroud)
资料来源:https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
令人惊讶的是,这个bug已经存在了4到5年了.
你不能renderingMode从storyboard或设置xib.它可以通过编程方式访问.
例如:
UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
Run Code Online (Sandbox Code Playgroud)
在Storyboard中设置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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49524 次 |
| 最近记录: |