Клавиатура

Удаление клавиатуры после ввода, автоматический скроллинг полей ввода при выводе на экран клавиатуры

iOS не удаляет с экрана клавиатуру после нажатии кнопки ввода, а цифровая клавиатура вообще не содержит данной кнопки, поэтому задача по скрытию клавиатуры полностью ложиться на плечи разработчика.

При выводе на экран клавиатуры, iOS, используя центр уведомлений, посылает уведомление UIKeyboardDidShowNotification, а при скрытии UIKeyboardDidShowNotification. Исходя из этого Ваш контроллер вида с текстовыми полями должен зарегистрироваться в центре уведомлений на прием этих уведомлений.

Чтобы осуществить прокрутку контента, его необходимо положить в отдельный UIView, который положить в UIScrollView контейнер, как показано ниже.

UIView-UIScrollView-UIView-

Далее переходим в закладку "Identity Inspector" и назначаем для contentView класс UIControl, для того, чтобы он мог принимать сообщения от касаний. Это необходимо потому, что не все типы клавиатур имеют кнопку "Enter".

Identity Inspector Xcode6

Теперь напишем универсальный класс контроллера вида, который будем использовать в качестве родительского для каждого контроллера видового представления, в котором будет необходимо скрывать клавиатуру.

Листинг mbScrollV.h

#import <UIKit/UIKit.h>

@interface mbScrollV : UIViewController <UITextFieldDelegate>
{
  UIScrollView* scrollView; //  указатель на наш UIScrollView
  UITextField* activeField; // указывает на активный элемент ввода
}

@end

Листинг mbScrollV.m

#import "mbScrollV.h"

@interface mbScrollV ()

@end

@implementation mbScrollV

- (void)viewDidLoad {
    [super viewDidLoad];
  // регистрация на центре уведомлений
  
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(keyboardWasShown:)
                                               name:UIKeyboardDidShowNotification object:nil];
  
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(keyboardWillBeHidden:)
                                               name:UIKeyboardWillHideNotification object:nil];
  
  NSArray* arrV = self.view.subviews; // получаем массив всех пеодвидов
  for(UIView* v in arrV){
    if([v isKindOfClass:[UIScrollView class]]){
      scrollView = (UIScrollView*)v; // находим наш scrollView и сохраняем его
      break;
    }
  }
  if(scrollView){
    UIView* contentView = scrollView.subviews[0]; // определяем contentView
      // как первый подвид у нашего scrollView
    CGRect r = [contentView frame];
    scrollView.contentSize = r.size; // устанавливаем значение размера вида с контентом 
    //
    if([contentView isKindOfClass:[UIControl class]])// если contentView установлен в "Identity Inspector" в UIControl
       // устанавливаем для него обработчик касания
      [(UIControl*)contentView addTarget:self action:@selector(touchFieldsView:)
            forControlEvents:UIControlEventTouchDown];
    NSArray* arrC = contentView.subviews; // получаем массив из подвидов contentView
    for(id editOrNo in arrC){
      if([editOrNo isKindOfClass:[UITextField class]]){
        UITextField* tf = editOrNo; // если подвид является экземпляром UITextField, устанавливаем его делегат
        [tf setDelegate:self];
      }
    }
  }
}

- (void)keyboardWasShown:(NSNotification*)aNotification // Обработка сообщения о отображении клавиатуры
{
  NSDictionary* info = [aNotification userInfo];
  CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; // получаем размер клавиатуры
  
  UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
  scrollView.contentInset = contentInsets;
  scrollView.scrollIndicatorInsets = contentInsets;
  
  // Если активное поле ввода спрятано клавиатурой, скроллируем, чтобы показать его
  CGRect aRect = self.view.frame;
  aRect.size.height -= kbSize.height;
  if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
    [scrollView scrollRectToVisible:activeField.frame animated:YES];
  }
}

// Вызывается когда клавиатура скрывается
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
  UIEdgeInsets contentInsets = UIEdgeInsetsZero;
  scrollView.contentInset = contentInsets;
  scrollView.scrollIndicatorInsets = contentInsets;
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// Вызывается при начале редактирования текстового поля, метод делегата
-(void)textFieldDidBeginEditing:(UITextField *)textField {
  activeField = textField;
}

// Вызывается при окончании редактирования текстового поля, метод делегата
-(void)textFieldDidEndEditing:(UITextField *)textField {
  activeField = nil;
}

// Вызывается при нажатии Enter на клавиатуре
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
  [textField resignFirstResponder];
  return YES;
}

// При освобождении из памяти, снимаем контроллер вида с центра уведомлений
- (void) dealloc {
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

// Обработчик нажатия вне текстового поля, т.е. нажатия contentView

- (IBAction)touchFieldsView:(id)sender {
  if(activeField)
    [activeField resignFirstResponder];
}
@end

Теперь создав контроллер вида, обрабатывающий вывод клавиатуры, вы можете его унаследовать от приведенного выше контроллера вида, соблюдя лишь иерархию видов, приведенную здесь, либо изменить данный код по своему усмотрению.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac