UIImageView не всегда отображает изображение шаблона
В приведенном ниже случае есть два UIImageViews с одинаковыми настройками и одинаковым шаблоном изображения... Но один окрашивает изображение, а другой - нет
Я продублировал рабочий UIImageView
и поместил его вместо другого, и это сработало. Это случалось со мной несколько раз, и это решение всегда работало, но мне все еще интересно, что я мог сделать неправильно? Это может быть ошибка XCode? С тобой что-то подобное случилось? У меня Xcode 8.1.
![Xcode screenshot]()
![Xcode screenshot]()
Ответы
Ответ 1
Легкое решение:
![введите описание изображения здесь]()
Просто добавьте новый атрибут runtime, который установит tintColor UIImageView на указанный цвет и обеспечит тонирование изображения.
Вам по-прежнему нужно будет настроить изображение в качестве изображения шаблона в файле Images.xcassets.
Таким образом вам не нужны никакие дополнительные выходы, расширения или строки кода.
Также обратите внимание:
Он не будет применять tintColor в пользовательском атрибуте, если tintColor на представлении имеет один и тот же цвет, они должны быть разными.
Ответ 2
Лучшее решение, которое я нашел, которое не требует подкласса или другого атрибута IBInspectable
:
import UIKit
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
tintColorDidChange()
}
}
Ответ 3
Проблема связана с тем, что значение tint не имеет нулевого состояния (в интерфейсе Storyboard/Interface Builder). Для того, чтобы XCode решил, должен ли оттенок быть применен к UIImageView
кажется, что это дополнительный тест. В XCode это очевидно делается путем оценки ограничений, примененных к UIImageView
. Насколько я знаю, этот тест не имеет документов.
Если у вас есть ограничение "Расстояние до ближайшего соседа" только на двух (или одной) сторонах вашего UIImageView
то оттенок не применяется независимо от значения, установленного для UIImage.renderingMode
.
Если у вас есть ограничение "Расстояние до ближайшего соседа" на трех (или всех) сторонах вашего UIImageView
то оттенок применяется, если для UIImage.renderingMode
установлено значение .alwaysTemplate
.
В подходе исключительно Storyboard/Interface Builder вы устанавливаете UIImage.renderingMode
изображения, добавляя его в каталог активов и затем изменяя свойство "Render As" в наборе изображений на "Template Image".
Ответ 4
Попробуйте установить tintColor
программно; это решило проблему для меня.
Ответ 5
Я думаю, что в UIImageView есть ошибка. Если вы установили цвет оттенка в раскадровке, он не будет применять этот оттенок, даже если объект настроен для рендеринга в качестве шаблона.
Обходной путь - применить цвет оттенка к родительскому представлению UIImageView в раскадровке.
Или, установите tintColor на нуль, а затем обратно в код, привязав UIImageView к розетке.
Ответ 6
используйте это расширение для установки tintColor UIImageView из конструктора интерфейса.
extension UIImageView {
@IBInspectable var imageColor: UIColor! {
set {
super.tintColor = newValue
}
get {
return super.tintColor
}
}
}
Ответ 7
Уловка атрибута времени выполнения не работала для меня. Я сделал этот класс только для исправления такого рода вещей. Вы просто установите для этого класса все проблемные изображения.
final class TintedImageView: UIImageView {
// WORKAROUND: Template images are not tinted when set using the Interface Builder.
override func layoutSubviews() {
super.layoutSubviews()
let preferredTintColor = tintColor
tintColor = nil
tintColor = preferredTintColor
}
}
Ответ 8
После удаления моего существующего UIImageView и добавления нового моя проблема исчезла. Видимо, ситуация такова, что вы должны добавить UIImageView ПОСЛЕ добавления изображений в папку "Ресурсы".
Ответ 9
Может быть, это помогает, когда я час била головой, пока не поняла что-то, чего до сих пор не понимаю.
У меня было мое представление в моем файле .nib, и у всех выходов кроме одного (UIImageView) был цвет оттенка не по умолчанию. Я перепробовал все предложенные ответы, но проблема была решена путем выбора цвета оттенка по умолчанию для изменения его после программно.
![enter image description here]()
![enter image description here]()
Может быть, это ошибка?
Ответ 10
Как упомянул @richardjsimkins, похоже, что это, по крайней мере, в некоторых случаях связано с ограничениями. В моем случае я хотел добавить изображение в центр экрана запуска, так как в этом случае я не могу программно установить tintColor. Я должен был найти чистое решение раскадровки.
Я обнаружил, что tintColor не был установлен при центрировании вида изображения с ограничениями, то есть по центру по горизонтали/вертикали в безопасной области, что соответствует отсутствию ограничений "Расстояние до ближайшего соседа".
Вместо этого я добавил вид стека с ограничениями в безопасную область, ведущую/конечную/верхнюю/нижнюю, а затем встроил изображение в безопасную область с центром выравнивания, распределением заливки. Это разрешает то же положение, что и непосредственное центрирование imageView в безопасной области, и это заставляет tintColor вступать в силу.
Мне не нравится использовать стек, чтобы заставить tintColor работать, но я думаю, что это небольшой и довольно чистый обходной путь к ошибке.
Ответ 11
Сохраняйте оттенок по умолчанию в раскадровке ![enter image description here]()
и добавьте пользовательский атрибут времени выполнения с выбранным вами цветом ![enter image description here]()
Раскадровка покажет изображение с оттенком по умолчанию, но когда вы запустите, он покажет выбранный вами цвет.