Состояние кода:
Я пишу свою собственную библиотеку для форм в табличном представлении (я знаю о Sensible Cocoa, но хочу написать свою собственную), и яРабота с проблемой, слабо связанной с ней.
Моя форма хранится в UITableViewController в стиле UITableViewStyleGrouped.Этот контроллер табличного представления создается в обработчике кнопок с таким кодом (опущена инициализация модели формы):
// prepare table view model
_formTableViewController = [[ESCTableViewController alloc] initWithModel:model];
_formTableViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(cancelBarButtonItemHandler:)];
_formTableViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
target:self action:@selector(editBarButtonItemHandler:)];
// prepare navigation controller containing the tableViewController
ESCNavigationController *navigationController = [[ESCNavigationController alloc] initWithRootViewController:_formTableViewController];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
// present navigation view controller
[self presentViewController:navigationController animated:YES completion:nil];
Затем у меня UITableViewCell, подклассифицированный (как ESCTableViewCell) со стилем UITableViewCellStyleDefault, и каждый компонент формы является потомкомESCTableViewCell, используя его базовый инициализатор и несколько свойств.
Я делаю свой пользовательский рендеринг следующим образом:
- Создайте мое пользовательское поле (т.е. UITextField) в инициализаторе определенной ячейки (ESCTextFieldCell)
- prepareForReuse вызывается платформой при повторном использовании ячейки, где я удаляю старых наблюдателей и делаю недействительным то, что необходимо для аннулирования
- configWithModel: (Model *) модели, где я устанавливаю свойства ячейки,добавить наблюдателей и т. д.
layoutSubviews вызывается фреймворком;мета-код этого процесса находится здесь:
CGFloat const ESCTextFieldWidthRatio = 0.65f;
CGFloat const ESCFieldHeight = 22.0f;
CGFloat const ESCFieldPadding = 10.0f;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
// call super layout subviews first
[super layoutSubviews];
// count width of the text field, so it would fit with label
// must round() the results to avoid antialiasing on fractional values
CGFloat contentWidth = self.contentView.frame.size.width;
CGFloat contentHeight = self.contentView.frame.size.height;
CGFloat fieldWidth = round((contentWidth - (2 * ESCFieldPadding)) * ESCTextFieldWidthRatio);
CGFloat fieldOriginY = round((contentHeight / 2) - (ESCFieldHeight / 2));
CGFloat labelWidth = contentWidth - fieldWidth - (4 * ESCFieldPadding);
// set textlabel and textfield frames
self.textLabel.frame = CGRectMake(ESCFieldPadding, 0.0f, labelWidth, contentHeight);
self.textField.frame = CGRectMake(labelWidth + (3 * ESCFieldPadding), fieldOriginY, fieldWidth, ESCFieldHeight);
[UIView commitAnimations];
Проблема:
Я пытаюсь сделать интерфейс пользователя таким чистым, каквозможно, будучи перфекционистом;поэтому я хочу, чтобы ячейки табличного представления анимировались при входе / выходе из режима редактирования, который довольно хорошо работает в текущем состоянии кода.
Проблема заключается в представлении самого модального представления с этим представлением таблицы формы внутри.Кажется (доказано симулятором - медленная анимация), что при представлении модального представления кадр табличного представления обновляется (сокращается) на (как минимум) несколько пикселей, что вызывает как анимацию трансляции модального представления, так и изменение размера ячейки табличного представленияанимация, которая в конце вызывает не очень плавную анимацию представления модального представления.
Я хотел бы понять, почему ячейка табличного представления изменяет размер представления модального представления какМне не нравится идея взломать код для отключения анимации при представлении модального представления (это может впоследствии вызвать множество других проблем).
Пожалуйста, кто-нибудь знает, почему это происходит,или у вас есть какая-то другая идея, как переопределить ее нехакерским способом?
Спасибо вам большое!
PS: Я использую ARC, но я не думаю, что это имеет значение.
PS2: проблема возникает на iPad1 и iOS Simulator для iOS5.