Я хотел бы изменить цвет Image в SwiftUI. В настоящее время я пытаюсь изменить .foregroundColor() как таковой, но на самом деле это не меняет его с черного цвета.
Image(uiImage: resizeImage(UIImage(systemName: isLiked ? "heart.fill" : "heart")!, targetSize: CGSize(width: 75, height: 27))!)
.foregroundColor(isLiked ? .yellow : .gray)
Как видите, цвет по-прежнему черный:
В идеале я бы хотел изменить его так, чтобы он имел такой .foregroundColor, то есть цвет его контура, и при нажатии кнопки «Мне нравится» (сердце) он заполняется тем же цветом:
foregroundColor(colorPalettes[safe: sharedVars.colorPaletteIndex]?[2] ?? .white)
В настоящее время этот цвет применяется к счетчику лайков рядом с кнопкой «Мне нравится» (изображение сердца):
Если я правильно помню, цвет foregroundColor скоро станет устаревшим, поэтому вместо него нужно использовать foregroundStyle.
@aheze Я помню, как добавлял resizeImage() к targetSize вместо того, чтобы просто сделать это напрямую, потому что это позволяет мне иметь одинаковый размер этих трех изображений.
Почему здесь вообще есть UIImage, просто используйте изменение размера и рамку
Поможет ли это мне решить мою проблему с раскрашиванием @loremipsum?
Возможно, вы обычно размножаете изображения, но я знаю, что режимы рендеринга можно изменить, чтобы отобразить и цвет. Я не помню сразу, как это сделать.
@Daggerpov ухх, да, это как-то странно с системными значками. Вы можете сделать их одинакового размера, используя .font(.title) или что-то в этом роде. А чтобы внести дальнейшие изменения, вы можете просто выполнить .scaleEffect.
Во время отладки рекомендуется по возможности исключать дополнительный код, например пользовательскую функцию resizeImage(..).





Спасибо @aheze и @LawrenceGimenez за их комментарии под моим вопросом, предлагающие эти изменения:
Image(systemName: isLiked ? "heart.fill" : "heart")
.font(.title)
.scaleEffect(1)
.foregroundStyle(colorPalettes[safe: sharedVars.colorPaletteIndex]?[2] ?? .white)
Использование базового объекта Image и настройка его .foregroundStyle работает так, как предполагалось в моем вопросе, чтобы цвет соответствовал моей переменной:
На заметку всем, кто это видит, мне пришлось окружить этот код проверкой версии iOS, чтобы обеспечить вызов метода .foregroundStyle(): if #available(iOS 15.0, *) {I put the above code in these curly brackets}
Кстати, несмотря на то, что foregroundColor устарел, его все равно можно использовать.
В SwiftUI Image уже есть инициализатор Image(systemName:), поэтому нет необходимости идти в обход UIImage.
Следующий код делает то, что вы написали, на чистом SwiftUI без UIKit, пользовательских функций или принудительной развертки:
struct LikeView: View {
@State private var isLiked = false
var body: some View {
Image(systemName: isLiked ? "heart.fill" : "heart")
.resizable()
.scaledToFit()
.frame(width: 75, height: 27)
.foregroundStyle(isLiked ? .yellow : .white)
.onTapGesture {
isLiked.toggle()
}
}
}
Примечание: onTapGesture добавлен для удобства воспроизводимости.
Как предложено в комментариях, вы также можете пропустить жестко запрограммированное изменение размера и адаптировать изображение к размеру font любого родительского представления:
someView {
Image(systemName: isLiked ? "heart.fill" : "heart")
.foregroundStyle(isLiked ? .yellow : .primary)
}
.font(.title)
Да, .font и .scaleEffect не предназначены для раскраски, поскольку они предназначались для изменения размера, чтобы заменить мой исходный код, в котором использовался resizeImage. Пожалуйста, смотрите мое решение ниже, которое было сделано с помощью этих комментариев.
Я видел ваше решение. Я неправильно прочитал комментарии, думая, что они подразумевают использование одного из этих модификаторов, прежде чем вы сможете изменить цвет, что, очевидно, не так. Я удалил эту часть.
Почему бы просто
Image(systemName: isLiked ? "heart.fill" : "heart")напрямую?