Eu tenho um UILabel
que pode ter comprimentos variados dependendo se meu aplicativo está ou não sendo executado no modo retrato ou paisagem em um iPhone ou iPad. Quando o texto é muito longo para ser exibido em uma linha e trunca, quero que o usuário possa pressioná-lo e obter um pop-up do texto completo.
Como posso verificar se o UILabel
está truncando o texto? É mesmo possível? No momento, estou apenas verificando comprimentos diferentes com base no modo em que estou, mas não funciona muito bem.
UILabel
API.Respostas:
Você pode calcular a largura da corda e ver se a largura é maior que
label.bounds.size.width
O NSString UIKit Additions possui vários métodos para calcular o tamanho da string com uma fonte específica. No entanto, se você tiver um minimumFontSize para sua etiqueta que permita que o sistema reduza o texto a esse tamanho. Você pode querer usar sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode: nesse caso.
fonte
numberOfLines
retorna o número máximo de linhas usadas para exibir o texto, conforme descrito naUILabel
referência da classe: developer.apple.com/library/ios/documentation/UIKit/Reference/…Swift (como extensão) - funciona para uilabel multilinhas:
swift4: (
attributes
parâmetroboundingRect
ligeiramente alterado)swift3:
swift2:
fonte
EDIT: Acabei de ver que minha resposta foi votada positivamente, mas o trecho de código que forneci está obsoleto.
Agora, a melhor maneira de fazer isso é (ARC):
Observe que o tamanho calculado não é um valor inteiro. Portanto, se você fizer coisas como
int height = rect.size.height
, perderá alguma precisão de ponto flutuante e poderá ter resultados errados.Resposta antiga (obsoleta):
Se o seu rótulo for multilinha, você pode usar este código:
fonte
você pode fazer uma categoria com UILabel
fonte
textRectForBounds:limitedToNumberOfLines:
"Você não deve chamar este método diretamente" ...setNeedsLayout()
layoutIfNeeded()
no início do método.Use esta categoria para descobrir se um rótulo está truncado no iOS 7 e superior.
fonte
Swift 3
Você pode contar o número de linhas após atribuir a string e comparar com o número máximo de linhas do rótulo.
fonte
Para adicionar à resposta do iDev , você deve usar em
intrinsicContentSize
vez deframe
, para fazer funcionar para Autolayoutfonte
É isso. Isso funciona
attributedText
, antes de voltar ao normaltext
, o que faz muito sentido para nós, pessoas que lidamos com várias famílias de fontes, tamanhos e até mesmo NSTextAttachments!Funciona bem com autolayout, mas obviamente as restrições devem ser definidas e configuradas antes de verificarmos
isTruncated
, caso contrário, o rótulo em si nem mesmo saberá como se dispor, então de forma alguma saberia se está truncado.Não funciona abordar esse problema com apenas um
NSString
esizeThatFits
. Não tenho certeza de como as pessoas estão obtendo resultados positivos como esse. BTW, como mencionei inúmeras vezes, usarsizeThatFits
não é o ideal de forma alguma, pois leva em consideraçãonumberOfLines
o tamanho resultante, o que anula todo o propósito do que estamos tentando fazer, poisisTruncated
sempre retornariafalse
independentemente de estar truncado ou não.fonte
Aqui está a resposta selecionada no Swift 3 (como uma extensão). O OP estava perguntando sobre rótulos de 1 linha. Muitas das respostas rápidas que tentei aqui são específicas para rótulos de várias linhas e não estão sinalizando corretamente em rótulos de uma única linha.
fonte
Isso funciona para iOS 8:
fonte
Eu escrevi uma categoria para trabalhar com o truncamento UILabel. Funciona no iOS 7 e posterior. Espero que ajude ! truncamento de cauda uilabel
fonte
Você pode calcular a largura da string e ver se a largura é maior do que a largura do rótulo.
fonte
Para adicionar ao que @iDev fez, eu modifiquei o
self.frame.size.height
para usarlabel.frame.size.height
e também não useiNSStringDrawingUsesLineFontLeading
. Após essas modificações, consegui um cálculo perfeito de quando o truncamento aconteceria (pelo menos para o meu caso).fonte
Tive problemas
boundingRect(with:options:attributes:context:)
ao usar autolayout (para definir uma altura máxima) e um texto atribuído comNSParagraph.lineSpacing
O espaçamento entre as linhas foi ignorado (mesmo quando passado
attributes
para oboundingRect
método), portanto, o rótulo pode ser considerado como não truncado quando estava.A solução que encontrei é usar
UIView.sizeThatFits
:fonte
Como todas as respostas acima usam métodos depreciados, achei que isso poderia ser útil:
fonte
Para lidar com o iOS 6 (sim, alguns de nós ainda precisam), aqui está mais uma expansão para a resposta do @iDev. A principal conclusão é que, para iOS 6, certifique-se de que o numberOfLines de seu UILabel esteja definido como 0 antes de chamar sizeThatFits; se não, ele lhe dará um resultado que diz que "os pontos para desenhar numberOfLines com altura" são necessários para desenhar o texto do rótulo.
fonte
Certifique-se de chamar qualquer um deles em viewDidLayoutSubviews.
fonte
SWIFT 5
Exemplo para um UILabel de múltiplas linhas que é configurado para exibir apenas 3 linhas.
Embora o usuário possa selecionar a tecla de retorno, adicionando uma linha extra sem adicionar à "largura do texto", nesse caso algo como isso também pode ser útil.
fonte
Solução Swift 3
Acho que a melhor solução é (1) criar um
UILabel
com as mesmas propriedades do rótulo que você está verificando para truncamento, (2) chamar.sizeToFit()
, (3) comparar os atributos do rótulo fictício com seu rótulo real.Por exemplo, se você quiser verificar se uma etiqueta com uma linha com largura variável trunca ou não, você pode usar esta extensão:
... mas, novamente, você pode modificar facilmente o código acima para atender às suas necessidades. Então, digamos que sua etiqueta seja multilinha e tenha altura variável. Então, a extensão seria algo assim:
fonte
Não seria fácil definir o atributo de título para o rótulo? Definir isso exibirá o rótulo completo ao passar o mouse.
você pode calcular o comprimento do rótulo e a largura div (converter para comprimento - jQuery / Javascript - como faço para converter um valor de pixel (20px) para um valor numérico (20) ).
defina jquery para definir o título se o comprimento for maior que a largura div.
fonte