Как программно переместить UIScrollView для фокусировки в элементе управления над клавиатурой? - PullRequest
49 голосов
/ 27 января 2009

У меня 6 UITextFields на моем UIScrollView. Теперь я могу прокрутить по запросу пользователя. Но когда появляется клавиатура, некоторые текстовые поля скрыты.

Это не удобно для пользователя.

Как программно прокрутить вид, чтобы убедиться, что клавиатура не скрывает текстовое поле?

Ответы [ 13 ]

0 голосов
/ 31 августа 2015

Я думаю, что лучше использовать клавиатурные уведомления, потому что вы не знаете, является ли первый респондент (элемент управления с фокусировкой на) textField или textView (или что-то еще). Поэтому создайте категорию, чтобы найти первого респондента:

#import "UIResponder+FirstResponder.h"

static __weak id currentFirstResponder;

@implementation UIResponder (FirstResponder)

+(id)currentFirstResponder {
   currentFirstResponder = nil;
   [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
   return currentFirstResponder;
}

-(void)findFirstResponder:(id)sender {
   currentFirstResponder = self;
}

@end

затем

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

    contentScrollView.delegate=nil;
    contentScrollView.scrollEnabled=NO;
    contentScrollViewOriginalOffset = contentScrollView.contentOffset;

    UIResponder *lc_firstResponder = [UIResponder currentFirstResponder];
    if([lc_firstResponder isKindOfClass:[UIView class]]){

        UIView *lc_view = (UIView *)lc_firstResponder;

        CGRect lc_frame = [lc_view convertRect:lc_view.bounds toView:contentScrollView];
        CGPoint lc_point = CGPointMake(0, lc_frame.origin.y-lc_frame.size.height);
        [contentScrollView setContentOffset:lc_point animated:YES];
    }
}

В конце концов отключите прокрутку и установите делегата на ноль, а затем восстановите его, чтобы избежать некоторых действий во время издания первого респондента. Как сказал james_womack, сохраните исходное смещение, чтобы восстановить его с помощью метода keyboardWillHideNotification.

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

    contentScrollView.delegate=self;
    contentScrollView.scrollEnabled=YES;
    [contentScrollView setContentOffset:contentScrollViewOriginalOffset animated:YES];
}
0 голосов
/ 21 января 2015

Используйте любой из них,

CGPoint bottomOffset = CGPointMake(0, self.MainScrollView.contentSize.height - self.MainScrollView.bounds.size.height);

[self.MainScrollView setContentOffset:bottomOffset animated:YES];

или

[self.MainScrollView scrollRectToVisible:CGRectMake(0, self.MainScrollView.contentSize.height - self.MainScrollView.bounds.size.height-30, MainScrollView.frame.size.width, MainScrollView.frame.size.height) animated:YES];
0 голосов
/ 24 августа 2013

Я изменил некоторые из вышеперечисленных решений, чтобы их было легче понять и использовать. Я использовал IBOutlet, чтобы несколько текстовых полей могли ссылаться на функцию с помощью «Редактировать начало» из «Отправленных событий» текстовых полей. ** Не забудьте иметь розетку для просмотра прокрутки

- (IBAction)moveViewUpwards:(id)sender
{
    CGRect rc = [sender convertRect:[sender bounds] toView:scrollView];
    rc.origin.x = 0 ;
    rc.origin.y -= 60 ;

    rc.size.height = 400;
    [scrollView scrollRectToVisible:rc animated:YES];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...