【问题标题】:How to scroll to a certain point in UITextView?如何滚动到 UITextView 中的某个点?
【发布时间】:2014-04-26 16:02:46
【问题描述】:
我有大量文字,我什至无法手动滚动。所以,我需要滚动我的UITextView 到某个点。
我用下面的代码进行了测试,但是(y)的数量太大了。
self.txtView.contentOffset = CGPointMake(0, 100000);
那么,有没有办法滚动到UITextView 中的某个点?
【问题讨论】:
标签:
ios
uiscrollview
uitextview
【解决方案1】:
UITextView 是UIScrollView 类的子类。因此,您可以将其滚动到显示特定帧:
[textView scrollRectToVisible:CGRectMake(0, 100, 320, 20) animated:YES];
此外,您可以滚动到特定文本:
[textView scrollRangeToVisible:[textView.text rangeOfString:@"Lorem ipsum"]];
【解决方案2】:
UITextView 有一个方法:
setSelectedRange: (NSRange) range
如果你知道字符串中第 13 行出现的位置,比如位置 237,然后执行:
[textView setSelectedRange: NSMakeRange(237,0)];
如果您需要找出第 13 行出现的位置,您还有很多工作要做。我将从查看 sizeWithFont 开始,记住将 textView 的宽度缩小大约 16 个点,以便 iOS 得到正确的总和。 (也就是说,如果你有换行符,那么只需找到第 13 个(或第 n 个)“\n”的位置。)
更新:
根据您在评论中的进一步查询:
有很多方法可以找到第 n 个 \n 的位置。下面的 sn-p 不是很漂亮,但它会完成这项工作。您还可以使用 rangeOfString 并遍历“\n”。在这个 sn -p 中,如果目标行大于行数,则将光标放在末尾。此处的代码假定您有一个名为 userEntry 的 UITextView 属性。
int targetLine = 3; // change this as appropriate 0=first line
NSRange range;
NSString* exampleString = @"Hello there\nHow is it going?\nAre you looking for a new line?\nA new line in what?\nThat remains to be seen";
NSArray* separateLines = [exampleString componentsSeparatedByString:@"\n"];
if (targetLine < [separateLines count])
{
int count = 0;
for (int i=0; i<targetLine; i++)
{
count = count + [[separateLines objectAtIndex:i] length] + 1; // add 1 to compensate \n separator
}
range = NSMakeRange(count, 0);
}
else
{
range = NSMakeRange([exampleString length], 0); // set to the very end if targetLine is > number of lines
}
[[self userEntry] setText: exampleString];
[[self userEntry] setSelectedRange:range];
[[self userEntry] becomeFirstResponder];