Eu tenho esse problema estranho, e estou lidando com ele há mais de 8 horas. Dependendo da situação, eu tenho que calcular o UILabels
tamanho dinamicamente,
por exemplo ,
meu UIViewController
recebe um evento e eu mudo o UILabels
tamanho. de maior para menor. O tamanho do meu UILabel
fica menor e eu obtenho o tamanho correto necessário, mas o texto no meu UILabel
permanece o mesmo, o mesmo tamanho de fonte etc. Eu preciso que a fonte diminua, para que o texto inteiro caiba no UILabel
. Então a questão é como fazer o texto caber na minha etiqueta autoshrinking
ou algo assim?
No meu xib
, UILabels
autoshrink
está marcado, também o número de linhas é definido como 0 e também minha string tem novos símbolos de linha (\ n) e selecionei o modo de quebra de linha para wordwrap
. Talvez alguém estivesse na mesma situação que eu agora e pudesse me ajudar? Eu realmente iria apreciar isso.
Desde já, obrigado!
EDITAR: UILabel
o tamanho mínimo da fonte é definido como 10
fonte
Respostas:
Caso você ainda esteja procurando uma solução melhor, acho que o que você quer:
Um valor booleano que indica se o tamanho da fonte deve ser reduzido para ajustar a string do título no retângulo delimitador do rótulo (esta propriedade é efetiva apenas quando a
numberOfLines
propriedade é definida como 1).Ao definir esta propriedade,
minimumScaleFactor
DEVE ser definido também (um bom padrão é 0,5).Rápido
Objective-C
Um valor booleano que indica se o espaçamento entre as letras deve ser ajustado para caber na string dentro do retângulo de limites do rótulo.
Rápido
Objective-C
Fonte .
fonte
minimumFontSize
está obsoleto no iOS 6.0. Use em seuminimumScaleFactor
lugar.É assim que consigo o UILabel
Autoshrink
funcionar (especialmente para altura de ajuste da fonte do rótulo no dispositivo 4s do 6s Plus Storyboard) no iOS 9.2, Xcode 7.2 ...fonte
minimumFontSize
está obsoleto no iOS 6.Portanto, use em
minimumScaleFactor
vez deminmimumFontSize
.Swift 5
fonte
também minha solução é o booleano label.adjustsFontSizeToFitWidth = YES; MAS. Você deve no construtor de interface a mudança de Word Wrapping para " CLIP ". Em seguida, reduza automaticamente os rótulos. Isto é muito importante.
fonte
No Swift 3 (programaticamente), tive que fazer isso:
fonte
Você pode escrever como
Você pode calcular o número de linhas assim
Espero que isso ajude você :-) aguardando sua resposta
fonte
Bem, no final eu não encontrei minha resposta. E acho que o autoshrink não funciona para várias linhas. Acabei usando a sugestão neste link: autoshrink em um UILabel com várias linhas
A solução é calcular a altura do texto na largura dada e se o texto for maior, diminuir o tamanho da fonte e fazer o mesmo novamente até que a altura seja igual ou menor que o tamanho necessário.
Não entendo por que isso deve ser tão difícil de implementar. Se eu estiver faltando alguma coisa, todos são bem-vindos para me corrigir :)
fonte
Isso é para Swift 3 executando Xcode 8.2.1 (8C1002)
A melhor solução que encontrei é definir uma largura fixa em seu Storyboard ou IB na etiqueta. Defina suas restrições com restrição às margens. Em seu viewDidLoad, adicione as seguintes linhas de código:
Isso funcionou perfeitamente e não transborda para uma nova linha e encolhe o texto para caber na largura da etiqueta sem problemas estranhos e funciona no Swift 3.
fonte
É uma ótima pergunta, porque parece que isso já seria parte da
UIKit
funcionalidade interna ou de uma estrutura relacionada. Aqui está um bom exemplo visual da pergunta:Não há maneira fácil de contornar isso, mas é definitivamente possível. Uma maneira de fazer isso é tentar de forma programática diferentes tamanhos de fonte até encontrar uma que se ajuste razoavelmente perto dos limites da visualização. Você pode fazer isso com a
boundingRect()
função deNSString
ouNSAttributedString
. Por exemplo:Você pode fazer uma pesquisa binária para ser mais eficiente do que uma abordagem de força bruta completa. Existem também algumas considerações que são um pouco mais envolvidas, incluindo quebra de linha correta e desempenho de cache de fonte do iOS, se você estiver procurando por algo realmente robusto.
Se você só se preocupa em mostrar o texto na tela de maneira fácil, desenvolvi uma implementação robusta em Swift, que também estou usando em um aplicativo de produção. É uma
UIView
subclasse com dimensionamento de fonte eficiente e automático para qualquer texto de entrada, incluindo várias linhas. Para usá-lo, você simplesmente faria algo como:É isso aí! Você pode encontrar a fonte completa aqui: https://github.com/FlickType/AccessibilityKit
Espero que isto ajude!
fonte
No iOS 9, eu só precisava:
Alguém recomendou definir o número de linhas como 0, mas para mim isso apenas fez o rótulo ir para várias linhas ...
fonte
UILabel
e umUITextField
em uma célula estática e clicar em "Resolve AutoLayout Issues" e "Add Missing Constraints". Tudo estava alinhado, mas Autoshrink precisava saber a distância até o rótulo, para o qual "Adicionar restrições ausentes" não adicionou uma restrição.Eu acho que você pode escrever o código abaixo depois de alocar init Label
Está funcionando bem comigo Use-o
fonte
Dois anos depois, e esse problema ainda está por aí ...
No iOS 8 / XCode 6.1, às vezes percebia que meu
UILabel
(criado em aUITableViewCell
, com AutoLayout ativado e restrições flexíveis para que tivesse muito espaço) não se redimensionava para caber na string de texto.A solução, como nos anos anteriores, foi definir o texto e depois telefonar
sizeToFit
.(Suspiro.)
fonte
Veja como fazer isso. Suponha que a seguinte messageLabel seja o rótulo que você deseja que tenha o efeito desejado. Agora, tente estas linhas simples de códigos:
fonte
não funciona se o
numberOfLines > 1
que eu fiz fizesse uma condição como esta-fonte
Chegando tarde à festa, mas como eu tinha o requisito adicional de ter uma palavra por linha, essa adição funcionou para mim:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
Apple Docs diz:
Mas isso é mentira. Uma mentira eu te digo! É verdade para todas as versões do iOS. Especificamente, isso é verdadeiro ao usar um
UILabel
dentro de umUICollectionViewCell
para o qual o tamanho é determinado por restrições ajustadas dinamicamente no tempo de execução por meio do layout personalizado (por exemploself.menuCollectionViewLayout.itemSize = size
).Portanto, quando usado em conjunto com
adjustsFontSizeToFitWidth
eminimumScaleFactor
, conforme mencionado nas respostas anteriores, a configuração programada comnumberOfLines
base na contagem de palavras resolveu o problema de redução automática. Fazer algo semelhante com base na contagem de palavras ou até mesmo na contagem de caracteres pode produzir uma solução "próxima o suficiente".fonte
Em Swift 4 (programaticamente):
fonte
Swift 4, Xcode 9.4.1
A solução que funcionou para mim: eu tinha um rótulo dentro de uma célula de visualização de coleção e o texto do rótulo estava sendo cortado. Defina os atributos como abaixo no Storyboard
fonte