J'ai actuellement la vue SwiftUI suivante:
HStack {
...
VStack {
TextField { ... }
SecureField { ... }
Button { ... }
}
...
}
J'ai ajouté une .background(Color.green)
à la Button
, et comme vous pouvez le voir, la vue est très ajustée au texte.
Je me demande s'il existe un moyen d'ajuster la largeur du bouton afin qu'il remplisse VStack
- quelque chose comme un mode .fill
Pour UIStackView
.
Quelque chose comme ça?
Button(action: {
// Do your login thing here
}) {
Capsule()
.frame(height: 44)
.overlay(Text("Login").foregroundColor(Color.white)).padding()
}
Je ne sais pas s'il existe une méthode .fill
Similaire à UIStackView
mais, si ce que vous voulez faire est de fournir un certain espacement sur le Button
(ou toute autre vue d'ailleurs) ) ce qui a fonctionné pour moi est de définir le frame
ou padding
.frame(width: 300, alignment: .center)
(nous pouvons également définir une hauteur ici mais, sinon, elle devrait pouvoir déduire la hauteur en fonction du texte du bouton.
Si vous ne souhaitez pas définir une largeur arbitraire, vous pouvez également import UIKit
Et utiliser UIScreen
et obtenir la largeur totale des périphériques. (Il peut y avoir un moyen SwiftUI d'obtenir cela, mais je ne l'ai pas encore trouvé pour le moment)
.frame(width: UIScreen.main.bounds.width, alignment: .center)
puis vous pouvez ajouter un peu de rembourrage pour une certaine respiration
.padding(.all, 20)
Le problème avec le rembourrage est qu'il augmentera la largeur supplémentaire de l'écran, nous devrons donc en tenir compte lors du réglage de la largeur.
(20 * 2 côtés du début et de la fin)
.frame(width: UIScreen.main.bounds.width - 40, alignment: .center)
(la marge de manœuvre est pour quand le texte couvre jusqu'à la fin de l'écran ou si votre alignement est .leading
ou .trailing
)
Définissez le cadre du texte du bouton à la taille de UIScreen
, puis définissez la couleur d'arrière-plan après cela (assurez-vous que tous les changements de style sont effectués après changez la taille du cadre, sinon les changements de style ne se feront que être visible sur le cadre par défaut d'origine). La taille du cadre se propagera vers le haut pour augmenter également la largeur du bouton à la largeur de l'écran .:
Button(action: {
// Sign in stuff
}) {
Text("Sign In")
.frame(width: UIScreen.main.bounds.width, height: nil, alignment: .center)
.background(Color.green)
}
Vous pouvez également ajouter un rembourrage horizontal négatif entre la définition du cadre et de l'arrière-plan afin de compenser le bord de l'écran:
Button(action: {
// Sign in stuff
}) {
Text("Sign In")
.frame(width: UIScreen.main.bounds.width, height: nil, alignment: .center)
.padding(.horizontal, -10.0)
.background(Color.green)
}