2010-03-31 5 views
5

Je charge du texte d'aide à partir d'une plist et l'affiche sous forme de UILabels dans un UIScrollView. Partie du code suit:Les sauts de ligne ne fonctionnent pas dans 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]; 

Alors que tout caractère « long » texte s'enveloppé dans plusieurs lignes correctement, je ne parviens pas à insérer manuellement les sauts de ligne à l'aide de saut de ligne « \ n » dans « myStringForThisSection '. Je ne vois que les caractères '\' et 'n' imprimés dans l'UILabel à la place où je voulais faire le saut de ligne. J'ai regardé ceci et le consensus général a semblé être que le paramètre numberOfLines à 0, en définissant lineBreakMode à une valeur valide et en invoquant sizeToFit (ou en définissant le cadre de l'UILabel basé sur sizeWithFont :) devrait faire. Tout ce que je semble faire dans le code ci-dessus - et fonctionne parfaitement lors de l'insertion de longues chaînes de longueur inconnue dans plusieurs lignes sur le UILabel. Alors qu'est-ce qui pourrait manquer ici?

Remarque: Toutes les variables utilisées - baseScrollView, myStringForThisSection et myOriginForThisSection - ont été chargées avant l'exécution du code ci-dessus et fonctionnent correctement.

+0

Si la chaîne provient d'une source externe, cela se produira. Si elle est déclarée/créée dans le code (peut-être même éventuellement dans un plist), le retour à la ligne sera codé comme tel. Une nouvelle ligne doit être suivie d'espace, si cette ligne est une ligne vide, cependant. –

Répondre

8

UILabel n'interprète pas la séquence d'échappement \ n. Vous pouvez insérer le caractère réel qui représente le retour chariot et/ou le saut de ligne. Faites un caractère pour tenir votre nouvelle ligne, puis insérez-le.

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

Tant que votre myStringForThisSection est muable, qui devrait le faire.

+0

Cela a fonctionné! Merci beaucoup. –

+0

Le retour de chariot échappé, c'est-à-dire '\ r', fonctionne également. Au moins dans Swift 3, sur iOS 10+ – Chris

3

J'ai eu des problèmes avec la réponse de Scot Gustafson ci-dessus dans XCode 4.3

Essayez ceci:

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

Utilisez ensuite dans quelque chose de votre code comme ceci:

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

Ça fait ... longtemps. Je peux voir les avantages de ne pas utiliser une instruction de type "insertAtIndex", ce qui pourrait toujours être dangereux, et particulièrement lorsque vous traitez des données dans plusieurs langues différentes. Si quelqu'un d'autre trouve cela particulièrement utile, ou trouve le code précédent aussi obsolète, je pourrais «promouvoir» cette réponse ou voter pour elle. –

+0

Dev fonctionne de toute façon, la façon dont je le fais juste plus de sens pour les esprits simples comme le mien! J'ai eu des problèmes avec votre définition de singleCR - J'ai une erreur dans IOS5 xCode 4.3.1 – DoctorG

+0

Hehe sure. Je vais vérifier les deux solutions une fois que j'ai le temps, et de poster. –

1

Je ne pouvais pas get Scott & La solution DoctorG fonctionne (même si je n'ai pas passé trop de temps à essayer), mais voici la solution simple qui fonctionne pour moi quand j'extrempe du texte échappé à partir d'un fichier xml.

Dans ma classe de fonction de chaîne, je définis:

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