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

Раскадровка покажет изображение с оттенком по умолчанию, но когда вы запустите, он покажет выбранный вами цвет.