Estou tentando criar botões que cresçam até uma largura máxima, se necessário, em que ponto eles usam "..." para truncar seu título. Sei que há algumas coisas incomuns sobre quadros de botões, como a diferença em aplicar quadro antes ou depois, .buttonStyle
no entanto, esse comportamento é surpreendente para mim.
Parece que aplicar o maxWidth
faz o botão ocupar essa largura mesmo que não precise. Se você aplicar um estilo de botão que dê a ele um plano de fundo, ele teria espaço em branco ao redor do botão.
Descobri que isso Text()
também se aplica a.
struct TestButton: View {
let title: String
var body: some View {
Button {
print(title)
} label: {
Text(title)
.lineLimit(1)
}
.frame(maxWidth: 180)
.background(.purple)
.buttonStyle(PlainButtonStyle())
.focusable()
}
}
HStack {
TestButton(title: "Bears")
TestButton(title: "Battlestar Galactica")
}
.frame(maxWidth: 180)
é simplesmente envolver um "frame" invisível ao redor do botão. Este frame é muito flexível - se ele receber uma proposta de tamanho com uma largura de no máximo 180pt, ele escolherá sua largura para ser a mesma que a largura proposta. Caso contrário, ele escolherá sua largura para ser 180pt, efetivamente "limitando" a proposta.É exatamente isso que
HStack
propõe oframe
.HStack
primeiro tentará propor uma quantidade igual de largura para cada criança, tentando dispô-las uniformemente. Oframe
s aceita essas propostas, porque oHStack
acontece de ter menos de 360pt de largura * .Você pode adicionar
fixedSize()
(oufixedSize(horizontal:vertical:)
) a cada um dos botões, de modo que, em vez de propor uma largura específica para os botões, uma.unspecified
proposta seja enviada para oframe
s. Oframe
encaminhará isso para os botões e os botões escolherão um tamanho que se ajuste ao seu conteúdo. Claro, se a largura que eles escolherem for maior que 180pt, ela ainda será limitada.Adicionar
fixedSize()
aoHStack
também funciona, porqueHStack
também encaminhará a.unspecified
proposta para seus filhos, em vez de tentar espaçá-los uniformemente (literalmente, isso não pode ser feito porque não há largura proposta).No entanto,
fixedSize()
não permitirá que os botões encolham também. Se oHStack
for muito estreito, os botões excederão os limites doHStack
. Se isso for indesejável, você pode precisar escrever seu próprioLayout
. Embora esteja relativamente claro o que você quer fazer no caso de 2 visualizações, não está muito claro como você quer que isso funcione em geral.* Mais precisamente, o
HStack
próprio recebeu uma proposta de tamanho com largura < 360pt + espaçamento padrão deHStack
.