Existe uma boa maneira de ajustar o tamanho de UITextView
a de acordo com seu conteúdo? Digamos, por exemplo, eu tenho um UITextView
que contém uma linha de texto:
"Hello world"
Depois, adiciono outra linha de texto:
"Goodbye world"
Existe uma boa maneira no Cocoa Touch de obter o rect
que reterá todas as linhas na exibição de texto para que eu possa ajustar a exibição principal adequadamente?
Como outro exemplo, observe o campo das notas para eventos no aplicativo Calendário - observe como a célula (e UITextView
ela contém) se expande para conter todas as linhas de texto na sequência das notas.
ios
cocoa-touch
autolayout
uikit
uitextview
drewh
fonte
fonte
Respostas:
Isso funciona para iOS 6.1 e iOS 7:
Ou no Swift (funciona com o Swift 4.1 no iOS 11)
Se você deseja suporte para o iOS 6.1, também deve:
fonte
textview.scrollEnabled = NO;
impedir que o texto de ficar cortado até mesmo no iOS 7.CGFLOAT_MAX
macro em vez deMAXFLOAT
. Adequado em ambas as plataformas de 32/64 bits.Isso não funciona mais no iOS 7 ou superior
Na verdade, existe uma maneira muito fácil de redimensionar a
UITextView
altura correta do conteúdo. Isso pode ser feito usando oUITextView
contentSize
.Uma coisa a notar é que o correto
contentSize
só está disponível depois de oUITextView
ter sido adicionada à vista comaddSubview
. Antes disso, é igual aframe.size
Isso não funcionará se o layout automático estiver ativado. Com o layout automático, a abordagem geral é usar o
sizeThatFits
método e atualizar oconstant
valor em uma restrição de altura.heightConstraint
é uma restrição de layout que você normalmente configura por meio de um IBOutlet vinculando a propriedade à restrição de altura criada em um storyboard.Apenas para adicionar a esta resposta incrível, 2014, se você:
há uma diferença de comportamento apenas no iPhone6 + :
Com apenas o 6+ (não os 5s ou 6), ele adiciona "mais uma linha em branco" ao UITextView. A "solução RL" corrige isso perfeitamente:
Corrige o problema da "linha extra" em 6 ou mais.
fonte
layoutIfNeeded
para a superview. Então você pode pegar a altura decontentSize
.Para fazer um dimensionamento dinâmico
UITextView
dentro de aUITableViewCell
, achei a seguinte combinação funcionando no Xcode 6 com o iOS 8 SDK:UITextView
aUITableViewCell
e restrinja-o para os ladosUITextView
'sscrollEnabled
propriedade paraNO
. Com a rolagem ativada, o quadro daUITextView
é independente do tamanho do conteúdo, mas com a rolagem desativada, há um relacionamento entre as duas.Se sua tabela estiver usando a altura da linha padrão original de 44, ela calculará automaticamente a altura da linha, mas se você alterou a altura da linha padrão para outra coisa, talvez seja necessário ativar manualmente o cálculo automático da altura da linha em
viewDidLoad
:Para dimensionamentos dinâmicos somente leitura
UITextView
, é isso. Se você estiver permitindo que os usuários editem o texto no seuUITextView
, também precisará:Implemente o
textViewDidChange:
método doUITextViewDelegate
protocolo e digatableView
para repintar a si próprio toda vez que o texto for editado:E não esqueça de colocar o
UITextView
delegado em algum lugar, dentroStoryboard
ou foratableView:cellForRowAtIndexPath:
fonte
tableView.rowHeight = UITableViewAutomaticDimension
foi desnecessário.Solução de trabalho muito fácil, usando código e storyboard.
Por Código
Por Storyboard
Desmarque a opção Ativar rolagem
Não há necessidade de fazer nada além disso.
fonte
Rápido :
fonte
textView.scrollEnabled = false
Na minha experiência (limitada),
não respeita os caracteres de nova linha, portanto, você pode acabar com muito menos do
CGSize
que o necessário.parece respeitar as novas linhas.
Além disso, o texto não é renderizado na parte superior do
UITextView
. No meu código, defino a nova altura deUITextView
24 pixels maior que a altura retornada pelossizeOfFont
métodos.fonte
No iOS6, você pode verificar a
contentSize
propriedade do UITextView logo após definir o texto. No iOS7, isso não funcionará mais. Se você deseja restaurar esse comportamento para iOS7, coloque o seguinte código em uma subclasse de UITextView.fonte
Vou postar a solução certa na parte inferior da página, caso alguém seja corajoso (ou desesperado o suficiente) para ler até este ponto.
Aqui está o repositório do gitHub para aqueles que não querem ler todo esse texto: resizableTextView
Isso funciona com o iOs7 (e acredito que funcionará com o iOs8) e com a execução automática. Você não precisa de números mágicos, desative o layout e coisas assim. Solução curta e elegante.
Eu acho que todo código relacionado a restrições deve ir para o
updateConstraints
método Então, vamos fazer o nossoResizableTextView
.O primeiro problema que encontramos aqui é que não sabemos o tamanho real do conteúdo antes do
viewDidLoad
método. Podemos pegar uma estrada longa e de buggy e calculá-la com base no tamanho da fonte, quebras de linha, etc. Mas precisamos de uma solução robusta, então faremos:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Portanto, agora sabemos o real contentSize, não importa onde estamos: antes ou depois
viewDidLoad
. Agora adicione restrição de altura no textView (via storyboard ou código, não importa como). Ajustaremos esse valor com nossocontentSize.height
:A última coisa a fazer é dizer à superclasse
updateConstraints
.Agora nossa classe se parece com:
ResizableTextView.m
Bonito e limpo, certo? E você não precisa lidar com esse código em seus controladores !
Mas espere! S NÃO ANIMAÇÃO!
Você pode animar facilmente as alterações para fazer
textView
alongamentos sem problemas. Aqui está um exemplo:fonte
CGFLOAT_MAX
, nãoFLT_MAX
.Você tentou
[textView sizeThatFits:textView.bounds]
?Edit: sizeThatFits retorna o tamanho, mas na verdade não redimensiona o componente. Não tenho certeza se é isso que você quer ou se
[textView sizeToFit]
é mais o que você estava procurando. Em ambos os casos, não sei se ele se encaixará perfeitamente no conteúdo como você deseja, mas é a primeira coisa a tentar.fonte
Outro método é encontrar o tamanho que uma determinada string ocupará usando o
NSString
método:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Isso retorna o tamanho do retângulo que se ajusta à sequência especificada com a fonte especificada. Passe em um tamanho com a largura desejada e a altura máxima e, em seguida, observe a altura retornada para caber no texto. Existe uma versão que permite especificar também o modo de quebra de linha.
Você pode usar o tamanho retornado para alterar o tamanho da sua visualização.
fonte
Se você não tiver o
UITextView
prático (por exemplo, você está dimensionando as células da visualização da tabela), terá que calcular o tamanho medindo a string e, em seguida, contabilizando os 8 pt de preenchimento em cada lado de aUITextView
. Por exemplo, se você conhece a largura desejada da sua exibição de texto e deseja descobrir a altura correspondente:Aqui, cada 8 representa uma das quatro arestas acolchoadas e 100000 serve apenas como um tamanho máximo muito grande.
Na prática, você pode adicionar um extra
font.leading
à altura; isso adiciona uma linha em branco abaixo do texto, que pode parecer melhor se houver controles visualmente pesados diretamente abaixo da exibição de texto.fonte
Podemos fazer isso por restrições.
2.Crie o IBOutlet para essa restrição de altura.
3. não se esqueça de definir o delegado para sua visualização de texto.
4)
atualize sua restrição assim :)
fonte
As seguintes coisas são suficientes:
UITextView
:Você pode até usar
UITableViewAutomaticDimension
.fonte
Combinado com a resposta de Mike McMaster, você pode fazer algo como:
fonte
Eu descobri uma maneira de redimensionar a altura de um campo de texto de acordo com o texto dentro dele e também organizar um rótulo abaixo dele com base na altura do campo de texto! Aqui está o código.
fonte
Pessoas que usam o autolayout e seu tamanho não estão funcionando. Verifique sua restrição de largura uma vez. Se você perdeu a restrição de largura, a altura será precisa.
Não há necessidade de usar nenhuma outra API. apenas uma linha resolveria todo o problema.
Aqui, eu estava preocupado apenas com a altura, mantendo a largura fixa e perdendo a restrição de largura do meu TextView no storyboard.
E isso foi para mostrar o conteúdo dinâmico dos serviços.
Espero que isso possa ajudar ..
fonte
A partir do iOS 8, é possível usar os recursos de layout automático de um UITableView para redimensionar automaticamente um UITextView sem nenhum código personalizado. Eu coloquei um projeto no github que demonstra isso em ação, mas aqui está a chave:
rowHeight
comoUITableViewAutomaticDimension
.fonte
Revisei todas as respostas e todas estão mantendo a largura fixa e ajustando apenas a altura. Se você deseja ajustar também a largura, pode facilmente usar este método:
portanto, ao configurar sua exibição de texto, defina a rolagem desativada
e, em seguida, no método delegado,
func textViewDidChange(_ textView: UITextView)
adicione este código:Saídas:
fonte
Isso funcionou muito bem quando eu precisei transformar o texto em uma
UITextView
área específica:fonte
aqui está a versão rápida do @jhibberd
fonte
desativar rolagem
adicionar constaints
e adicione seu texto
se você usar
UIScrollView
, adicione-o também;fonte
Para o iOS 7.0, em vez de definir
frame.size.height
o usocontentSize.height
(que atualmente não faz nada)[textView sizeToFit]
.Veja esta pergunta .
fonte
Usar o UITextViewDelegate é a maneira mais fácil:
fonte
Espero que isto ajude:
fonte
textView.frame
.se algum outro chegar aqui, esta solução funcionará para mim, 1 "Ronnie Liew" +4 "user63934" (meu texto chega do serviço da web): observe os 1000 (nada pode ser tão grande "no meu caso")
E isso é ... Saúde
fonte
A melhor maneira que descobri para redimensionar a altura do UITextView de acordo com o tamanho do texto.
ou você pode usar
fonte
Para aqueles que desejam que a visualização de texto realmente suba e mantenha a posição final
fonte
O único código que funcionará é o que usa 'SizeToFit', como na resposta jhibberd acima, mas na verdade ele não será capturado, a menos que você o chame no ViewDidAppear ou ligue-o ao evento alterado de texto UITextView.
fonte
Com base na resposta de Nikita Took, cheguei à seguinte solução no Swift, que funciona no iOS 8 com autolayout:
fonte
Resposta rápida: O código a seguir calcula a altura do seu textView.
Agora você pode definir a altura do seu textView como
myTextHeight
fonte
let attribute = [NSFontAttributeName: textView.text.font!]
este é realmente o código Swift sem erros?) Você quis dizer #let attribute = [NSFontAttributeName: textView.font!]