Pergunta

Antes de eu fazer minhas perguntas, esta é a partir de documentação re da Apple: como determinar a largura de uma string usando Quartz:

Se as medições de texto são importantes para a sua aplicação, é possível calculá-los usando funções Quartz 2D. No entanto, você pode primeiro considerar o uso de Atsui, cuja força está em layout de texto e medição. Atsui tem várias funções que obtenham métricas de texto. Não só você pode obter métricas de texto pós-layout, mas em casos raros você precisa deles, você pode obter antes de layout de métricas de texto. Ao contrário Quartzo, para o qual você deve executar os cálculos você mesmo, Atsui calcula as medições para você. Por exemplo, você pode obter o imagem retângulo delimitador para texto chamando a função Atsui ATSUMeasureTextImage.

Se você decidir que o texto Quartz se adapte às suas necessidades melhor do que Atsui (ou Cacau), você pode seguir estes passos para medir a largura do texto antes Quartz desenha-lo:

  1. Chame a função CGContextGetTextPosition para obter a posição de texto atual.
  2. Definir o texto modo de desenho para kCGTextInvisible usando a função CGContextSetTextDrawingMode.
  3. Desenhe o texto chamando a função CGContextShowText para desenhar o texto na posição do texto atual.
  4. Determine a posição texto final chamando a função CGContextGetTextPosition.
  5. Subtrair a posição a partir da posição final para determinar a largura do texto.

Aqui estão as minhas perguntas:

  1. Esta é realmente a melhor maneira de determinar a largura de uma string usando Core Graphics? Parece frágil e desde meu texto co-existe com elementos gráficos em 2D, eu gostaria de usar o mesmo contexto para toda a renderização. Eu estava esperando que haveria algum método compacto, como:

    CGContextGetTextWidthAndHeight(context, text);
    
  2. Eu li que Atsui está desatualizado e vai ser substituído pelo Núcleo de texto. Isso é verdade e se assim for, é no iOS?

Foi útil?

Solução

No iPhone SDK, há uma família de métodos de NSString que fornecem o que você quer.

A partir de iOS 7.0, estes métodos são :

- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:

Em versões mais antigas do iOS que tivemos estes, agora obsoleta:

– sizeWithFont:  
– sizeWithFont:forWidth:lineBreakMode:  
– sizeWithFont:constrainedToSize:  
– sizeWithFont:constrainedToSize:lineBreakMode:  
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

Outras dicas

Ao executar operações com base em outras que o segmento interface do usuário threads, você deve usar a técnica que você descreveu. Isto é especialmente importante a notar quando usar coisas como CATiledLayer, que realiza está prestando de forma assíncrona em threads em segundo plano, ou quando desenhar gráficos personalizados no fundo por qualquer outro motivo.

Eu concordo com PGB quando você está fazendo "simples" de gráficos e você está garantido para ser executado no thread principal. No entanto, sizeWithFont está fazendo a mesma coisa que a técnica que você descreveu - é simplesmente fazê-lo para você, utilizando UIGraphicsGetCurrentContext ()

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top