Настройка цвета UIImage

Я хотел бы изменить цвет 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)

В настоящее время этот цвет применяется к счетчику лайков рядом с кнопкой «Мне нравится» (изображение сердца):

Почему бы просто Image(systemName: isLiked ? "heart.fill" : "heart") напрямую?

aheze 01.07.2024 02:48

Если я правильно помню, цвет foregroundColor скоро станет устаревшим, поэтому вместо него нужно использовать foregroundStyle.

Lawrence Gimenez 01.07.2024 03:12

@aheze Я помню, как добавлял resizeImage() к targetSize вместо того, чтобы просто сделать это напрямую, потому что это позволяет мне иметь одинаковый размер этих трех изображений.

Daggerpov 01.07.2024 03:18

Почему здесь вообще есть UIImage, просто используйте изменение размера и рамку

lorem ipsum 01.07.2024 03:41

Поможет ли это мне решить мою проблему с раскрашиванием @loremipsum?

Daggerpov 01.07.2024 04:16

Возможно, вы обычно размножаете изображения, но я знаю, что режимы рендеринга можно изменить, чтобы отобразить и цвет. Я не помню сразу, как это сделать.

lorem ipsum 01.07.2024 04:35

@Daggerpov ухх, да, это как-то странно с системными значками. Вы можете сделать их одинакового размера, используя .font(.title) или что-то в этом роде. А чтобы внести дальнейшие изменения, вы можете просто выполнить .scaleEffect.

aheze 01.07.2024 06:21

Во время отладки рекомендуется по возможности исключать дополнительный код, например пользовательскую функцию resizeImage(..).

soundflix 01.07.2024 08:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Спасибо @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}

Daggerpov 01.07.2024 06:53

Кстати, несмотря на то, что foregroundColor устарел, его все равно можно использовать.

aheze 01.07.2024 23:40

В 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. Пожалуйста, смотрите мое решение ниже, которое было сделано с помощью этих комментариев.

Daggerpov 01.07.2024 11:40

Я видел ваше решение. Я неправильно прочитал комментарии, думая, что они подразумевают использование одного из этих модификаторов, прежде чем вы сможете изменить цвет, что, очевидно, не так. Я удалил эту часть.

soundflix 01.07.2024 11:59

Другие вопросы по теме