No construtor de interfaces, pressionar Command+ =redimensionará um botão para ajustar seu texto. Fiquei me perguntando se isso era possível fazer programaticamente antes que o botão fosse adicionado à exibição.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal];
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Respostas:
No Xcode 4.5 e superior, isso agora pode ser feito usando ' Layout automático / restrições '.
As principais vantagens são as seguintes:
Algumas desvantagens:
O mais legal é que nos concentramos em declarar uma intenção como:
Aqui está um tutorial simples para ser apresentado ao layout automático.
Para mais detalhes .
No início, leva algum tempo, mas com certeza parece que valerá a pena.
fonte
No UIKit, há adições à classe NSString para obter de um determinado objeto NSString o tamanho que ele assumirá quando renderizado em uma determinada fonte.
Docs estava aqui . Agora está aqui em Descontinuado.
Em resumo, se você for:
... você definirá o quadro do botão para a altura e largura da string que está renderizando.
Você provavelmente desejará experimentar algum espaço de buffer em torno desse CGSize, mas estará começando no lugar certo.
fonte
A maneira de fazer isso no código é:
Se você estiver na subclasse e quiser adicionar regras extras, poderá substituir:
fonte
-(CGSize)sizeThatFits:(CGSize)size
.[button setTitle:@"Your text here" forState:UIControlStateNormal];
[button sizeToFit];
Além disso, se você atualizar o texto posteriormente, não se esqueça de chamá-lo novamente.sizeToFit()
não respeita as inserções da borda do título.Se seu botão foi criado com o Interface Builder e você está alterando o título no código, você pode fazer isso:
fonte
Rápido:
O importante aqui é quando você chamará o
.sizeToFit()
, deve ser depois de definir o texto a ser exibido para que ele possa ler o tamanho necessário; se você atualizar o texto posteriormente, ligue novamente.fonte
Para fazer isso usando o layout automático, tente definir uma restrição de largura variável:
Você também pode precisar ajustar
Content Hugging Priority
eContent Compression Resistance Priority
obter os resultados necessários.O UILabel é automaticamente dimensionado automaticamente :
Este UILabel é simplesmente definido para ser centralizado na tela (apenas duas restrições, horizontal / vertical):
Altera larguras totalmente automaticamente:
Você não precisa definir nenhuma largura ou altura - é totalmente automático.
Observe que os pequenos quadrados amarelos são simplesmente anexados ("espaçamento" de zero). Eles se movem automaticamente conforme o UILabel é redimensionado.
Adicionar uma restrição "> =" define uma largura mínima para o UILabel:
fonte
Se você deseja redimensionar o texto em oposição ao botão, pode usar ...
fonte
sizeToFit não funciona corretamente. em vez de:
você também pode adicionar
contentInset
ao botão:myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)
fonte
Simplesmente:
UIView
como wrapper com layout automático para visualizações ao redor.UILabel
dentro desse invólucro. Adicione restrições que colem seu rótulo nas bordas do invólucro.UIButton
dentro do seu invólucro e adicione as mesmas restrições que você fezUILabel
.fonte
Swift 4.2
Graças a Deus, isso resolveu. Depois de definir um texto para o botão, você pode recuperar o intrinsicContentSize, que é o tamanho natural de um UIView (o documento oficial está aqui ). Para o UIButton, você pode usá-lo como abaixo.
Para sua informação, ajustei a largura para torná-la adequada.
Simulador
UIButtons com intrinsicContentSize
Fonte: https://riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font
fonte
Tenho algumas necessidades adicionais relacionadas a este post que
sizeToFit
não solucionam. Eu precisava manter o botão centralizado em seu local original, independentemente do texto. Também nunca quero que o botão seja maior que o tamanho original.Então, eu layout o botão para seu tamanho máximo, salve esse tamanho no Controller e use o seguinte método para dimensionar o botão quando o texto for alterado:
fonte
Essa classe de botão com redimensionamento automático de altura para texto (para Xamarin, mas pode ser reescrita para outro idioma)
fonte
Por alguma razão,
func sizeToFit()
não funciona para mim. Minha configuração é que estou usando um botão dentro de umUITableViewCell
e estou usando o layout automático.O que funcionou para mim é:
intrinsicContentSize
largura porque, de acordo com este documento, o layout automático não tem conhecimento dointrinsicContentSize
. Defina a restrição de largura para aintrinsicContentSize
larguraAqui estão dois títulos do
Debug View Hierachry
fonte
Para ser sincero, acho que é realmente uma pena que não haja uma caixa de seleção simples no storyboard para dizer que você deseja redimensionar os botões para acomodar o texto. Bem, tanto faz.
Aqui está a solução mais simples usando o storyboard.
Coloque o UILabel dentro do UIView. Defina restrições para anexá-lo às bordas do UIView.
Coloque seu UIButton dentro do UIView. Defina as mesmas restrições para anexá-lo às bordas do UIView.
Defina 0 para o número de linhas do UILabel.
Configure as tomadas.
fonte