2015-04-20 2 views
2

У меня есть ViewController с UITextView, занимающим весь вид, с навигационной панелью сверху. Почти как приложение «Заметки» от Apple. То, что я пытаюсь достичь, - сохранить курсор текстового поля видимым при запуске редактирования или при редактировании.UITextView как держать курсор над клавиатурой

Мне удалось получить курсор CGPoint, но мне сложно вычислить точку прокрутки. Как я могу это достичь?

Благодаря

Когда TextView начинает редактирование

- (void)keyboardDidShow:(NSNotification*)aNotification { 

    // Keyboard 
    NSDictionary *info = [aNotification userInfo]; 
    CGRect keyPadFrame = [[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:self.view]; 
    CGSize keyboardSize = keyPadFrame.size; 
    kbSize = keyboardSize; 

    [self scrollToCursor]; 
} 

Когда TextView редактирует

- (void)textViewDidChange:(UITextView *)textView { 
    // Scroll to cursor 
    [self scrollToCursor]; 
} 

Прокрутить метод курсора

- (void)scrollToCursor { 
    // View 
    CGRect viewBounds = self.view.bounds; 
    CGRect visibleViewBounds = CGRectMake(viewBounds.origin.x, 
              viewBounds.origin.y + (self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height), 
              viewBounds.size.width, 
              viewBounds.size.height - (kbSize.height + self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height)); 

    // TextView 
    CGPoint textViewOrigin = [self.view convertRect:self.noteTextView.frame fromView:self.noteTextView.superview].origin; 

    // Cursor 
    CGPoint textViewCursor = [self.noteTextView caretRectForPosition:self.noteTextView.selectedTextRange.start].origin; 
    CGPoint cursorPoint = CGPointMake((textViewCursor.x + textViewOrigin.x), (textViewCursor.y - self.noteTextView.contentOffset.y)); 

    // Scroll to point 
    if (!CGRectContainsPoint(visibleViewBounds, CGPointMake(cursorPoint.x, cursorPoint.y + 25/*25 for cursor's height*/))) { 
     [self.noteTextView setContentOffset:CGPointMake(0, 0)/*How to calculate??*/ animated:YES]; 
    } 
} 
+0

Вы знаете высоту клавиатуры, и вы можете получить размер экрана. Если у вас есть CGPoint курсора. вы можете добавить, что y к высоте клавиатуры (плюс любое дополнение), и уберите это от высоты экрана. Это дает вам значение y для прокрутки. – Siriss

+0

@Siiss Спасибо за ваш ответ! Не могли бы вы отправить ответ с кодом? – SFF

ответ

3

Это не испытанный на аль l, но это была бы моя первая попытка.

Получить высоту клавиатуры, слушая KeyboardWillChangeFrameNotification

CGRect keyboardFrame; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil]; 
- (void)keyboardWillChange:(NSNotification *)notification { 
    keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardFrame = [self.view convertRect:keyboardRect fromView:nil]; 
} 

Это даст вам высоту клавиатуры.

Затем получить высоту экрана:

CGRect screenBound = [[UIScreen mainScreen] bounds]; 
CGSize screenSize = screenBound.size; 
CGFloat screenHeight = screenSize.height; 

Тогда, если вы знаете CGPoint курсора, сделать что-то вроде этого:

CGFloat keyboardTop = (screenHeight - (keyboardFrame.size.height + <padding if you want it>)); 
if (currentCursorPosition.y > keyboardTop) 
{ 
[self.noteTextView setContentOffset:CGPointMake(0, (cursorPoint.y - (viewBounds.size.height - kbSize.height)) + self.noteTextView.contentOffset.y + 25); 
} 

В идеале это должно держать курсор в верхней части клавиатуры, а затем прокрутите ее, когда вы перемещаете курсор вниз.

+0

Я ценю вашу помощь. Я попробую прямо сейчас. – SFF

+0

hmm ... Я сделал точку прокрутки в 'CGPointMake (0, cursorPoint.y - (viewBounds.size.height - kbSize.height)), но она не работает должным образом. Иногда он прокручивается немного, а иногда он прокручивается больше, чем должно быть ... Я не уверен, где поступил не так :( – SFF

+0

Хорошо, я наконец-то получил его на работу. Мне не хватало contentOffSet textview. Я сделал 'CGPointMake (0, (cursorPoint.y - (viewBounds.size.height - kbSize.height)) + self.noteTextView.contentOffset.y + 25) '. Можете ли вы обновить свой ответ, чтобы я мог его принять? – SFF

Смежные вопросы