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 добавьте атрибут времени выполнения:
вы можете установить режим рендеринга изображения не в , но в
.xcassetsбиблиотека.после добавления изображения в библиотеку активов, выберите изображение и откройте инспектор атрибутов в правой части окна Xcode. Найдите атрибут 'делает' и установить его на "шаблон".
после установки режима вывода изображения, то вы можете добавить оттенок цвета
UIImageViewна.xibили.storyboardфайл для настройки цвета изображения.это устанавливает свойство на изображении везде, где он используется, а не только в одном файле interface builder, но почти во всех случаях (с которыми я столкнулся) это поведение, которое вы хотите.
дополнительная информация:
- цвет изображения не изменится в 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, но изображение не тонируется.чтобы обойти эту проблему, у вас есть два варианта:
- установить
tintColorсобственность в Пользовательские Атрибуты Времени Выполнения вместо панели инспектор атрибутов.или
- сброс вручную 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