Сложный вид SwiftUI с использованием средства чтения геометрии

Я работаю над сложным пользовательским интерфейсом, и при попытке его создания постоянно сталкиваюсь с проблемами. Во-первых, это мой текущий код:

var body: some View {
        HStack {
            VStack (alignment: .leading) {
                if showNewBadge {
                    NewBadge(title: "NEW")
                }
                Text("jfsdbf hjksdb fhjkdsb ")
                    .dynamicFont(.Cloud9.paragraph)
                    .lineLimit(2)
                if let subtext {
                    Text("djfb dsjhbf jsdhk fbjsdhk fbjdshkf bjs")
                        .dynamicFont(.Cloud9.caption)
                        .lineLimit(3)
                }
                if let parterLogoUrl {
                    KFImage(parterLogoUrl)
                        .useHatchFade()
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 65, height: 20)
                        .clipped()
                }
                if showCTA {
                    Button(action: tapOnCTAAction, label: {
                        Label("Listen Now", systemImage: "play")
                    })
                    .buttonStyle(.outlineSmall)
                }
            }
            .padding(.leading)
            if let parterLogoUrl {
                KFImage.url(parterLogoUrl)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .overlay(
                        LinearGradient(gradient: Gradient(colors: [Color.black.opacity(0.5), Color.clear]), startPoint: .leading, endPoint: .trailing)
                    )
            }
            
        }
        .background(
            RoundedRectangle(cornerRadius: .cornerRadiusDefault)
                .foregroundColor(.blue))
    }

Теперь я объясню, в чем заключаются проблемы и чего я хочу достичь. Итак, первая проблема заключается в том, что на изображении, которое находится в правой части HStack, я хочу, чтобы оно занимало всю высоту контейнера и половину его ширины. Я попробовал использовать программу чтения геометрии, но градиент вышел за пределы. Если кто-то знает, как заставить его работать с программой чтения геометрии, я был бы признателен. Во-вторых, я пытаюсь заставить изображение медленно смешиваться по мере его перемещения влево к центру с цветом фона. Под смешиванием я имею в виду, что он может постепенно исчезать, поэтому мы начинаем видеть цвет фона только после того, как достигнем центра.

Конечная цель — получить карточку, в правой половине которой есть изображение, а в левой — некоторая информация. Изображение медленно исчезает по мере продвижения к центру. Информация и изображение занимают половину ширины карты. Если мой подход не идеален, пожалуйста, дайте мне знать.

Спасибо.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Соотношение сторон вашего изображения сбивает с толку. Если вы установите ширину вашего HStack и изображения на половину размера читателя геометрии, это сбалансирует ситуацию. Когда вы меняете размер контейнера и соотношение изображения становится проблематичным, оно центрирует изображение в контейнере, оставляя пустое пространство слева и справа. Проще всего .fillваше изображение вместо .fit.

Если вам нужно использовать изображение .fit, я бы предложил присвоить вашему HStack фиксированную высоту, которая вам подходит.

Чтобы смешать градиент, просто установите первый цвет градиента в соответствии с цветом фона.

        GeometryReader { geo in
        HStack {
            VStack (alignment: .leading) {
                if showNewBadge {
                    NewBadge(title: "NEW")
                }
                Text("jfsdbf hjksdb fhjkdsb ")
                    .lineLimit(2)
                Text("djfb dsjhbf jsdhk fbjsdhk fbjdshkf bjs")
                    .lineLimit(3)
                Text("@") // logo
                Button("Listen Now") {
                    print("some action")
                }
            }
            .padding(.leading)
            .frame(width: geo.size.width / 2) // set width, not height.
            
            HStack {
                Spacer() // when the radio mixes things up...push to end
                Image("demos")
                    .resizable()
                //                            .aspectRatio(contentMode: .fit) // <- the aspect ratio is whats making it difficult to calculate.
                    .aspectRatio(contentMode: .fill)
                    .overlay(
                        LinearGradient(gradient: Gradient(colors: [Color.blue, Color.clear]), startPoint: .leading, endPoint: .trailing)
                    )
                // set width, not height.
            }.frame(width: geo.size.width / 2)
            
        }
        // fixed height here
        .background(.blue)
        .mask(RoundedRectangle(cornerRadius: 10)) // rounds off image too!
    }

Большое спасибо за подробный ответ. На самом деле я предпочитаю использовать .fill, но когда я это делаю, карточка занимает весь экран. Даже сейчас, когда я скопировал и вставил ваш код, та же проблема возникла с .fill, и весь экран стал цветом фона.

Amin 06.10.2023 02:35

А как насчет установки высоты HStack на половину ширины? Таким образом, изображение будет квадратным и может предотвратить его взрыв. .frame(высота: geo.size.width / 2)

33333 06.10.2023 03:15

Это решает проблему, спасибо!

Amin 06.10.2023 04:15

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

Похожие вопросы

После обновления Cocoapods до 1.13.0 выдает ошибку
Xcode 15 блокирует запуск моего приложения: 1 сообщение журнала/указателя потеряно из-за высоких скоростей записи в режиме реального времени?
Как заставить представление оставаться в ландшафтном режиме в SwiftUI
Обновление Xcode 15 сломало приложение Flutter iOS: повторяющиеся символы (символы не указаны)
Можно ли изменить пользовательский признак из родительской коллекции признаков и наблюдать за изменениями во всех контроллерах представления?
Значение UserDefaults меняется между запусками приложения
Как получить снимок экрана для экрана размером 5,5 дюйма в Xcode 15 на Sonoma
Как получить доступ к ToolBar или InputAccessoryView, который появляется поверх клавиатуры, без использования экземпляра текстового поля
Почему AVSpeechSynthesizer воспроизводит больше информации, чем мой текст?
Аргумент типа «nw_proxy_config_t» не является ни объектом Objective-C, ни типом блока