Как использовать режим рендеринга шаблона в Xcode 6 Interface Builder?
Я пытаюсь использовать изображения с включенным режимом рендеринга шаблонов в Interface Builder, но не могу заставить его работать. С кнопками все работает нормально, но с ImageViews tintColor не применяется к изображению.
Я включил "Vectors type "(я использую pdf) и" Render as Template Image " в ресурсах изображений. Что я делаю не так?
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)