我试图找出一种方法来理解 UILabel 实例将在哪个范围内截断文本。我知道如何使用-sizeWithFont:constrainedToSize:lineBreakMode:
.
假设我们有一个大约 5 行的 UILabel 和一个长文本,使用上面的方法我能够知道它是否适合。如果它不适合我想添加另一个 UILabel 和剩余的文本。我这样做是因为视图布局与图像混合在一起,当图像完成时,我希望在视图的整个宽度上都有一个文本。
我知道使用核心文本我可以在一个视图中做到这一点,但我更喜欢使用 UILabel 轻松。
* /##/ *文字* /
/ *图片* /##/ *文字* /
/ *图片* /##/ *文字* /
/ *图片* /##/ *文字* /
/ * ** * *文字* ** * ** * ** * ***//
_** * ***文字* ** * ** * ** * ***//
_** * ***文字* ** * ** * ** * **** /
问问题
2216 次
1 回答
2
好吧,我找到了一个解决方案,答案是重复的从 UILabel 中获取截断的文本
我从该答案中复制了修改后的方法,您需要导入 CoreText 框架并确保标签设置为自动换行:
- (NSArray *)truncate:(NSString *)text forLabel: (UILabel*) label
{
NSMutableArray *textChunks = [[NSMutableArray alloc] init];
NSString *chunk = [[NSString alloc] init];
NSMutableAttributedString *attrString = nil;
UIFont *uiFont = label.font;
CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)uiFont.fontName, uiFont.pointSize, NULL);
NSDictionary *attr = [NSDictionary dictionaryWithObject:(__bridge id)ctFont forKey:(id)kCTFontAttributeName];
attrString = [[NSMutableAttributedString alloc] initWithString:text attributes:attr];
CTFramesetterRef frameSetter;
CFRange fitRange;
while (attrString.length>0) {
frameSetter = CTFramesetterCreateWithAttributedString ((__bridge CFAttributedStringRef) attrString);
CTFramesetterSuggestFrameSizeWithConstraints(frameSetter, CFRangeMake(0,0), NULL, CGSizeMake(label.bounds.size.width, label.bounds.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;
}
于 2013-07-02T07:17:25.630 回答