У меня есть 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;
}
После вызова этих методов вот результат представления коллекции
Обратите внимание на место для раздела «Номер телефона», но ячейка не отображается.
У меня есть три типа ячеек в этом представлении коллекции. ячейка над ячейкой телефона имеет 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];
... проблема сохраняется, но не так.
Мне нужны клетки, чтобы перестать исчезать.
Буду признателен за любую помощь.