iOS: Come si misura la larghezza e l'altezza di una stringa utilizzando al quarzo?
-
06-09-2019 - |
Domanda
Prima di chiedere le mie domande, questo è da Apple documentazione Re: Come determinare la larghezza di una stringa utilizzando Quarzo:
Se le misure di testo sono importanti per la vostra applicazione, è possibile per calcolare utilizzando le funzioni di Quartz 2D. Tuttavia, si potrebbe prima considerare l'utilizzo di ATSUI, la cui forza è nel layout del testo e misurazione. ATSUI ha diverse funzioni che ottengono metriche del testo. Non solo è possibile ottenere metriche testo dopo layout, ma in rari casi avete bisogno di loro, è possibile ottenere prima-layout di metriche del testo. a differenza di Quarzo, per il quale è necessario eseguire i calcoli da soli, ATSUI calcola le misure per voi. Ad esempio, è possibile ottenere il immagine rettangolo di delimitazione per il testo chiamando la funzione ATSUI ATSUMeasureTextImage.
Se si decide che il testo quarzo adatta alle vostre esigenze meglio di ATSUI (o Cacao), è possibile seguire questa procedura per misurare la larghezza del testo prima Quarzo disegna:
- Chiamare la funzione CGContextGetTextPosition per ottenere la posizione di testo corrente.
- Imposta la modalità di disegno di testo per kCGTextInvisible utilizzando la funzione CGContextSetTextDrawingMode.
- Disegna il testo chiamando la funzione CGContextShowText per disegnare il testo nella posizione attuale testo.
- Determinare la posizione del testo finale chiamando la funzione CGContextGetTextPosition.
- Sottrarre la posizione iniziale dalla posizione finale per determinare la larghezza del testo.
Ecco le mie domande:
-
E '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, vorrei utilizzare lo stesso contesto per tutto il rendering. Speravo ci sarebbe qualche metodo compatto, come:
CGContextGetTextWidthAndHeight(context, text);
-
Ho letto che ATSUI è obsoleto e sta per essere sostituita da Core Text. È vero, e se è così, è in iOS?
Soluzione
Su iPhone SDK, c'è una famiglia di metodi su NSString
che forniscono ciò che si desidera.
A partire da iOS 7.0, questi metodi sono :
- boundingRectWithSize:options:attributes:context:
- sizeWithAttributes:
Nelle versioni precedenti di iOS che abbiamo avuto questi, ormai deprecato:
– sizeWithFont:
– sizeWithFont:forWidth:lineBreakMode:
– sizeWithFont:constrainedToSize:
– sizeWithFont:constrainedToSize:lineBreakMode:
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
Altri suggerimenti
Quando si eseguono operazioni attingendo thread diversi thread UI, è necessario utilizzare la tecnica che descritto. Questo è particolarmente importante notare quando si utilizzano le cose come CATiledLayer, che svolge è il rendering in modo asincrono su sfondo discussioni, o quando si disegna grafici su ordinazione in background per qualsiasi altro motivo.
Sono d'accordo con PGB quando si sta facendo la grafica "semplici" e si sono garantiti per essere in esecuzione sul thread principale. Tuttavia, sizeWithFont sta facendo la stessa cosa, come la tecnica hai descritto - è semplicemente facendo per voi utilizzando UIGraphicsGetCurrentContext ()
.