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


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

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

4 26

4 ответа:

Я столкнулся с той же проблемой. Я думаю, что это ошибка.

Вы могли бы заглушить этот радар http://openradar.appspot.com/radar?id=5334033567318016 , который ссылается на этот минимальный пример приложения https://github.com/algal/TemplateImagesBrokenDemo .

Я знаю два способа решения этой проблемы

Завернуть в UIButton

Так как tintColor работает для UIButtons, один обходной путь вместо UIImageView просто использовать пользовательский тип UIButton с userInteractionEnabled=false. Если отключить интерактивность кнопки с UIView.userInteractionEnabled (в отличие от С UIControl.включено), то вы не будете изменять внешний вид изображения.

Вручную повторно установите изображение в коде

Другой обходной путь состоит в том, чтобы повторно установить свойство .image в коде, после того как UIImageView был загружен из кончика пера. Это работает, потому что установка образа в коде, кажется, запускает логику шаблонов. Чтобы это сработало, вам нужно заново настроить образ к его существующему значению таким образом, что он не будет оптимизирован в компиляторе. Фрагмент, подобный этому в 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
  }

В моем случае проблема возникает, если приложение построено с помощью iOS8 SDK и работает на 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)

Вот самое простое решение без кода, которое я нашел:

установить tintColor в атрибутах среды выполнения

Еще один обходной путь, который, кажется, работает для меня, - это установить контроллер.вид-это оттенок цвета. Чтобы получить цвет оттенка системы по умолчанию, работающий:

self.view.tintColor = self.view.tintColor;

Как и решение @algal, это не должно иметь значения, но это так.