AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77955779
Accepted
Swift
Swift
Asked: 2024-02-07 22:55:48 +0800 CST2024-02-07 22:55:48 +0800 CST 2024-02-07 22:55:48 +0800 CST

Enfrentando problemas no design de UI com SwiftUI

  • 772

Tenho enfrentado problemas no design de UI com SwiftUI. Acho que o UIKit é um pouco melhor quando comparado ao SwiftUI porque, usando o SwiftUI, não sou capaz de fornecer espaços adequados aqui, cada pilha calcula os espaços separadamente. Não entendo como dar espaços aos elementos vizinhos.

Minha principal questão é obter espaço de seu elemento vizinho. Precisamos fornecer espaço inicial para subtrair a área de largura do elemento vizinho?

Por exemplo, dei o início da pilha de imagens, topo para 20 e largura e altura 100. Agora, se eu quiser adicionar um rótulo que conduza a essa imagem, preciso fornecer espaços ao início do rótulo para -100? Como os espaços funcionarão para fornecer início, final, topo e fundo adequados?

Eu fiz um design simples como este usando UIKit aqui se você considerar apenas a imagem da pessoa com visualização azul superior como superior e levando a 20 e os rótulos e ícones restantes devem levar a essa visualização de imagem a 15

insira a descrição da imagem aqui

Agora tentei apenas o design da cor azul superior no SwiftUI : sou novo na interface do usuário, então tentei desta forma. Se houver algum atalho, por favor me avise.

Se houver algum código desnecessário, por favor me avise e me oriente como escrever códigos curtos usando SwiftUI.

E você poderia me orientar sobre como incorporar pilhas umas nas outras. Existe algum padrão para adicionar um dentro do outro?

Com esse código também não consegui o design adequado. Por favor, me guie para consertar isso.

struct SecondView: View {
    var body: some View {
        ZStack{
            Color.yellow.ignoresSafeArea()
            
            ScrollView{
                VStack{
                    
                    ZStack {
                        Color.blue // Background color of the view
                        
                        VStack{
                            HStack (){
                                Image(systemName: "person.circle.fill")
                                
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .frame(width: 70, height: 70)
                                    .padding(.leading, 10)
                                    .padding(.top, 20)
                                
                                Spacer()
                            }
                            
                            Spacer()
                        }
                        
                        VStack(spacing: 10){
                            
                            Text("Jhon Thomas").foregroundColor(Color.white)
                                .padding(.bottom, 10).font(.system(size: 20))
                            
                            HStack (){
                                Image(systemName: "phone.fill")
                                
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .frame(width: 17, height: 17)
                                    .padding(.leading, 10)
                                Text("0000000000").foregroundColor(Color.white)
                            }
                            HStack (){
                                Image(systemName: "bag.fill")
                                
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .frame(width: 17, height: 17)
                                    .padding(.leading, 10)
                                Text("Singer").foregroundColor(Color.white)
                            }
                            HStack (){
                                Image(systemName: "location.fill")
                                
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .frame(width: 17, height: 17)
                                    .padding(.leading, 10)
                                Text("test loc").foregroundColor(Color.white)
                                Spacer()
                                Image(systemName: "map.fill")
                                
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .frame(width: 17, height: 17)
                                    .padding(.leading, 10)
                                Text("Jhon Thomas").foregroundColor(Color.white)
                            }
                        }.padding()
                        //  .padding(.leading, -80)
                     }.padding()
                     .frame(height: 200)
                }
            }
        }
    }
}

SwiftUI apenas design de cor azul: como fazer como acima projetar todos os nomes e ícones no mesmo alinhamento e levando apenas 15 à visualização da imagem?

insira a descrição da imagem aqui

user-interface
  • 1 1 respostas
  • 42 Views

