我需要在 iphone 应用程序的 UILabel 中将一个单词居中。我有一串文本太长而无法放入标签中,因此我想让标签以特定单词为中心并截断末端。例如:这是一个例句。“大家好,我一直在试图将 UILabel 中长句中的一个词居中。” 我想集中在“卡住”这个词上,以便 UILabel 看起来像这样,“......我被困住了...... ”。我找到了一个指向具有相同问题的问题的链接,但我无法得到适合我的答案。我对这种编程非常陌生,因此非常感谢您提供任何进一步的帮助!提前致谢。这是另一个问题的链接:iOS:在 UILabel 内的句子中居中单词的算法
问问题
340 次
2 回答
3
我只是编码并运行了它(但没有测试任何边缘情况)。这个想法是围绕单词创建一个 NSRange 居中,然后在每个方向上对称地扩大该范围,同时测试截断字符串的像素宽度与标签的宽度。
- (void)centerTextInLabel:(UILabel *)label aroundWord:(NSString *)word inString:(NSString *)string {
// do nothing if the word isn't in the string
//
NSRange truncatedRange = [string rangeOfString:word];
if (truncatedRange.location == NSNotFound) {
return;
}
NSString *truncatedString = [string substringWithRange:truncatedRange];
// grow the size of the truncated range symmetrically around the word
// stop when the truncated string length (plus ellipses ... on either end) is wider than the label
// or stop when we run off either edge of the string
//
CGSize size = [truncatedString sizeWithFont:label.font];
CGSize ellipsesSize = [@"......" sizeWithFont:label.font]; // three dots on each side
CGFloat maxWidth = label.bounds.size.width - ellipsesSize.width;
while (truncatedRange.location != 0 &&
truncatedRange.location + truncatedRange.length + 1 < string.length &&
size.width < maxWidth) {
truncatedRange.location -= 1;
truncatedRange.length += 2; // move the length by 2 because we backed up the loc
truncatedString = [string substringWithRange:truncatedRange];
size = [truncatedString sizeWithFont:label.font];
}
NSString *ellipticalString = [NSString stringWithFormat:@"...%@...", truncatedString];
label.textAlignment = UITextAlignmentCenter; // this can go someplace else
label.text = ellipticalString;
}
并这样称呼它:
[self centerTextInLabel:self.label aroundWord:@"good" inString:@"Now is the time for all good men to come to the aid of their country"];
如果你认为它是一个守门员,你可以把它改成 UILabel 上的一个分类方法。
于 2012-04-26T04:25:48.870 回答
0
建议:使用两个标签,一个左对齐,一个右对齐。两者都应在“外部”(可见)标签边框的外侧截断,并并排放置。分配你的句子,你的中心词构成两者之间的过渡。
这样,你不会得到一个完美的居中(它会随着你的中心词的长度而变化),但它会接近它。
于 2012-04-26T03:56:15.807 回答