Чи можна змінити UIImage
«S renderingMode
з розкадровки або XIb редактор?
Мета - застосувати tintColor
до конкретного UIImageView
об’єкта.
Чи можна змінити UIImage
«S renderingMode
з розкадровки або XIb редактор?
Мета - застосувати tintColor
до конкретного UIImageView
об’єкта.
Відповіді:
Ось як це можна зробити у файлах .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
(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)
}
}
Потім в інспектор ідентичності у файлі xib додайте атрибут виконання:
Ви можете встановити режим візуалізації зображення не у .xib
файлі, а у .xcassets
бібліотеці.
Після додавання зображення до бібліотеки об’єктів виберіть зображення та відкрийте інспектор атрибутів праворуч від Xcode. Знайдіть атрибут 'Render As' та встановіть його на 'template'.
Після встановлення режиму візуалізації зображення ви можете додати колір відтінку UIImageView
в a .xib
або .storyboard
файл, щоб відрегулювати колір зображення.
Це встановлює властивість зображення, де б воно не використовувалося, а не тільки в одному файлі конструктора інтерфейсів, але майже у всіх випадках (з якими я стикався), це саме те, що ви хочете.
Кілька речей, які слід зазначити:
UIImageView
. Я не вдивлявся в це глибоко.UIKitComponents
таких як зображення в UIButton
'і UIBarButtonItem
' s.UIImageView
, тому колір відтінку не завжди відображається під час роботи програми.
Використання режиму візуалізації шаблонів з UIImageView на аркуші розкадрування або xib дуже помилкова, як на iOS 7, так і на iOS 8.
UIImage неправильно розшифровується з раскадровки / xib. Якщо ви переглянете imageView.image.renderingMode
властивість у viewDidLoad
методі, ви помітите, що це завжди UIImageRenderingModeAutomatic
, навіть якщо ви встановите його на зображення відобразити як шаблон у вашому файлі xcassets.
Для вирішення проблеми потрібно вручну встановити режим візуалізації:
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, потрібен лише один спосіб вирішення.
Встановлення imageView RenderingMode для використання кольору відтінку на дошці даних може бути зменшено до однолінійного:
[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
Тоді все зображення та кольори відтінку можна встановити на Дошці розкадрувань.
Ви можете виправити проблеми .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)
}
}
Потім просто встановіть клас у програмі Interface Builder на 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
В iOS 9 налаштування tintColor
властивості в Interface Builder все ще є помилковою.
Зауважте, що робочим рішенням, крім запису рядків, що безпосередньо змінюють ImageView
властивості, є встановлення відобразити як: зображення шаблону в каталозі активів, і зателефонувати, наприклад:
[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
Я вирішив цю проблему, додавши атрибут виконання tintColor
в конструкторі інтерфейсів.
ПРИМІТКА: Вам все одно потрібно буде встановити зображення, яке відображатиметься у вигляді шаблону у вашому файлі Images.xcassets.
Якщо ви створюєте IBOutlet, ви можете змінити його у вашому методі awakeFromNib, наприклад ...
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Хоча відповідь @ Мобі правильніша - це може бути більш стислим.
Божевільна ця помилка все ще в iOS 12.1! Для розповідей / xibs: Додавання тегу до UIImageView може бути швидким виправленням.
Швидкий 4.2
view.viewWithTag(1)?.tintColorDidChange()
extension UIImageView {
@IBInspectable var renderModeTemplate : Bool {
get{
return image?.renderingMode == .alwaysTemplate
}
set{
image = image?.withRenderingMode(newValue ? .alwaysTemplate:.alwaysOriginal)
}
}
}
У дошці розкадру виберіть UIImageView та виберіть інспектора, встановіть властивість renderModeTemplate
= On
In In Storyboard