¿Cómo crear la interfaz gráfica de la pantalla de registro?
¿Alguna vez has querido saber cómo crear una interfaz gráfica para una aplicación? En esta lección guiada, te mostraremos cómo diseñar una pantalla de registro utilizando Xcode. La pantalla de registro es una parte fundamental en cualquier aplicación que requiera autenticación de usuario. Con un enfoque paso a paso, aprenderás a implementar gráficos, botones y campos de texto para usuarios nuevos.
¿Cómo iniciar el proyecto en Xcode?
Primero, asegúrate de tener Xcode instalado y crear un nuevo proyecto. Si ya has seguido el desarrollo de la pantalla de inicio de sesión, notarás que muchas de las estructuras y componentes son similares. La clave reside en reaprovechar el código existente para esta nueva pantalla.
¿Cómo importar y manejar imágenes?
Uno de los primeros pasos es importar imágenes necesarias para la pantalla de registro. Para esto:
Ve a los assets y selecciona la opción de importar.
Importa la imagen del perfil, que será utilizada en el diseño.
Asegúrate de nombrar las imágenes correctamente para evitar futuros errores de compilación.
¿Cómo estructurar los elementos en la pantalla de registro?
La estructura de la UI para la pantalla de registro es parecida a la de inicio, pero con diferencias sutiles. Aquí te dejamos un ejemplo de cómo se trabaja en Xcode:
// Agregando un B stack para la imagenB stack {Alignment=.center
VStack{Text("Elige una foto de perfil").font(.system(size:20, weight:.bold, design:.default)).foregroundColor(.white)Text("Puedes cambiar o elegirla más adelante").font(.footnote).foregroundColor(.gray)}}
Además, es crucial crear botones con acción. Puedes usar un botón para capturar la foto de perfil del usuario. La acción se programará de la siguiente manera:
// Creando el botón para tomar fotoButton(action:{self.tomarFoto()}){ZStack{Image("perfilEjemplo").resizable().frame(width:80, height:80).aspectRatio(contentMode:.fit)Image(systemName:"camera").foregroundColor(.white)}}
¿Cómo añadir campos de texto para registro?
En los campos de texto se deben manejar inputs como correo electrónico y contraseña. Asegúrate de vincular estos inputs adecuadamente y de añadir placeholders que guíen al usuario:
Para evitar sobrecargar un stack de elementos, es recomendable dividir los elementos visuales en módulos pequeños. Por ejemplo:
Un stack para los campos de texto.
Otro stack separado para los botones de acción.
¿Qué errores comunes se pueden evitar?
Demasiados elementos en un Stack: Asegúrate de no superar la cantidad máxima de elementos permitida en un stack.
Typo en el Código: Verifica que todos los elementos tengan los nombres correctos y sean consistentes.
Propiedades mal asignadas: Cada variable debe tener un state inicializado correctamente.
¿Cuál es el siguiente paso?
Una vez cumplidos los requisitos de la pantalla de registro, prueba la funcionalidad. Un reto adicional sería alinear los textos y eliminar cualquier componente no deseado. Incrementar la calidad visual de tus interfaces y resolver cada pequeño error te ayudará a crear interfaces más profesionales y funcionales.
Sigue adelante y explora más oportunidades en el mundo del desarrollo de aplicaciones. El esfuerzo y aprendizaje constante hacen la diferencia. ¡Ánimo y sigue aprendiendo!
No olviden agregar color blanco con foreground a los Text de los input de Correo y Contraseñas en ambas vistas.
Me refiero a los Text que contienen el binding $correo, $contraseña y $confirmarContraseña ya que por defecto el sistema lo pone en negro cuando escribimos.
Muchas gracias!
Buen Tip
Excellent, this is my first view:
de verdad no me parece buena practica solo tener una imagen del diseño y imaginar las distancias y los tamaños de los objetos deberían seguir el figma en cuanto a paddings y distancia de los objetos, incluso el figma les puede dar un ejemplo del objeto en código SwiftUI, si ya tienes las herramientas usalas no las ignores.
Ahi vamos de apoco. {Text("elige una foto de perfil").fontWeight(.bold).foregroundColor(.white)Text("Puedes cambiar o elegirla mas aadelante").font(.footnote).fontWeight(.light).foregroundColor(.gray)Button(action: tomarFoto ,label:{ZStack{Image("user").resizable().aspectRatio(contentMode:.fit).frame(width:80,height:80)Image(systemName:"camera").resizable().aspectRatio(contentMode:.fit).frame(width:35,height:35,alignment:.center).foregroundColor(.white)}})}.padding(.bottom)VStack(alignment:.leading){Text("Correo electronico*").foregroundColor(Color("Dark-cian"))ZStack(alignment:.leading){if(email.isEmpty){Text("ejemplor@gmail.com").font(.caption).accentColor(.gray)}TextField("",text: $email)}Divider().frame(height:1).background(Color("Dark-cian")).padding(.bottom)}VStack(alignment:.leading){Text("Contraseña").foregroundColor(.white).fontWeight(.bold)ZStack(alignment:.leading){if(password.isEmpty){Text("password").font(.caption).foregroundColor(.gray)}SecureField("",text: $password)}Divider().frame(height:1).background(.white).padding(.bottom)}VStack(alignment:.leading){Text("Confirmar Contraseña*").foregroundColor(.white).fontWeight(.bold)ZStack(alignment:.leading){if(ConfirmPassword.isEmpty){Text("rewrite to password").font(.caption).foregroundColor(.gray)}SecureField("",text: $ConfirmPassword)}Divider().frame(height:1).background(.white).padding(.bottom)}Button(action: login,label:{Text("REGISTRATE").fontWeight(.bold).foregroundColor(.white).frame( maxWidth:.infinity,alignment:.center).padding(EdgeInsets(top:11,leading:14,bottom:11,trailing:14)).overlay(RoundedRectangle(cornerRadius:6.0).stroke(Color("Dark-cian"),lineWidth:1.5).shadow(color:.white,radius:7))}).padding(.top,20)Text("Iniciar sesion con redes sociales").foregroundColor(.white).frame( maxWidth:.infinity,alignment:.center).padding(.top,50.0)HStack{Spacer()Button(action: loginWithFacebook,label:{Text("Facebook").fontWeight(.bold).foregroundColor(.white).frame(maxWidth:.infinity,alignment:.center).padding(EdgeInsets(top:11,leading:0,bottom:7,trailing:0))}).background(Color(red:46/255,green:58/255,blue:91/255)).cornerRadius(7.0)Spacer()Button(action: loginWithTwitter,label:{Text("Twitter").fontWeight(.bold).foregroundColor(.white).frame(maxWidth:.infinity,alignment:.center).padding(EdgeInsets(top:11,leading:0,bottom:7,trailing:0))}).background(Color(red:46/255,green:58/255,blue:91/255)).cornerRadius(7.0)Spacer()}.padding(.top,10)}.padding(.horizontal,77.0)}})
En la ultima línea tienes un padding horizontal de 77, debes cambiarlo a uno que se ajuste a la vista que quieres
Todo bien pero aqui hace falta demasiada reutilizazion de views, se esta repitiendo demasiado codigo, deberian enseñar a programar bien desde 0, por lo menos esta parte no me esta gustando, los fields contraseña deberian ser reutilizados y correo deberian ser reutilizados, aqui estamos repitiendo el mismo codigo mas de 5 veces es una barbaridad
Es muy cierto lo que mencionas. El curso podría enfocarse más en cuidar las buenas prácticas y fomentar la reutilización de código. Sin embargo, tengo la impresión de que está más orientado a guiarte en el maquetado del diseño. Al final, queda en nosotros buscar las mejores maneras de implementar las soluciones. El problema surge con las personas que recién están comenzando: si se les enseña de esta manera, podría complicarles mucho el aprendizaje en el futuro.
jeje
Le agregue la funcionalidad de asignar una foto de perfil ++random++, a cada User que se esta registrando:
Viendo las clases, veo el avance de los procesadores M de Apple sobre los Intel, mi Mac recopila más rápido que la de el profe jaja y me imagino que el debe de tener la que en su año era una de las más top jaja
En el reto anterior lo hice de la siguiente manera:
Text("Enter with social networks").foregroundColor(.white).frame(maxWidth:.infinity,alignment:.center).padding(.vertical).font(.footnote)HStack{Button(action: signInFacebook,label:{Text("Facebook").fontWeight(.bold).foregroundColor(.white).frame(maxWidth:.infinity,alignment:.center).padding(EdgeInsets(top:11,leading:18,bottom:11,trailing:18)).background(RoundedRectangle(cornerRadius:6).fill(Color("BlueGray")))})Button(action: signInTwitter,label:{Text("Twitter").fontWeight(.bold).foregroundColor(.white).frame(maxWidth:.infinity,alignment:.center).padding(EdgeInsets(top:11,leading:18,bottom:11,trailing:18)).background(RoundedRectangle(cornerRadius:6).fill(Color("BlueGray")))})}