换行符在 UILabel 中不起作用
Posted
技术标签:
【中文标题】换行符在 UILabel 中不起作用【英文标题】:Line breaks not working in UILabel 【发布时间】:2010-03-31 18:48:38 【问题描述】:我正在从 plist 加载一些帮助文本,并以 UIScrollView 中的 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];
虽然任何“长”文本都正确地换成了多行,但我无法在“myStringForThisSection”中使用换行符“\n”手动插入任何换行符。我只看到 UILabel 中我想要换行符的地方打印了字符 '\' 和 'n'。
我查了一下,普遍的共识似乎是设置 numberOfLines 为 0,将 lineBreakMode 设置为有效值并调用 sizeToFit(或基于 sizeWithFont 设置 UILabel 的框架:)应该可以。我似乎在上面的代码中所做的所有这些 - 并且在将未知长度的长字符串拟合到 UILabel 上的多行时完美地工作。那么这里可能缺少什么?
注意:所有使用的变量——baseScrollView、myStringForThisSection 和 myOriginForThisSection——都是在上述代码开始执行之前加载的,并且工作正常。
【问题讨论】:
如果字符串来自外部来源,就会发生这种情况。如果它在代码中声明/创建(甚至可能在 plist 中),则换行符将被编码。但是,如果该行是空行,则换行符必须后跟空格。 【参考方案1】:UILabel 不解释转义序列\n。您可以插入代表回车和/或换行的真实字符。制作一个字符来保存换行符,然后插入它。
unichar newLine = '\n';
NSString *singleCR = [NSString stringWithCharacters:&newLine length:1];
[myStringForThisSection insertString:singleCR atIndex:somePlaceIWantACR];
只要您的 myStringForThisSection 是可变的,就应该这样做。
【讨论】:
转义的回车,即 '\r',也可以。至少在 Swift 3 中,在 ios 10+ 上【参考方案2】:我在上面的 XCode 4.3 中对 Scot Gustafson 的回答有疑问
试试这个:
unichar chr[1] = '\n';
NSString *cR = [NSString stringWithCharacters:(const unichar *)chr length:1];
然后在您的代码中使用如下内容:
self.myLabel.text = [NSString stringWithFormat:@"First Label Line%@Second Label Line", cR];
【讨论】:
已经……很久了。不过,我可以看到不使用“insertAtIndex”类型指令的优点,这总是很危险,尤其是当您处理几种不同语言的数据时。如果其他人发现这特别有用,或者发现以前的代码也过时了,我可以“推广”这个答案或投票。 开发任何一种方式都有效,我这样做的方式对像我这样的简单头脑更有意义!我确实对你对 singleCR 的定义有疑问——我在 IOS5 xCode 4.3.1 中遇到错误 呵呵当然。有时间我会检查这两种解决方案,然后再发回。【参考方案3】:我无法让 Scott & DoctorG 的解决方案发挥作用(尽管我没有花太多时间尝试),但是当我从 xml 文件中提取转义文本时,这是一个适用于我的简单解决方案。
在我的字符串函数类中,我定义:
+(NSString)escapeXml:(NSString*)string
return [string stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];
【讨论】:
以上是关于换行符在 UILabel 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
autoHideDuration 在 Snackbar @material-ui 中不起作用