防止UILabel将字符包装成符号

5

我有一个多行标签,其中包含以下文本:

这里有很多文本 · $$$$

由于开头的文本是自由格式的,有时换行会看起来像这样:

Lots of text here · $$$
$

如何避免这种情况发生?我希望它看起来像这样:
Lots of text here ·
$$$$

我尝试了各种lineBreakMode,但效果不佳。自动换行无法解决问题,因为它不会将 $$$$ 视为一个单词。

3个回答

3
似乎您可以从UILabel子类中受益,这将基于NSLineBreakByWordWrapping换行模式以不同方式处理字符串,该模式将您的拼音单词视为单词。您有效地扩展了自定义linebreakmode用于考虑单词的定义。
您需要编写您自己的断行算法。确定断行位置的方法如下:
1. 循环遍历字符串,获取每个字符,直到满足以下两个条件中的一个:a) 达到了视图的宽度,或者b) 到达了一个空格,并且下一个单词(由空格分隔)无法放在同一行上。
2. 如果满足条件a,则有两种选择——可以采用永远不将单词拆分成多行的策略,也可以仅将非拆分规则应用于您的拼音单词。无论哪种方式,当给定行没有更多空间时,您都需要在拼音单词的开头插入换行符。
3. 您可能想要使用两个独立的字符串,来保持源字符串与包含您格式化的显示字符串的分离。
如果这对您有帮助,请告诉我!

我本希望有比子类化更简单的方法,但如果没有,那就这样吧。 - Suragch

2
这可能有点晚了,但至少可以帮助一些人。 我所做的方法如下:
UIFont *fontUsed = [UIFont systemFontOfSize:17];
NSDictionary *dictFont = [NSDictionary dictionaryWithObject:fontUsed forKey:NSFontAttributeName];

NSString *strTextToShow = @"text that has to be displayed but without $$$$";
CGRect rectForSimpleText = [strTextToShow boundingRectWithSize:CGSizeMake(154, 258) options:NSStringDrawingUsesLineFragmentOrigin attributes:dictFont context:nil];

NSString *strTextAdded = [NSString stringWithFormat:@"%@ $$$$", strTextToShow];
CGFloat oldHeight = rectForSimpleText.size.height;

CGRect rectForAppendedText = [strTextAdded boundingRectWithSize:CGSizeMake(154, 258) options:NSStringDrawingUsesLineFragmentOrigin attributes:dictFont context:nil];
CGFloat newHeight = rectForAppendedText.size.height;

if (oldHeight < newHeight) {
    strTextAdded = [strTextAdded stringByReplacingOccurrencesOfString:@"$$$$" withString:@"\n$$$$"];
}

[lblLongText setText:strTextAdded];

lblLongTextUILabelIBOutlet,而 CGSizeMake(154, 258) 则是我使用的 UILabel 的大小。如果您有其他发现,请告诉我。


1

尝试在输入文本中插入换行符。

这里有很多文本·\n $$$

它应该会在下一行打印出$$$。


2
那是一个糟糕的解决方案,也是最好的。 - zaph
2
我需要它正确地进行自动换行,而不是强制换行。 - Justin
我很不情愿地说,但我发现你的解决方案是最简单的。 - Ronak Khandelwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接