No iOS 7, sizeWithFont:
agora está obsoleto. Como agora passo o objeto UIFont para o método de substituição sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
fonte
fonte
NSString
e umUILabel
(não SEMPRE o caso, mas muitas vezes sim), para evitar código duplicado / etc, você também pode substituir[UIFont systemFontOfSize:17.0f]
porlabel.font
- ajuda na manutenção do código fazendo referência a dados existentes, digitando-o várias vezes ou fazendo referência a constantes em todo o local, etcboundingRectWithSize:options:attributes:context:
, passandoCGSizeMake(250.0f, CGFLOAT_MAX)
na maioria dos casos.Acredito que a função foi descontinuada porque essa série de
NSString+UIKit
funções (sizewithFont:...
, etc) se baseava naUIStringDrawing
biblioteca, o que não era seguro para threads. Se você tentou executá-los não no segmento principal (como qualquer outraUIKit
funcionalidade), obterá comportamentos imprevisíveis. Em particular, se você executou a função em vários segmentos simultaneamente, provavelmente o aplicativo falhará. É por isso que no iOS 6, eles introduziram oboundingRectWithSize:...
método paraNSAttributedString
. Isso foi criado no topo dasNSStringDrawing
bibliotecas e é seguro para threads.Se você observar a nova
NSString
boundingRectWithSize:...
função, ela solicitará uma matriz de atributos da mesma maneira que aNSAttributeString
. Se eu tivesse que adivinhar, essa novaNSString
função no iOS 7 é apenas um invólucro para aNSAttributeString
função do iOS 6.Nessa nota, se você estivesse suportando apenas o iOS 6 e o iOS 7, eu definitivamente mudaria todo o seu
NSString
sizeWithFont:...
para oNSAttributeString
boundingRectWithSize
. Isso poupará muita dor de cabeça se você tiver uma caixa de esquina multi-threading estranha! Aqui está como eu convertiNSString
sizeWithFont:constrainedToSize:
:O que costumava ser:
Pode ser substituído por:
Observe a documentação mencionada:
Portanto, para extrair a altura ou largura calculada a ser usada para as vistas de dimensionamento, eu usaria:
fonte
Como você pode ver
sizeWithFont
no site da Apple Developer, ele está obsoleto, por isso precisamos usá-losizeWithAttributes
.fonte
[NSObject respondsToSelector:]
método como aqui: stackoverflow.com/a/3863039/1226304Eu criei uma categoria para lidar com esse problema, aqui está:
Desta forma, você só tem que encontrar / substituir
sizeWithFont:
comsizeWithMyFont:
e você está pronto para ir.fonte
No iOS7, eu precisava da lógica para retornar a altura correta para o método tableview: heightForRowAtIndexPath, mas o sizeWithAttributes sempre retorna a mesma altura, independentemente do comprimento da string, porque ele não sabe que será colocado em uma célula da tabela de largura fixa . Achei isso ótimo para mim e calcula a altura correta, levando em consideração a largura da célula da tabela! Isso se baseia na resposta do Sr. T acima.
fonte
Etiquetas com várias linhas que usam altura dinâmica podem exigir informações adicionais para definir o tamanho corretamente. Você pode usar sizeWithAttributes com UIFont e NSParagraphStyle para especificar a fonte e o modo de quebra de linha.
Você definiria o estilo de parágrafo e usaria um NSDictionary como este:
Você pode usar a propriedade CGSize 'ajustadoSize' ou CGRect como ret.size.height se estiver procurando a altura.
Mais informações sobre o NSParagraphStyle aqui: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
fonte
fonte
Crie uma função que utilize uma instância UILabel. e retorna CGSize
fonte
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Solução alternativa
fonte
Com base no @bitsand, este é um novo método que acabei de adicionar à minha categoria NSString + Extras:
Eu apenas uso o tamanho do quadro resultante.
fonte
Você ainda pode usar
sizeWithFont
. mas, no iOS> = 7.0, o método causa falha se a string contiver espaços à esquerda e à direita ou linhas finais\n
.Aparar texto antes de usá-lo
Isso também pode ser aplicado a
sizeWithAttributes
e[label sizeToFit]
.Além disso, sempre que você tiver um
nsstringdrawingtextstorage message sent to deallocated instance
dispositivo iOS 7.0, ele lida com isso.fonte
Melhor usar as dimensões automáticas (Swift):
NB: 1. O protótipo UITableViewCell deve ser projetado corretamente (para a instância, não esqueça de definir UILabel.numberOfLines = 0 etc) 2. Remova o método HeightForRowAtIndexPath
VÍDEO: https://youtu.be/Sz3XfCsSb6k
fonte
fonte
A resposta aceita no Xamarin seria (use sizeWithAttributes e UITextAttributeFont):
fonte
Como resposta da @Ayush:
Bem, supondo que em 2019+ você provavelmente esteja usando Swift e, em
String
vez de Objective-cNSString
, e aqui está a maneira correta de obter o tamanho de aString
com fonte predefinida:fonte
fonte
Aqui está o equivalente ao monotouch, se alguém precisar:
que pode ser usado assim:
fonte
fonte
Experimente esta sintaxe:
fonte
Nada disso funcionou para mim no iOS 7. Aqui está o que eu acabei fazendo. Coloquei isso na minha classe de célula personalizada e chamo o método no meu método heightForCellAtIndexPath.
Meu celular é semelhante à célula de descrição ao visualizar um aplicativo na loja de aplicativos.
Primeiro no storyboard, defina seu rótulo como 'attributeText', defina o número de linhas como 0 (que redimensionará o rótulo automaticamente (apenas no iOS 6 ou superior)) e defina-o como quebra de linha.
Depois, adiciono todas as alturas do conteúdo da célula na minha Classe de célula personalizada. No meu caso, eu tenho um Label na parte superior que sempre diz "Description" (_descriptionHeadingLabel), um rótulo menor de tamanho variável que contém a descrição real (_descriptionLabel), uma restrição da parte superior da célula ao cabeçalho (_descriptionHeadingLabelTopConstraint) . Também adicionei 3 ao espaço um pouco mais abaixo (aproximadamente a mesma quantidade que a maçã coloca na célula do tipo de legenda).
E no meu delegado Table View:
Você pode alterar a instrução if para ser um pouco mais inteligente e obter o identificador da célula de algum tipo de fonte de dados. No meu caso, as células serão codificadas, uma vez que haverá uma quantidade fixa delas em uma ordem específica.
fonte
boundingRectWithSize
no ios 9.2 apresenta problemas, resultados diferentes são para ios <9.2. Você encontrou ou conhece outra maneira melhor de fazer isso.