2013-03-10 10 views
6

Riguarda la formattazione del PDF utilizzando la grafica principale. Ma potrebbe riguardare qualsiasi tipo di paging quando si tratta di stampare una stringa su due pagine.Come determinare quale parte di un nsstring si inserisce in un rect?

Ho bisogno di spalmare una stringa su più pagine. Per stringhe più piccole questo non è un problema reale. Per quelli che uso le estensioni NIKTRing UIKit sizeWithFont per determinare se il testo completo si adatta alla pagina corrente oppure no. Se lo fa, allora lo stampo con drawInRect e se non lo fa, lo sposto nella pagina successiva.

Funziona bene ma non è adatto per stringhe più lunghe. Nella mia app le singole stringhe (fornite dall'utente) potrebbero anche essere più lunghe di una pagina intera.

Quando è presente una pagina intera o uno spazio rimanente di una pagina, come faccio a determinare esattamente quale parte della NSString può essere visualizzata in quel dato rect in modo che possa tagliarla e stampare la stringa rimanente (o almeno una parte di esso) nella pagina successiva?

Ho pensato a un'alternativa. Si tratta di disegnare il testo completo in un contesto grafico fuori campo e quindi tagliare l'immagine creata in sezioni che si adattano allo spazio libero sulle pagine. Ma se lo faccio, ho bisogno di posizionare la linea di taglio esattamente tra le linee di testo. E francamente non sono sicuro di come capire dove il testo contenente la grafica può essere tagliato in modo sicuro in due (o più) parti senza tagliare una riga di testo nel mezzo.

Spero di essermi espresso comprensibile e che qualcuno venga in soccorso.

+1

+1, infine qualcuno chiaramente articolato questo enigma confondente. – CodaFi

+0

Dubito che tu voglia veramente farlo usando la tua alternativa ... Se si trattava di immagini bitmap, Ok, ma sicuramente non vuoi che il tuo testo sia incluso nel tuo PDF come bitmap ... – mkl

+0

@mkl, hai ragione. Questo è il motivo per cui lo sto chiedendo. Tuttavia, alla fine ho bisogno di un pdf che stampa perfettamente impaginato su carta. Qualche idea? –

risposta

2

Core Text, c'è a very relevant function, il cui ultimo argomento (un puntatore ad una CFRange) è definito come segue:

fitRange
Al ritorno, contiene la gamma della stringa che in realtà adattarsi alla dimensione vincolata.
+0

Scuse per la risposta tardiva. Ho dovuto mettere da parte questo progetto subito dopo aver posto questa domanda a causa delle priorità. Ora che continuo a lavorare su di esso ho scoperto che il tuo suggerimento, o quello collegato, funziona perfettamente bene. Grazie per il suggerimento. –

+0

Ciao, sono anch'io di fronte allo stesso problema. Ma sto creando il file PDF usando i metodi UIKit e usando preferito Salve nella mia applicazione Devo generare file PDF ottenendo dati da una matrice. La generazione di PDF viene eseguita correttamente usando i metodi UIKit come drawrect e usando UIGraphicsBeginPDFContextToFile (thefilePath, CGRectZero, nil); UIGraphicsBeginPDFPageWithInfo (CGRectMake (0, 0, pageSize.width, pageSize.height), .Qui non sono in grado di decidere la lunghezza della stringa che può rientrare in alcuna riga e la stringa rimanente in un'altra riga nella pagina successiva.Si può spiegare come hai usato la gamma adatta – Naresh

+0

@Naresh: Penso che dovresti fare una nuova domanda che spiega cosa stai facendo e il problema che stai avendo in modo più dettagliato. –

0

Come si usa un'approssimazione?

- (NSInteger)lengthOfString:(NSString *)str 
      thatFitsIntoView:(UIView *)displayView 
        withFont:(UIFont *)font 
{ 
    CGSize textSize = [str sizeWithFont:font 
           forWidth:displayView.frame.size.width 
          lineBreakMode:NSLineBreakByWordWrapping]; 

    NSInteger lengthThatFits; 
    if (textSize.height > displayView.frame.size.height) { 
     lengthThatFits = str.length * displayView.frame.size.height/textSize.height; 
    } else { 
     lengthThatFits = str.length; 
    } 

    return lengthThatFits; 
} 

Chiamatela come:

NSString *str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eros" 
    "nulla, commodo eget fringilla nec, varius nec ligula. Donec pulvinar eros sed diam" 
    "euismod scelerisque. Mauris imperdiet leo at elit vulputate ullamcorper. Nullam" 
    "condimentum odio a lacus tempus ac pretium justo tincidunt."; 

UIFont *font = [UIFont systemFontOfSize:16.0]; // or whatever 
UIView *displayView = // the view in which you intend to present the string 

NSInteger length = [self lengthOfString:str thatFitsIntoView:displayView usingFont:font]; 
NSString *displayedString = [str substringToIndex:length]; 
+0

Sì, se non trovo nulla di meglio allora dovrei andare per un'approssimazione. Un'approssimazione dovrebbe prendere in considerazione il tracciamento di linee/parole. Potrei quindi persino "liberare le frasi". Significa che avrei tagliato la corda solo dopo i punti fermi ".", Punto e virgola ecc.E poi prova la parte della stringa se si adatta veramente al rect. Ma ciò dipenderebbe dall'apporto di input da parte dell'utente. Il tuo suggerimento fallirebbe se l'utente inserisse un numero significativo di cr/lf. Ho bisogno di qualcosa di più preciso. Alcuni 'numberOfCharsOfString: fitIntoRect: withFont: lineBreakMode:' o così. –

+0

@HermannKlecker Questo fa esattamente questo. Restituisce il numero di caratteri che si adattano. È possibile mettere a punto il risultato avviando un'iterazione da 'lengthThatFits' verso 0 e verificare se la sottostringa si adatta a tale indice. –

+0

Apprezzo la tua assistenza. Ma dubito che faccia esattamente il cappello. Prima determina l'altezza del blocco di testo nel modo consueto. Quindi controlla se il blocco di testo si adatta alla pagina. Bene finora. Ma poi prende solo la relazione dell'altezza del testo completo alla dimensione dello spazio libero sulla pagina e moltiplica quella relazione con il numero di caratteri e restituisce quel risultato. (cont ...) –

2

Per il caso generale in cui non si utilizza Nucleo di testo, si può solo continuare ad aggiungere caratteri alla stringa fino alla sua dimensione è troppo grande. Questo può essere abbastanza veloce, e se hai stringhe davvero enormi (come sembri), puoi accelerarlo con una semplice ricerca binaria.

Se si utilizza Core Text, è sufficiente creare un CTFrame per l'area che si desidera riempire e quindi chiedere per l'intervallo utilizzato con .

+0

Rob e Peter, darò certamente un'occhiata al testo principale. Grazie. –