Остановить UITextView от прыжка при программной настройке текста - PullRequest
19 голосов
/ 14 мая 2009

Мне нужно обновить небольшое количество текста в прокручиваемом UITextView. Я буду вставлять символ только там, где в данный момент находится курсор, и буду делать это нажатием кнопки на панели навигации.

Моя проблема в том, что всякий раз, когда я вызываю метод setText текстового представления, он переходит в конец текста. Я пытался использовать contentOffset и сбрасывать selectedRange, но это не работает! Вот мой пример:

// Remember offset and selection
CGPoint contentOffset = [entryTextView contentOffset];
NSRange selectedRange = [entryTextView selectedRange];
// Update text
entryTextView.text = entryTextView.text;
// Try and reset offset and selection
[entryTextView setContentOffset:contentOffset animated:NO];
[entryTextView setSelectedRange: selectedRange];

Можно ли каким-либо образом обновить текст без какого-либо движения прокрутки ... как если бы они просто что-то набрали на клавиатуре?

Edit:

Я пытался использовать метод textViewDidChange: делегат, но он все еще не прокручивается до исходного местоположения.

- (void)textViewDidChange:(UITextView *)textView {
    if (self.programChanged) {
        [textView setSelectedRange:self.selectedRange];
        [textView setContentOffset:self.contentOffset animated:NO];
        self.programChanged = NO;
    }
}

- (void)changeButtonPressed:(id)sender {
    // Remember position
    self.programChanged = YES;
    self.contentOffset = [entryTextView contentOffset];
    self.selectedRange = [entryTextView selectedRange];
    // Update text
    entryTextView.text = entryTextView.text;
}

Ответы [ 13 ]

1 голос
/ 14 мая 2009

Взгляните на UITextViewDelegate, я считаю, что метод textViewDidChangeSelection может позволить вам делать то, что вам нужно.

0 голосов
/ 22 сентября 2013

Я нашел решение, которое надежно работает в iOS 6 и 7 (и, возможно, более ранних версиях). В подклассе UITextView выполните следующие действия:

@interface MyTextView ()
@property (nonatomic) BOOL needToResetScrollPosition;
@end

@implementation MyTextView

- (void)setText:(NSString *)text
{
    [super setText:text];
    self.needToResetScrollPosition = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (self.needToResetScrollPosition) {
        self.contentOffset = CGPointMake(0, 0);
        self.needToResetScrollPosition = NO;
    }
}

Ни один из других ответов не работает в iOS 7, поскольку он будет корректировать смещения прокрутки во время отображения.

0 голосов
/ 03 февраля 2010

Не очень элегантное решение - но оно работает, так кого волнует:

- (IBAction)changeTextProgrammaticaly{
     myTextView.text = @"Some text";
     [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(rewindOffset) userInfo:nil repeats:NO];
}

- (void)rewindOffset{
    [myTextView setContentOffset:CGPointMake(0,0) animated: NO];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...