1 respostas

  • Voted
  1. Best Answer
    MatBuompy
    2024-02-08T00:33:38+08:002024-02-08T00:33:38+08:00

    Estou aqui para ajudar! Em primeiro lugar, sugiro que você aprenda o básico do SwiftUI aqui: Introdução ao SwiftUI e aqui: Tutorial do SwiftUI . Agora, vamos ao assunto em questão. Comecei a desenvolver iOS com SwiftUI e, acredite, agora que aprendi e uso o UIKit diariamente para trabalhar, não há pior coisa! Sobre o seu código, há muita coisa que pode ser melhorada. Aproveitei a oportunidade para escrever algum modificador personalizado para evitar repetir o mesmo modificador para imagens continuamente. Eu removi Stacks redundantes, criei uma Visualização recuperável para aqueles HStacks repetidos. Vou te mostrar agora:

    struct SecondView: View {
        var body: some View {
            ZStack {
                
                // This is ok but you can use .background() modifier too
                //Color.yellow.ignoresSafeArea()
                
                ScrollView {
                    
                    HStack {
                        //Color.white // Background color of the view
                        
                        VStack {
                            /// Alignment top to keep the imafge
                            HStack(alignment: .top) {
                                Image(systemName: "person.circle.fill")
                                    .resizable()
                                    .aspectRatio(contentMode: .fit)
                                    .modifier(ImageModifier(width: 70, height: 79))
                                    .padding(.top, 20)
                                
                                /// Removed this to avoid pushing the texts and icon to the right
                                //Spacer()
                                
                                /// I used this line to show you the separations of two
                                Rectangle()
                                    .background(.red)
                                    .frame(width: 1)
                            }
                            
                            /// I used the frame modifier instead
                            //Spacer()
                        }
                        /// I used this instead of the Spacer above to achieve the same result
                        .frame(maxHeight: .infinity, alignment: .top)
                        
                        VStack(spacing: 10) {
                            
                            Group {
                                
                                Text("Jhon Thomas")
                                //.foregroundColor(Color.white)
                                    /// Another way of setting padding. I had to use padding leading 10 to match the RowItems
                                    .padding(EdgeInsets(top: 0, leading: 10, bottom: 10, trailing: 0))
                                    .font(.system(size: 20))
                                
                                RowItem(text: "000000000", icon: "phone.fill")
                                
                                RowItem(text: "Singer", icon: "bag.fill")
                            }
                            .frame(maxWidth: .infinity, alignment: .leading)
                            
                            HStack {
                                RowItem(text: "Jhon Thomas", icon: "location.fill")
                                
                                Spacer()
                                
                                RowItem(text: "Jhon Thomas", icon: "map.fill")
                                
                                
                            }
                        }
                        .frame(maxWidth: .infinity, alignment: .leading)
                    }
                    /// Padding placed here (before the frame) will push views to the inside. Modifier order matters in SwiftUI.
                    .padding()
                    .frame(height: 200)
                    /// Padding placed here will make this view larger. The default padding value is 16.
                    //.padding()
                    .background(.white)
                    .frame(maxWidth: .infinity, alignment: .leading)
                }
            }
            .background(.yellow)
        }
        
        @ViewBuilder
        private func RowItem(text: String, icon: String) -> some View {
            HStack {
                Image(systemName: icon)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .modifier(ImageModifier())
                
                Text(text)
                    .foregroundStyle(.black)
            }
        }
        
    }
    

    E aqui está o modificador personalizado para imagens:

    struct ImageModifier: ViewModifier {
        
        var width: CGFloat = 17
        var height: CGFloat = 17
        
        func body(content: Content) -> some View {
            content
                .frame(width: width, height: height)
                .padding(.leading, 10)
        }
    }
    

    É claro que isso serve para lhe dar uma ideia de como realizar coisas no SwiftUI. Se você souber como usá-lo, poderá criar UIs muito, muito rápido . Meu ponto de vista é que ele oferece possibilidades quase ilimitadas de controlar cada pixel da tela.

    Entrando em detalhes sobre o que fiz, substituí os espaçadores por um modificador de quadro especificando maxWidth ou maxHeight para ocupar todo o espaço disponível. O modificador de quadro também permite especificar o alinhamento. Além disso, a menos que você tenha como alvo o iOS 14, você pode usar foregroundStyle para modificar a cor da Visualização. Para o backgorund você pode fazer basicamente o mesmo, há um modificador de fundo também. O modificador de fundo é usado para desenhar coisas abaixo da visualização à qual está aplicado, enquanto o modificador de sobreposição desenha na parte superior. Você pode usar a macro @ViewBuilder para criar funções que retornem Views. Tenho uma resposta aqui que fala sobre isso: ViewBuilder .

    Há muito a dizer, mas o melhor que você pode fazer é sujar as mãos e codificar bastante! Espero que minha resposta tenha sido útil para você amigo!

    • 1

relate perguntas

  • Em Rust, como obter o texto do widget TextEdit Slint gui

  • Como arrastar a janela usando o mouse no egui?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve