【问题标题】:Position cursor to end of text in uitextview and scroll to position将光标定位到 uitextview 中的文本末尾并滚动到位置
【发布时间】:2010-09-07 17:26:01
【问题描述】:

使用下面的代码,我将 plist 中的文本放入 textView。 textView 还不是第一响应者;该文本最初仅供阅读。在 iOS4 中,goToEndOfNote 代码将光标定位在文本的末尾并滚动到该位置。在 3.1.3 中,它不会滚动到最后,直到屏幕被触摸(除非需要更改或添加,否则不需要),使 textView 成为第一响应者。我希望它像在 4.0 中一样在 3.1.3 中工作。请有任何想法。谢谢。

    ...
    self.temp = [[[NSMutableArray alloc] initWithContentsOfFile:myPlistPath] autorelease]; 
    self.textView.text = [self.temp objectAtIndex:0];
    [self goToEndOfNote];
    //[self performSelector:@selector(goToEndOfNote) withObject:nil afterDelay:0.1];
}

- (void) goToEndOfNote {
    NSUInteger length = self.textView.text.length;  
    self.textView.selectedRange = NSMakeRange(length, 0);
}

【问题讨论】:

    标签: iphone scroll uitextview text-cursor


    【解决方案1】:

    我在我的一个应用程序中使用setContentOffset:animated 滚动到UITextView 的顶部。也应该适用于滚动到底部。试试:

    - (void) goToEndOfNote {
        NSUInteger length = self.textView.text.length;  
        self.textView.selectedRange = NSMakeRange(length, 0);
        [textView setContentOffset:CGPointMake(0, length) animated:YES];
    }
    

    你也可以把它包起来,让它只发生在 3.1.3 及以下版本:

    - (void) goToEndOfNote {
        NSUInteger length = self.textView.text.length;  
        self.textView.selectedRange = NSMakeRange(length, 0);
        NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
        float version = [systemVersion floatValue];
        if (version < 3.2) {
            [textView setContentOffset:CGPointMake(0, length) animated:YES];
        }
    }
    

    【讨论】:

    • 差不多但不完全。文本视图是屏幕的大部分。在 4.0 中添加行 [textView setContentOffset:CGPointMake(0, length) animated:YES];导致最后一个字符滚动到 textView 的底部(好)。在 3.1.3 中,它会导致最后一个字符滚动到屏幕的中间位置(好的),但在两个操作系统版本中,如果屏幕上只有 1 或 2 行,它们会滚动到屏幕外(不是这样)好的)。我宁愿只在屏幕出现后才开始滚动(就像在 4.0 中一样,我的方法中只有 2 行原始行)。
    【解决方案2】:

    不确定这是否是答案,但它有效。

    在 3.1.3 中,使用原始代码时,光标位于末尾,但滚动条位于顶部。在 4.0 中,两者都处于底部。

    NSUInteger length = self.textView.text.length;
    self.textView.selectedRange = NSMakeRange(length, 0);
    

    然后我注意到在3.1.3中,切换0和长度,滚动在底部但光标在顶部。

    NSUInteger length = self.textView.text.length;
    self.textView.selectedRange = NSMakeRange(0, length); 
    

    将两者放在一起工作。它滚动到底部 NSMakeRange(0, length) 大概到范围的末尾,然后 NSMakeRange(length, 0) 将光标放在那里,所有这些都没有改变它在 4.0 中的作用

    NSUInteger length = self.textView.text.length;
    self.textView.selectedRange = NSMakeRange(0, length); 
    self.textView.selectedRange = NSMakeRange(length, 0);
    

    【讨论】:

      【解决方案3】:

      您可以使用[UITextView -setSelectedRange:] 设置(location = TEXT_VIEW_STRING_LENGTH,length=0) 范围以将光标移动到文本末尾,然后使用相同范围调用[UITextView -scrollRangeToVisible:] 以将光标滚动到可见。

      【讨论】:

        【解决方案4】:

        已经很晚了,但我找到了可行的解决方案。它需要一点技巧

        - (void) textViewDidBeginEditing:(UITextView*)textview
        {
           [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01];
        }
        
        - (void)placeCursorAtEnd:(UITextView *)textview
        {
             NSUInteger length = textview.text.length;
        
            textview.selectedRange = NSMakeRange(length, 0);
        
            [textView setContentOffset:CGPointMake(0, length) animated:YES];
        }
        

        【讨论】:

        • 使用dispatch_after() 时会更干净,因为它保存了一个方法并将触发器和动作保持在一起。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多