如何滚动到UITextView中的某个点?

时间:2014-04-26 16:02:47

标签: ios uiscrollview uitextview

我有大量的文字,我甚至无法手动滚动。所以,我需要将UITextView滚动到某一点。

我测试了以下可行的代码,但(y)的数量太大了。

self.txtView.contentOffset = CGPointMake(0, 100000);

那么,有没有办法滚动到UITextView中的某个点?

2 个答案:

答案 0 :(得分:2)

UITextViewUIScrollView类的子类。因此,您可以将其滚动到节目特定的框架:

[textView scrollRectToVisible:CGRectMake(0, 100, 320, 20) animated:YES];

此外,您可以滚动到特定文字:

[textView scrollRangeToVisible:[textView.text rangeOfString:@"Lorem ipsum"]];

答案 1 :(得分:1)

UITextView有一个方法:

setSelectedRange: (NSRange) range

如果您知道字符串第13行出现在哪里,请说出位置237,然后执行:

[textView setSelectedRange: NSMakeRange(237,0)];

如果您需要找出第13行的位置,那么您还需要做更多的工作。我首先看一下sizeWithFont,记住要从textView的宽度上咬下大约16个点,以便iOS得到正确的总和。 (也就是说,如果你有换行符,那么只需找到第13个(或第n个)" \ n"的位置。)

更新:

在评论中进一步查询后:

有很多方法可以找到第n个位置。以下代码段并不漂亮,但它可以完成这项工作。您还可以使用rangeOfString并遍历" \ n"。在此片段中,如果目标行大于行数,则将光标放在末尾。这里的代码假设您有一个名为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];