2009-05-27 10 views
19

Prima di chiedere le mie domande, questo è da Apple documentazione Re: Come determinare la larghezza di una stringa utilizzando Quarzo:iPhone SDK: come si misura la larghezza e l'altezza di una stringa utilizzando Quartz?

Se le misure di testo sono importanti per la vostra applicazione, è possibile calcolare utilizzando quarzo Funzioni 2D. Tuttavia, è possibile utilizzare prima il utilizzando ATSUI, il cui punto di forza è nel layout del testo e nella misurazione . ATSUI ha diverse funzioni che ottengono le metriche del testo. Non solo è possibile ottenere le metriche del testo post-layout, ma nei rari casi in cui sono necessari i codici , è possibile ottenere le metriche del testo prima del layout. A differenza del quarzo , per il quale è necessario eseguire personalmente i calcoli, ATSUI calcola le misure per te. Ad esempio, è possibile ottenere il rettangolo di delimitazione dell'immagine per il testo chiamando la funzione ATSUI ATSUMeasureTextImage.

Se si decide che il testo quarzo si adatta alle vostre esigenze meglio di ATSUI (o cacao), è possibile seguire questa procedura per misurare la larghezza del testo prima Quarzo lo attira:

  1. Chiamare la funzione CGContextGetTextPosition a ottenere la posizione attuale del testo.
  2. Imposta la modalità di disegno del testo su kCGTextInvisible utilizzando la funzione CGContextSetTextDrawingMode.
  3. Disegna il testo chiamando la funzione CGContextShowText per disegnare il testo nella posizione corrente del testo.
  4. Determina la posizione finale del testo chiamando la funzione CGContextGetTextPosition.
  5. Sottrarre la posizione iniziale dalla posizione finale per determinare la larghezza del testo.

Ecco le mie domande:

  1. è davvero questo il modo migliore per determinare la larghezza di una stringa utilizzando core grafico? Sembra fragile e dal momento che il mio testo coesiste con elementi grafici 2D, mi piacerebbe utilizzare lo stesso contesto per tutto il rendering. Speravo che ci fosse qualche metodo compatto, come:

    CGContextGetTextWidthAndHeight (context, text);

  2. Ho letto che ATSUI è obsoleto e sarà sostituito da Core Text. È vero e se è così, è nell'SDK di iPhone?

+0

Il testo principale è ora disponibile in iOS 4. Tuttavia, i metodi a cui ha risposto pgb sono molto semplici. – Eonil

risposta

22

Su iPhone SDK, c'è una famiglia di metodi su NSString che forniscono ciò che si desidera.

Come di iOS 7.0, these methods are:

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

su versioni precedenti di iOS che abbiamo avuto questi, ormai deprecato:

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

Non mi rendevo conto che potevi combinare le chiamate della Core Graphics con gli oggetti Objective-C ... CG ha una sua funzione di disegno del testo basata su array di caratteri cost, ma campane e fischietti limitati. Sembra che "contesto corrente" significhi semplicemente l'ultimo contesto istanziato, ad esempio: \t CGContextSetFillColorWithColor (context, color.CGColor); \t [testo drawAtPoint: origin withFont: font]; Grazie per l'ottimo consiglio! –

+1

In realtà, sono abbastanza sicuro che per il contesto corrente intendano il contesto restituito da UIGraphicsGetCurrentContext() –

+0

È possibile _non_ mixare e abbinare in circostanze specifiche, in particolare; tutto ciò che chiama UI___ (come UIGraphicsGetCurrentContext()) da qualsiasi thread diverso dal thread principale avrà spesso esito negativo. Questo è un problema serio, specialmente quando si usano cose come CATiledLayer - che esegue il rendering in modo asincrono su thread in background. – Steve

0

Quando si eseguono operazioni di disegno su thread diversi thread UI, è deve usare la tecnica che hai descrittoQuesto è particolarmente importante quando si usano cose come CATiledLayer, che esegue il rendering in modo asincrono su thread in background o quando si disegnano grafica personalizzata in background per qualsiasi altro motivo.

Sono d'accordo con PGB quando si sta facendo grafica "semplice" e si è certi che sia in esecuzione sul thread principale. Tuttavia, sizeWithFont sta facendo la stessa cosa della tecnica che hai descritto, semplicemente lo sta facendo per te usando UIGraphicsGetCurrentContext().

Problemi correlati