Как использовать режим рендеринга шаблонов в Xcode 6 Interface Builder?
Я пытаюсь использовать изображения с режимом рендеринга шаблона, включенным в Interface Builder, но я не могу заставить его работать. С кнопками все работает нормально, но с ImageViews tintColor не применяется к изображению.
Я включил "Векторы типа" (я использую pdf) и "Render as Template Image" в ресурсах Image. Что я делаю неправильно?
Ответы
Ответ 1
Я столкнулся с той же проблемой. Я думаю, что это ошибка.
Вы можете использовать этот радар http://openradar.appspot.com/radar?id=5334033567318016, который ссылается на этот минимальный пример приложения https://github.com/algal/TemplateImagesBrokenDemo.
Я знаю два обходных пути для этой проблемы
завершение в UIButton
Так как tintColor работает для UIButtons, одно обходное решение вместо UIImageView используется только для использования пользовательского типа UIButton с userInteractionEnabled = false. Если вы отключите интерактивность кнопки с UIView.userInteractionEnabled(в отличие от UIControl.enabled), вы не измените внешний вид изображения.
вручную переустановите изображение в коде
Другим обходным решением является переустановка свойства .image
в коде после загрузки UIImageView из nib. Это работает, потому что настройка изображения в коде, по-видимому, является тем, что вызывает логику шаблонов. Чтобы это сработало, вам нужно повторно установить изображение на существующее значение таким образом, чтобы его компилятор не оптимизировался. Этот фрагмент в awakeFromNib
работал у меня:
override func awakeFromNib() {
super.awakeFromNib()
if shouldSetImagesManually {
// the following three-lines should in theory have no effect.
// but in fact, they ensure that the UIImageView
// correctly applies its tintColor to the vector template image
let image = self.templateImageView.image
self.templateImageView.image = nil
self.templateImageView.image = image
}
Ответ 2
В моем случае проблема возникает, если приложение построено с SDK iOS8 и работает на iOS 7.
Мое обходное решение:
// this is the code that *should* work and does so on iOS 8
UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3];
[self.iconImageView setTintColor:tintColor];
self.iconImageView.image = [self imageForIconImageView]; // image is loaded from a pdf-resource (asset catalog set as Template) with imageNamed:@"resourceName"
// this is the workaround to get tint on iOS 7
if (!IS_IOS8_OR_HIGHER) { // macros checking iOS version*
UIImage *templateImage = [self.iconImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.iconImageView.image = templateImage;
}
// * - macros is defined like so:
// #define IS_IOS8_OR_HIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
Ответ 3
Здесь самое простое решение без кода:
![установить tintColor в атрибутах времени выполнения]()
Ответ 4
Другим обходным решением, которое, кажется, работает для меня, является установка controller.view tintColor. Чтобы получить цвет цветности системы по умолчанию:
self.view.tintColor = self.view.tintColor;
Как и решение @algal, оно не должно меняться, но оно есть.