Рамка UITableViewCell изменяется при представлении родительского представления как модального с UIModalPresentationFormSheet - PullRequest
0 голосов
/ 19 февраля 2012

Состояние кода:

Я пишу свою собственную библиотеку для форм в табличном представлении (я знаю о 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, используя его базовый инициализатор и несколько свойств.

Я делаю свой пользовательский рендеринг следующим образом:

  1. Создайте мое пользовательское поле (т.е. UITextField) в инициализаторе определенной ячейки (ESCTextFieldCell)
  2. prepareForReuse вызывается платформой при повторном использовании ячейки, где я удаляю старых наблюдателей и делаю недействительным то, что необходимо для аннулирования
  3. configWithModel: (Model *) модели, где я устанавливаю свойства ячейки,добавить наблюдателей и т. д.
  4. 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.

Ответы [ 3 ]

0 голосов
/ 08 марта 2013

Я видел такую ​​же проблему в некоторых оригинальных (читай Apple) приложениях на iOS, поэтому считаю это функцией системы. Кажется, лучшее, что мы можем сделать, это скрыть это как можно больше. На самом деле, никто, кроме меня, не заметил поведение, поэтому я думаю, что никто не обеспокоен.

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

0 голосов
/ 06 сентября 2013

Установите макет UITableView для удаления вне автоматического изменения размера.

enter image description here

0 голосов
/ 02 марта 2012

Мирослав, я не уверен, что это помогает, но я боролся с тем же. И я делюсь этим здесь, потому что я предполагаю, что другие могут задаться вопросом, что происходит.

Это не просто ячейка, это все границы табличного представления, которые не устанавливаются, пока не будет вызван ViewDidAppear.

Итак, давайте предположим, что вы хотите вызвать модал 500x500 с UITableViewController, запустить его с presentViewController, у вас будут все виды изменения размера, пока он окончательно не будет решен в ViewDidAppear. В моем случае я видел, как отладка переходит от 1024 к 320, а затем к 500. И именно эту ширину мне нужно определить, чтобы получить результирующую высоту ячеек табличного представления.

В этом случае все выглядит как хак, и я не уверен, что есть чистое решение, хотя я бы хотел одного. Один из способов, которым я сейчас тестирую это, заключается в том, что настраиваемые ячейки табличного представления имеют свойство «окончательной ширины», на которое они смотрят (если оно установлено) при определении размера в layoutSubviews. Таким образом, правильная высота ячейки может быть рассчитана (на основе этой фиксированной ширины) в любое время до того, как представление таблицы будет в окончательном виде.

...