Изменить UIImage renderingMode из файла раскадровки / xib



можно ли изменить a UIImage ' s renderingMode из раскадровки или xib редактор?



цель состоит в том, чтобы применить tintColor в частности UIImageView "объект".

641   12  

12 ответов:

вот как вы можете сделать это .xib или раскадровки файлов:

создать Категорию на 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

затем в Инспекторе идентификации в файле xib добавьте атрибут времени выполнения:

enter image description here

вы можете установить режим рендеринга изображения не в , но в .xcassets библиотека.

после добавления изображения в библиотеку активов, выберите изображение и откройте инспектор атрибутов в правой части окна Xcode. Найдите атрибут 'делает' и установить его на "шаблон".

после установки режима вывода изображения, то вы можете добавить оттенок цвета UIImageView на .xib или .storyboard файл для настройки цвета изображения.

это устанавливает свойство на изображении везде, где он используется, а не только в одном файле interface builder, но почти во всех случаях (с которыми я столкнулся) это поведение, которое вы хотите.

Screenshot of Xcode showing attributes inspector for an image

дополнительная информация:

  • цвет изображения не изменится в interface builder (начиная с Xcode 6.1.1), но будет работать при запуске приложения.
  • я испытал некоторые багги с этой функцией, и в некоторых ситуациях мне пришлось удалить и снова добавить UIImageView. Я не заглядывал так глубоко.
  • это также отлично работает на других UIKitComponents например, изображения в UIButtonи UIBarButtonItem ' s.
  • если у вас есть куча белых изображений, которые невидимы в вашей библиотеке активов, делая их черными/прозрачными изображениями и изменяя режим рендеринга, вы улучшите свою жизнь до 10 раз.

использование режима рендеринга шаблона с UIImageView в раскадровке или xib очень глючит, как на iOS 7, так и на iOS 8.

на iOS 7

UIImage не правильно декодируется из раскадровки / xib. Если вы проверяете imageView.image.renderingMode собственность в viewDidLoad метод, вы заметите, что это всегда UIImageRenderingModeAutomatic, даже если вы установите его в Визуализация В Виде Шаблона Изображения в xcassets файл.

чтобы обойти эту проблему, вы должны вручную установить рендеринг режим:

self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

на iOS 8

UIImage правильно декодируется и его renderingMode свойство отражает то, что было выбрано в файле xcassets, но изображение не тонируется.

чтобы обойти эту проблему, у вас есть два варианта:

  1. установить tintColor собственность в Пользовательские Атрибуты Времени Выполнения вместо панели инспектор атрибутов.

или

  1. сброс вручную 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, требуется только один обходной путь.

настройка imageView RenderingMode для использования цвета оттенка в раскадровке может быть уменьшена до однострочного:

[self.imageView setImage:[self.imageView.image 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
    }

}

вы не можете установить renderingMode либо storyboard или xib. Он может получить доступ программно.

ex:

UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

вы можете исправить .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 лет.

Это очень легко исправить

просто создайте класс 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.

в iOS 9 установка tintColor свойство в Interface Builder по-прежнему глючит.

обратите внимание, что рабочее решение помимо написания строк непосредственно изменяет ImageView свойства-это установить Render As: Template Image в каталоге активов и вызвать, например:

[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];

простой способ установить из раскадровки:

@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 более правильный-это может быть более кратким.

Comments

    Ничего не найдено.