UITextField в UICollectionViewCell, таинственно исчезающие ячейки - PullRequest
0 голосов
/ 04 мая 2020

У меня есть UITextfields, встроенные в UICollectionViewCells. У меня есть 5 разделов в представлении коллекции. При вызове следующих методов для смещения представления сбора одна из ячеек пропадает после прокрутки представления сбора.

Вот методы для настройки смещения содержимого для клавиатуры:

- (void)registerForKeyboardNotifications {
  [[NSNotificationCenter defaultCenter] removeObserver:self];
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
  [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(keyboardWasShown:)
                                               name:UIKeyboardDidShowNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(keyboardWillBeHidden:)
                                               name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWasShown:(NSNotification*)aNotification {
  NSDictionary *info = [aNotification userInfo];
  CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
  UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
  self.contentView.collectionView.contentInset = contentInsets;
  CGRect aRect = CGRectMake(0, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
  aRect.size.height -= kbSize.height;
  if (!CGRectContainsPoint(aRect, self.activeField.frame.origin) ) {
    [self.contentView.collectionView scrollRectToVisible:self.activeField.frame animated:YES];
  }
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
  self.contentView.collectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  CGPoint origin = textField.frame.origin;
  CGPoint point = [textField.superview convertPoint:origin toView:[[self contentView] collectionView]];
  NSIndexPath *indexPath = [[[self contentView] collectionView] indexPathForItemAtPoint:point];
  self.activeField = [self.contentView.collectionView cellForItemAtIndexPath:indexPath];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
  self.activeField = nil;
}

После вызова этих методов вот результат представления коллекции

enter image description here

Обратите внимание на место для раздела «Номер телефона», но ячейка не отображается.

У меня есть три типа ячеек в этом представлении коллекции. ячейка над ячейкой телефона имеет 6 UITextFields, над этой ячейкой находится та же ячейка многократного использования для разделов Gender и DOB, что и ячейка раздела номера телефона, под ячейкой раздела Phone Number находится раздел адреса электронной почты, который также имеет ту же ячейку многократного использования, что и ячейка Номер телефона Сотовый.

Вот ячейки:

  [[[self contentView] collectionView] registerClass:[WLGAddManualContactNameCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualContactNameCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualContactAddressCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualContactAddressCollectionViewCellConstant];

 [[[self contentView] collectionView] registerClass:[WLGUniversalTextFieldCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGUniversalTextFieldCollectionViewCellConstant];

Кажется, это происходит только тогда, когда у меня есть UITextFields, встроенные в UICollectionViewCells. Размеры ячеек одинаковы для разных типов ячеек, и, как вы можете видеть из отсутствующей ячейки раздела «Номер телефона», интервал есть, поэтому это не проблема пробелов. Это как-то связано с вызовом «contentInset» в представлении коллекции или с вызовом «scrollRectToVisible» в представлении коллекции, а затем обращением к вставке содержимого путем повторного вызова «contentInset». Я могу решить эту проблему по большей части, создав разные подклассы ячеек для каждой ячейки, даже если они являются одной и той же ячейкой с точки зрения пользовательского интерфейса. Похоже, это имеет место только при повторном использовании «WLGUniversalTextFieldCollectionViewCell», но даже при регистрации совершенно новых ячеек, таких как:

 [[[self contentView] collectionView] registerClass:[WLGAddManualGenderCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualGenderCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualDOBCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualDOBCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualEmailCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualEmailCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualPhoneCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualPhoneCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualContactNameCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualContactNameCollectionViewCellConstant];

  [[[self contentView] collectionView] registerClass:[WLGAddManualContactAddressCollectionViewCell class]
                          forCellWithReuseIdentifier:WLGAddManualContactAddressCollectionViewCellConstant];

... проблема сохраняется, но не так.

Мне нужны клетки, чтобы перестать исчезать.

Буду признателен за любую помощь.

...