计算UITextView中的行数,按帧大小包装行
我想知道什么时候一个文本被包装的文本框架的视图是否有任何分隔符,我们可以识别文本是否被包装或不。
例如,如果我的文本视图的宽度为50像素,并且文本超过了该值,则会将文本包装到下一行。
我想计算我的文本视图中的行数。 现在“\ n”和“\ r”不帮助我。
我的代码是:
NSCharacterSet *aCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"\n\r"]; NSArray *myArray = [textViewText componentsSeparatedByCharactersInSet:aCharacterSet]; NSLog(@"%d",[myArray count]);
这种变化考虑了如何包装你的线条和UITextView
的最大尺寸,并可能输出更精确的高度。 例如,如果文本不适合,它将截断为可见的大小,如果您包装整个单词(这是默认的),它可能会导致更多的行,如果你不这样做。
UIFont *font = [UIFont boldSystemFontOfSize:11.0]; CGSize size = [string sizeWithFont:font constrainedToSize:myUITextView.frame.size lineBreakMode:UILineBreakModeWordWrap]; // default mode float numberOfLines = size.height / font.lineHeight;
您需要使用lineHeight
属性和字体lineHeight
:
int numLines = txtview.contentSize.height / txtview.font.lineHeight;
我得到正确的线数,希望它也帮助你。
Swift 3:
let layoutManager:NSLayoutManager = textView.layoutManager let numberOfGlyphs = layoutManager.numberOfGlyphs var numberOfLines = 0 var index = 0 var lineRange:NSRange = NSRange() while (index < numberOfGlyphs) { layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange) index = NSMaxRange(lineRange); numberOfLines = numberOfLines + 1 } print(numberOfLines)
我在Apple的“ 文本布局编程指南”中发现了这个问题的完美解决scheme。 这是苹果公司提供的解决scheme:
NSLayoutManager *layoutManager = [textView layoutManager]; unsigned numberOfLines, index; unsigned numberOfGlyphs = [layoutManager numberOfGlyphs]; NSRange lineRange; for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){ (void) [layoutManager lineFragmentRectForGlyphAtIndex:index effectiveRange:&lineRange]; index = NSMaxRange(lineRange); }
这可以很容易地写入到UITextView的扩展中,或者作为一个独立的方法将UITextView对象作为参数
你需要考虑textView.textContainerInset,也需要四舍五入的计算值,因为行号肯定是一个整数
float rawLineNumber = (textView.contentSize.height - textView.textContainerInset.top - textView.textContainerInset.bottom) / textView.font.lineHeight; int finalLineNumber = round(rawLineNumber)
在实际情况下,您可能会看到以下结果rawLineNumber = 3.008099 finalLineNumber = 3(3行)
使用这个(其中_text_v是你的文本视图):
-(NSInteger) linesCount { return _text_v.contentSize.height/_text_v.font.lineHeight; }
快速扩展:
用@himanshu padia回答
//MARK: - UITextView extension UITextView{ func numberOfLines() -> Int{ if let fontUnwrapped = self.font{ return Int(self.contentSize.height / fontUnwrapped.lineHeight) } return 0 } }
用法: yourTextView.numberOfLines()
请注意,如果由于某种原因文本视图的字体为零,则返回值将为零。