Вандад Нахавандипур

iOS. Приемы программирования


Скачать книгу

как клавиатура скроется из вида;

      Рис. 1.56. Клавиатура, наполовину занимающая текстовый вид

      • UIKeyboardDidHideNotification – система выдает такое уведомление после того, как клавиатура полностью скроется из вида.

      Уведомления клавиатуры содержат словарь, доступный с помощью свойства userInfo. Он указывает границы клавиатуры на экране и относится к типу NSDictionary. В словаре среди прочего имеется ключ UIKeyboardFrameEndUserInfoKey, содержащий объект типа NSValue. В свою очередь, этот объект содержит прямоугольник, ограничивающий размеры клавиатуры, когда она полностью отображена на экране. Эта прямоугольная область обозначается как CGRect.

      Наша стратегия такова: нужно узнать, когда клавиатура полностью отобразится, а потом каким-то способом пересчитать размеры нашего текстового вида. Для этого воспользуемся свойством contentInset класса UITextView, чтобы задать границы контента, содержащегося в текстовом поле, – верхнюю, нижнюю, правую и левую:

      – (void) handleKeyboardDidShow:(NSNotification *)paramNotification{

      /* Получаем контур клавиатуры. */

      NSValue *keyboardRectAsObject =

      [[paramNotification userInfo]

      objectForKey: UIKeyboardFrameEndUserInfoKey];

      /* Помещаем эту информацию в CGRect. */

      CGRect keyboardRect;

      [keyboardRectAsObject getValue:&keyboardRect];

      /* Задаем нижнюю границу нашего текстового вида так, чтобы он доходил ровно до верхней границы клавиатуры. */

      self.myTextView.contentInset =

      UIEdgeInsetsMake(0.0f,

      0.0f,

      keyboardRect.size.height,

      0.0f);

      }

      – (void) handleKeyboardWillHide:(NSNotification *)paramNotification{

      /* Делаем текстовый вид таким же по размеру, как и вид, содержащий его. */

      self.myTextView.contentInset = UIEdgeInsetsZero;

      }

      – (void) viewWillAppear:(BOOL)paramAnimated{

      [super viewWillAppear: paramAnimated];

      [[NSNotificationCenter defaultCenter]

      addObserver: self

      selector:@selector(handleKeyboardDidShow:)

      name: UIKeyboardDidShowNotification

      object: nil];

      [[NSNotificationCenter defaultCenter]

      addObserver: self

      selector:@selector(handleKeyboardWillHide:)

      name: UIKeyboardWillHideNotification

      object: nil];

      self.myTextView = [[UITextView alloc] initWithFrame: self.view.bounds];

      self.myTextView.text = @"Some text here…";

      self.myTextView.font = [UIFont systemFontOfSize:16.0f];

      [self.view addSubview: self.myTextView];

      }

      – (void) viewWillDisappear:(BOOL)paramAnimated{

      [super viewWillDisappear: paramAnimated];

      [[NSNotificationCenter defaultCenter] removeObserver: self];

      }

      В этом коде начинаем наблюдать за клавиатурными уведомлениями в методе viewWillAppear: и прекращаем слушать их в методе viewWillDisappear:. Важно убрать контроллер вида из списка слушателей, так как вы, вероятно, не хотите получать клавиатурные уведомления, инициируемые контроллером другого вида. Случается, что и при работе в фоновом режиме контроллер вида должен получать уведомления, но это бывает редко. Как правило, нужно прекращать слушание уведомлений в методе viewWillDisappear:. Мне не раз доводилось видеть, как программисты портят хорошие приложения, пренебрегая этой простой логикой.

      Если вы намереваетесь изменять структуру пользовательского интерфейса, когда клавиатура выводится на экран и когда она с него убирается, то вам никак не обойтись без слушания клавиатурных уведомлений. Сообщения делегата UITextField