我正在创建一个类似于notes.app的UITextView,其中textView的第一行用作标题。我需要创建一个只包含第一行文本的新字符串。到目前为止,我已经想出了这个:
NSRange startRange = NSMakeRange(0, 1);
NSRange titleRange = [noteTextView.text lineRangeForRange:startRange];
NSString *titleString = [noteTextView.text substringToIndex:titleRange.length];
NSLog(@"The title is: %@", titleString);
唯一的问题是它依赖于用户按Return键。我也尝试使用循环来查找第一行中的字符数:
CGSize lineSize = [noteTextView.text sizeWithFont:noteTextView.font
constrainedToSize:noteTextView.frame.size
lineBreakMode:UILineBreakModeWordWrap];
int textLength =1;
while ((lineSize.width < noteTextView.frame.size.width) &&
([[noteTextView.text substringToIndex:textLength] length] < [noteTextView.text length]))
{
lineSize = [[noteTextView.text substringToIndex:textLength] sizeWithFont:noteTextView.font
constrainedToSize:noteTextView.frame.size
lineBreakMode:UILineBreakModeWordWrap];
textLength = textLength+1;
}
NSLog(@"Length is %i", textLength);
但我在某个地方出错了 - 它会返回总字符数,而不是第一行的数字。
有没有人知道更简单/更好的方法呢?
答案 0 :(得分:2)
CoreText可能有一个更好的方法,但我会把它扔到那里只是因为它让我想起了我的头脑。
您可以在
时逐个添加字符到NSMutableString *标题[title sizeWithFont:noteTextView.font].width < noteTextView.frame.size.width
然后删除最后一个,显然在此过程中进行必要的边界检查并在必要时删除最后添加的字符。
但sizeWithFont是sloooooow。因此,如果您经常这样做,您可能需要考虑另一个“标题”的定义 - 例如,在20个字符之后的第一个单词中断。
但同样,CoreText可能会产生更多可能性。
答案 1 :(得分:1)
我不明白你上面的代码。在字符串中找到文本的第一个行不是更简单,例如直到CR或LF终止第一行? 如果没有CR或LF,那么你可以获取整个文本,因为你只有一行。
当然,如果行更长并且被包装,这将不会给你第一行中可见的内容,但我认为使用lineRangeForRange也不会这样做,或者它是否会这样做?
如果您唯一担心的是“用户必须按Enter”才能使其正常工作,那么为什么不在测试第一行长度之前简单地在文本中添加换行符?