2010-03-31 14 views
5

Sto caricando del testo di aiuto da un plist e visualizzando lo stesso nel formato di UILabels ospitato in un UIScrollView. Parte del codice segue:Interruzioni di riga non funzionanti in UILabel

UILabel *sectionDetailLabel = [[[UILabel alloc] initWithFrame:CGRectMake(34, myOriginForThisSection, 286, 20)] autorelease]; 
    sectionDetailLabel.backgroundColor = [UIColor clearColor]; 
    sectionDetailLabel.numberOfLines = 0; 
    sectionDetailLabel.font = [UIFont systemFontOfSize:12]; 
    sectionDetailLabel.textColor = [UIColor blackColor]; 
    sectionDetailLabel.textAlignment = UITextAlignmentLeft; 
    sectionDetailLabel.lineBreakMode = UILineBreakModeWordWrap; 

    [baseScrollView addSubview:sectionDetailLabel]; 

    [sectionDetailLabel setText:myStringForThisSection]; 
    [sectionDetailLabel sizeToFit]; 

Mentre qualsiasi testo 'lunga' è sempre avvolto correttamente in più righe, io sono in grado di inserire manualmente le interruzioni di linea con a capo '\ n' caratteri 'myStringForThisSection '. Vedo invece i caratteri '\' e 'n' stampati nella UILabel ovunque io volessi l'interruzione di riga, invece.

Ho esaminato questo aspetto e il consenso generale sembrava essere l'impostazione numeroOfLines a 0, impostando la rigaBreakMode su un valore valido e invocando sizeToFit (o impostando il frame di UILabel basato su sizeWithFont :) dovrebbe fare. Tutto ciò che mi sembra di fare nel codice qui sopra - e funziona perfettamente quando si adattano lunghe stringhe di lunghezza sconosciuta in più righe su UILabel. Quindi cosa potrebbe mancare qui?

Nota: tutte le variabili utilizzate - baseScrollView, myStringForThisSection e myOriginForThisSection - sono state caricate prima dell'inizio dell'esecuzione del codice precedente e funzionano correttamente.

+0

Se la stringa proviene da una fonte esterna, questo accadrà. Se è dichiarato/creato nel codice (forse anche in un plist), la nuova riga sarà codificata come tale. Una linea di principio deve essere seguita dallo spazio, se quella linea è una linea vuota, però. –

risposta

8

UILabel non interpreta la sequenza di escape \ n. È possibile inserire il carattere reale che rappresenta il ritorno a capo e/o l'avanzamento riga. Crea un carattere per contenere la nuova riga e quindi inserirla.

unichar newLine = '\n'; 
NSString *singleCR = [NSString stringWithCharacters:&newLine length:1]; 
[myStringForThisSection insertString:singleCR atIndex:somePlaceIWantACR]; 

Finché il myStringForThisSection è mutevole, che dovrebbe farlo.

+0

Ha funzionato! Molte grazie. –

+0

Il ritorno a capo con caratteri di escape, ad esempio "\ r", funziona anche. Almeno in Swift 3, su iOS 10+ – Chris

3

Ho avuto problemi con la risposta di Scot Gustafson sopra in XCode 4.3

Prova a modificare:

unichar chr[1] = {'\n'}; 
NSString *cR = [NSString stringWithCharacters:(const unichar *)chr length:1]; 

Poi utilizzare nel codice qualcosa di simile:

self.myLabel.text = [NSString stringWithFormat:@"First Label Line%@Second Label Line", cR]; 
+0

È ... è passato molto tempo. Riesco a vedere il merito di non utilizzare un'istruzione di tipo "insertAtIndex", che potrebbe sempre essere pericolosa, e specialmente quando si tratta di dati in diverse lingue. Se qualcun altro lo trova particolarmente utile, o trova anche il codice precedente obsoleto, potrei "promuovere" questa risposta o votarla. –

+0

Dev in entrambi i casi funziona, il modo in cui lo faccio ha più senso per menti semplici come le mie! Ho avuto problemi con la tua definizione di singleCR - Ho ricevuto un errore in IOS5 xCode 4.3.1 – DoctorG

+0

Hehe sure. Controllerò entrambe le soluzioni una volta che avrò tempo e postback. –

1

non potevo get Scott & La soluzione di DoctorG per funzionare (anche se non ho passato troppo tempo a provarci), ma ecco la soluzione semplice che funziona per me quando sto estraendo testo con caratteri di escape da un file xml.

Dentro la mia stringa di classe funzione, definisco:

+(NSString)escapeXml:(NSString*)string { 
    return [string stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]; 
} 
Problemi correlati