Iphone 从UILabel获取截断的文本
我是否可以为UILabel获取文本的截断版本 简言之,我有一段文字和两个Iphone 从UILabel获取截断的文本,iphone,objective-c,uilabel,Iphone,Objective C,Uilabel,我是否可以为UILabel获取文本的截断版本 简言之,我有一段文字和两个UILabels——标签a,两行长,标签B,高度可变。标签A位于标签B的上方。其思想是标签A显示文本段落的前两行,在某个用户操作时,标签B可见并显示文本的其余部分 我很难确定标签B中应该包含什么,因为我不知道标签A中显示了什么。我还需要从标签A中删除“…” 注意:我意识到这有点复杂,但有一些很好的理由,我不会把问题弄得一团糟。对于标签a,针对您正在使用的特定字体,计算适合两行的近似字符 对于标签B,设置整个文本必须适合的可变
UILabels
——标签a,两行长,标签B,高度可变。标签A位于标签B的上方。其思想是标签A显示文本段落的前两行,在某个用户操作时,标签B可见并显示文本的其余部分
我很难确定标签B中应该包含什么,因为我不知道标签A中显示了什么。我还需要从标签A中删除“…”
注意:我意识到这有点复杂,但有一些很好的理由,我不会把问题弄得一团糟。对于标签a,针对您正在使用的特定字体,计算适合两行的近似字符
对于标签B,设置整个文本必须适合的可变高度。我想知道您是否可以使用中的方法来计算标签A适合的程度 一种粗略的方法可能是从文本的第一个字符开始,测试它将占用的大小(
-sizeWithFont:forWidth:lineBreakMode:
也许?),然后继续一次添加一个字符,直到它不再适合标签A
我希望其他人能想出一个更好的方法来做到这一点,但上述方法应该是可行的
更新
昨晚我看了一下我自己的应用程序的核心文本,发现了。通过查看该函数中的fitRange
,您可以使用该函数计算出字符串中有多少适合标签
更新2:
我认为这应该行得通,但我刚刚在这里输入了这个,所以它甚至可能无法编译:
UIFont *uiFont = [UIFont systemFontOfZise:13.0f]; // whichever font you're using
CTFontRef ctFont = CTFontCreateWithName((CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
NSDictionary *attr = [NSDictionary dictionaryWithObject:(id)ctFont forKey:(id)kCTFontAttributeName];
CFRelease(ctfont);
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:yourLabelText attributes:attr];
CTFrameSetterRef frameSetter = CTFrameSetterCreateWithAttributedString((CFAttributedStringRef)attrString);
[attrString release];
CFRange fitRange;
CTFrameSetterSuggestFrameSizeWithConstrains(
frameSetter,
CFRangeMake(0, 0),
NULL,
CGSizeMake(labelWidth, labelHeight),
&fitRange);
CFRelease(frameSetter);
CFIndex numberOfCharactersThatFit = fitRange.length;
多亏了托马斯·穆勒
确保将myLabel的换行模式设置为:
myLabel.lineBreakMode = NSLineBreakByWordWrapping;
通过此方法,您可以获得实际适合受约束大小的分块字符串。
下面是代码:
- (NSArray *)truncate:(NSString *)text
{
NSMutableArray *textChunks = [[NSMutableArray alloc] init];
NSString *chunk = [[NSString alloc] init];
CTFramesetterRef frameSetter;
UIFont *uiFont = [UIFont systemFontOfSize:17.0f];
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
NSDictionary *attr = [NSDictionary dictionaryWithObject:(__bridge id)ctFont forKey:(id)kCTFontAttributeName];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:text attributes:attr];
CFRange fitRange;
while (attrString.length>0) {
frameSetter = CTFramesetterCreateWithAttributedString ((__bridge CFAttributedStringRef) attrString);
CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(myLabel.frame.size.width, myLabel.frame.size.height), &fitRange);
CFRelease(frameSetter);
chunk = [[attrString attributedSubstringFromRange:NSMakeRange(0, fitRange.length)] string];
[textChunks addObject:chunk];
[attrString setAttributedString: [attrString attributedSubstringFromRange:NSMakeRange(fitRange.length, attrString.string.length-fitRange.length)]];
}
return textChunks;
}
不,这不是回答问题。当您将一段较长的文本指定给超出其显示矩形的UILabel时,该文本将被截断。我想知道它被截断成什么。你的文本是什么?你想如何显示它?给我们举个例子。不幸的是,原油期权可能是唯一的选择。我希望有一个更好的解决方案,但这至少是一个解决方案。如果没有更好的答案,我会把这个问题留一段时间,而不是接受你的答案。谢谢。这对我来说非常有用(更新2),尽管我必须用kCTFontUIOptimizedTrait位重新创建CTFont,以便使宽度与-sizeWithFont:returns匹配。即使如此,在大约30个字符之后,它开始漂移超过1个像素。不知何故,UIFont和CTFont之间在连字的紧排、呈现或其他方面存在差异。太棒了!!我甚至在interface builder上进行了测试。它的字符数确实足够接近它的外观。如果文本有换行符,它将返回错误的值\n。