Come usare il sizewithfont di Nssstring e il drawinRect per allenare quanto stringa da disegnare

StackOverflow https://stackoverflow.com/questions/4965809

Domanda

Sto disegnando più "pagine" di immagini usando un CGContext in iOS. Ho usato ampiamente le combinazioni di sizewithfont e drawinRect nella mia app. Quello che devo fare è dividere un grosso pezzo di testo su più pagine. Posso dimenticarlo e capire se ha bisogno o meno di un'altra pagina, ma come faccio a sapere dove tagliarlo? Devo fare un brutto ciclo per controllare Word per parola fino a trovare una lunghezza della stringa che si adatta perfettamente alla pagina e quindi tagliare la stringa in quel punto? C'è un modo più intelligente?

Qualche idea?

Grazie.

È stato utile?

Soluzione

Il Aggiunte NSString Per Uikit per il disegno del testo, è possibile pre-determinare la quantità esatta di spazio richiesto per rendere un determinato testo per un determinato carattere. Se dividere il testo in pagine, è possibile utilizzare questo metodo.

– sizeWithFont:constrainedToSize:lineBreakMode:

Supponendo che la modalità di rottura del carattere e della linea sia nota, crea un cgsize con la stessa larghezza della tua pagina e usa un numero sufficiente per l'altezza. Questa sarebbe la dimensione massima in cui stiamo limitando il testo.

CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];

expectedSize Ci dirà la dimensione che il testo prenderà supponendo se potrebbe estendersi verticalmente infinitamente (ben vicino). Per trovare il numero di pagine richieste, basta dividere l'altezza totale per l'altezza di una pagina.

NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);

Vorresti anche regolare l'altezza di una pagina per assicurarti che l'ultima riga di testo non venga tagliata. Perché ciò accada, l'altezza della pagina dovrebbe essere un multiplo dell'altezza della linea del carattere. Dì che l'altezza della pagina iniziale è 300px, e la altezza del carattere è 16px, allora ci sarà un po 'di ritaglio come 300/16 = 18.75 che non è un numero intero.

NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;

Prendere il valore del pavimento 18 e moltiplicando con l'altezza della linea del carattere 16, otteniamo un'altezza di pagina ottimale di 288 Per garantire che non ci siano ritagli.

Si noti che LineHeight è stato introdotto in iOS 4.0, ma potresti calcolarlo se necessario per le versioni precedenti.

Altri suggerimenti

Il modo in cui mi aggiro questo problema è quello di dividere per linea.

NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];

Devi ancora fare tutto il lavoro per determinare le pause di pagina e allo stesso modo, ma finora ho trovato la soluzione migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top