无论如何我可以获得UILabel文本的截断版本吗?
简而言之,我有一段文字,两个UILabels
- 标签A,长2行,标签B,可变高度。标签A在标签B上方。想法是标签A显示文本段落的前两行,并且在某个用户操作时,标记B因为可见并显示文本的其余部分。
我无法确定标签B中的内容,因为我不知道标签A中显示的是什么。我还需要从标签A中删除“...”。
注意:我意识到这有点令人费解但是有一些很好的理由,我不会把这个问题弄得一团糟。
答案 0 :(得分:11)
我想知道你是否可以使用NSString UIKit Additions中的方法来确定标签A的适合程度。
粗略的方法可能是从文本的第一个字符开始并测试它会占用的大小(-sizeWithFont:forWidth:lineBreakMode:
可能?)然后继续添加一个字符,直到它不适合进入你的标签A。
我希望其他人可以提出更好的方法来做到这一点,但上述情况应该有效。
<强>更新强>
昨晚我看了一下我自己的应用程序的Core Text并遇到了CTFramesetterSuggestFrameSizeWithConstraints
。您可以通过查看该函数中的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;
答案 1 :(得分:3)
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;
}
答案 2 :(得分:-5)
对于标签A,对于您正在使用的特定字体,计算应完全适合两行的近似字符。
对于标签B,设置整个文本必须适合的变量高度。