从storyboard/xib文件修改UIImage renderingMode

Art*_*nko 89 ios xcode-storyboard ios7

是否有可能修改UIImagerenderingMode从故事板或XIB编辑器?

目标是应用于tintColor特定UIImageView对象.

Ant*_*tox 188

您可以将图像渲染模式设置为不在.xib文件中,而是在.xcassets库中.

将图像添加到资源库后,选择图像并打开Xcode右侧的属性检查器.找到属性"渲染为"并将其设置为"模板".

设置图像的渲染模式后,可以UIImageView在文件.xib.storyboard文件中添加色调颜色以调整图像颜色.

这会在图像的任何位置设置属性,而不是仅在一个界面构建器文件中,但在几乎所有情况下(我遇到过),这都是您想要的行为.

Xcode的屏幕截图,显示图像的属性检查器

有几点需要注意:

  • 图像颜色在界面构建器中似乎没有更改(从Xcode 6.1.1开始),但在应用程序运行时将起作用.
  • 我已经经历了这个功能的一些烦恼,在某些情况下,我不得不删除并重新添加UIImageView.我没有深入研究过这个问题.
  • 这也适用于其他UIKitComponentsUIButtons和UIBarButtonItems中的图像.
  • 如果您有一堆在资产库中不可见的白色图像,将它们设置为黑色/透明图像并更改渲染模式将使您的生活提高10倍.

  • 在`UIImageView`上似乎有一个色调颜色的错误,因此在运行应用程序时并不总是显示色调颜色. (15认同)
  • 我可以确认在IB中设置色调颜色时存在问题.以编程方式设置它.我提交了一个错误#20305518. (2认同)

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中添加运行时属性:

在此输入图像描述

  • 我对这个答案的喜爱是,这是对这个问题的回答. (40认同)
  • 硬编码2作为一个值坏坏坏..使用xcassets目录是正确的答案. (3认同)

0xc*_*ced 43

在故事板或xib中使用模板渲染模式和UIImageView是非常错误的,在iOS 7和iOS 8上都是如此.

在iOS 7上

无法从storyboard/xib中正确解码UIImage.如果imageView.image.renderingModeviewDidLoad方法中检查属性UIImageRenderingModeAutomatic,即使在xcassets文件中将其设置为" 渲染为模板图像",也会注意到它始终存在.

要解决此问题,您必须手动设置渲染模式:

self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Run Code Online (Sandbox Code Playgroud)

在iOS 8上

UIImage被正确解码,其renderingMode属性反映了在xcassets文件中选择的内容,但图像没有着色.

要解决此问题,您有两种选择:

  1. 设置tintColor在属性用户定义的属性运行,而不是在属性检查器面板.

要么

  1. 手动重置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,则只需要一种解决方法.

  • 我确认iOS 8的解决方法也适用于iOS 9. (3认同)
  • 谢谢.只有解决方法#2在Xcode 7和iOS 8中适用于我. (2认同)

小智 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年了.

  • 应该选择这个作为答案 (3认同)

Man*_*ani 8

你不能renderingModestoryboard或设置xib.它可以通过编程方式访问.

例如:

UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
Run Code Online (Sandbox Code Playgroud)

  • 我想,你在代码中犯了小错字.第二行应该是`UIImage*selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];` (3认同)

Dmi*_*rov 8

在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)