Подтвердить что ты не робот

Как использовать режим рендеринга шаблонов в Xcode 6 Interface Builder?

Я пытаюсь использовать изображения с режимом рендеринга шаблона, включенным в Interface Builder, но я не могу заставить его работать. С кнопками все работает нормально, но с ImageViews tintColor не применяется к изображению.

Я включил "Векторы типа" (я использую pdf) и "Render as Template Image" в ресурсах Image. Что я делаю неправильно?

4b9b3361

Ответ 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, оно не должно меняться, но оно есть.