O que é – bom para?

Na minha pergunta ” Como obtenho -[NSString sizeWithFont:forWidth:lineBreakMode:] para funcionar? “, Aprendi que -[NSString sizeWithFont:constrainedToSize:lineBreakMode:] era realmente o que eu precisava.

A documentação para -[NSString sizeWithFont:forWidth:lineBreakMode:] explica que, na verdade, ele não envolve o texto em linhas adicionais. Então, como eu usaria isso? (Exemplos ajudariam.)

Ele funciona muito bem para seqüências de várias linhas também.

Basicamente, é uma function que permite ver o tamanho de uma string quando ela é renderizada com um modo de fonte e quebra de linha.

Eu uso em alguns pontos da minha aplicação quando tenho texto de tamanho variável que quero exibir em uma determinada área.

Por padrão, um UILabel centrará o texto verticalmente. Para que o texto seja alinhado na parte superior, é necessário dimensionar o label para que seja apenas a altura exigida pela string que está nele.

Eu uso esse método para fazer isso.

E o exemplo de como eu usaria isso para fazer isso é o seguinte:

 //Calculate the expected size based on the font and linebreak mode of your label CGSize maximumLabelSize = CGSizeMake(296,9999); CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode]; //adjust the label the the new height. CGRect newFrame = yourLabel.frame; newFrame.size.height = expectedLabelSize.height; yourLabel.frame = newFrame; 

Você especifica o tamanho de uma área em que você tem que colocar o texto, e então este método lhe diz quanto espaço irá ocupar (encapsulando conforme necessário). Além disso, se a cadeia de caracteres transbordar os limites do retângulo fornecido, você poderá informar e, em seguida, decidir como exibir o texto.

A referência a ele, na verdade, não está encerrando o texto, porque esse método não faz nada no texto. Ele praticamente expõe e retorna o tamanho de uma área que precisaria para realmente distribuí-la.

é da responsabilidade do label (ou do recipiente que você está usando para o texto) executar a embalagem / o que mais precisa ser feito.

Espero que ajude.

chris.

Por um tempo, pensei que essa rotina estava simplesmente quebrada. Parece que é a rotina perfeita para descobrir o quão alto é um pedaço de texto, quando envolvido em uma certa largura . No entanto, isso não é o que faz. De fato, a altura retornada é sempre uma única linha. (O que é inútil, aliás: a UIFont da UIFont retorna o mesmo valor.)

Para citar a documentação no momento da redação:

Embora calcule onde as quebras de linha ocorreriam, esse método não encapsula o texto em linhas adicionais; […]

Esta frase me confundiu por um longo tempo. Meus pensamentos correram ao longo das linhas de:

  • Computação de quebras de linha, mas não quebra automática. Eh?
  • Talvez eles signifiquem que o NSString receptor não será mutado para refletir as quebras de linha? Mas eu não espero isso de qualquer maneira?
  • Esta frase não é consistente consigo mesma. Não tenho escolha a não ser ignorar isso.

No entanto, verifica-se que existe um significado que corresponde ao comportamento que vemos. Parece que o que eles querem dizer é:

Essa rotina calculará onde ocorrerá a primeira quebra de linha e todo o texto depois disso será ignorado para fins de cálculo da checkbox delimitadora.

A checkbox delimitadora retornada terá, portanto, a altura de uma única linha e uma largura até o máximo especificado. (A largura pode ser menor dependendo de onde a quebra de linha é calculada ou se o texto é curto o suficiente para não precisar da largura máxima.)

Para responder a pergunta: para que serve? Eu não encontrei nada útil: apenas coisas em que achei que seria útil, mas não era. Algumas coisas que vêm à mente, no entanto, são:

  • Centralizar um trecho de texto de uma única linha. Estou pensando em botões e / ou títulos aqui. (Embora o UILabel e o UIButton possam fazê-lo, às vezes você mesmo deseja desenhá-lo.)
  • Calculando os limites para um “extrato” de um pedaço de texto mais longo. Aqui estou pensando em onde você pode querer mostrar um fragment de um texto muito maior.

Parece que seria bom para labels de linha única. Por exemplo, se você estiver desenhando uma string que pode estar truncada ou ter uma quebra de linha, mas na verdade não vai desenhar mais de uma linha. Ainda pode ser útil saber a altura e a largura exatas da string, para que você possa posicioná-la exatamente onde quiser (e desenhar outros itens da UI ao redor).

Aqui está algo que eu inventei depois de aplicar alguns princípios do exemplo do PyjamaSam:

 AnnotationPin *myAnnotation = (AnnotationPin *)annotation; self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier]; self.backgroundColor = [UIColor greenColor]; self.frame = CGRectMake(0,0,30,30); imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE]; imageView.frame = CGRectMake(3,3,20,20); imageView.layer.masksToBounds = NO; [self addSubview:imageView]; [imageView release]; CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; CGRect newFrame = self.frame; newFrame.size.height = titleSize.height + 12; newFrame.size.width = titleSize.width + 32; self.frame = newFrame; self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor; self.layer.borderWidth = 3.0; UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)]; infoLabel.text = myAnnotation.title; infoLabel.backgroundColor = [UIColor clearColor]; infoLabel.textColor = [UIColor blackColor]; infoLabel.textAlignment = UITextAlignmentCenter; infoLabel.font = [UIFont systemFontOfSize:12]; [self addSubview:infoLabel]; [infoLabel release]; 

Neste exemplo, estou adicionando um pino personalizado a uma class MKAnnotation que redimensiona um UILabel de acordo com o tamanho do texto. Ele também adiciona uma imagem no lado esquerdo da visualização, para que você veja parte do código que gerencia o espaçamento adequado para manipular a imagem e o preenchimento.

A chave é usar CGSize titleSize = [myAnnotation.THETEXT sizeWithFont: [UIFont systemFontOfSize: 12]]; e depois redefinir as dimensões da vista. Você pode aplicar essa lógica a qualquer visão, mas não lida com quebras de linha como as do Pyjama.

Embora a resposta do Pyjama funcione para alguns, não funcionou para mim. Esta é uma explicação detalhada que você deve tentar imediatamente antes de ir para outro lugar se quiser um pino MKAnnotation personalizado dynamic com uma imagem e UILabel redimensionável.