Два контроллера внутри UIPopoverController: проблемы с фреймами - PullRequest
0 голосов
/ 22 января 2012

У меня есть UIPopoverController с двумя контроллерами представления внутри него.Я строю это так:

CommentsPopoverController *commentsPopoverController = [[CommentsPopoverController alloc] init];
self.delegate = commentsPopoverController;
commentsPopoverController.navigationItem.title = @"Comments";
UINavigationController *navController = [[UINavigationController alloc]                               initWithRootViewController:commentsPopoverController];
popover = [[UIPopoverController alloc] initWithContentViewController:navController];

Внутри моего commentsPopoverController у меня есть это:

commentsViewController = [[CommentsViewController alloc] init];
commentsViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

addCommentsViewController = [[AddCommentViewController alloc] init];
addCommentsViewController.view.frame = CGRectMake(0, commentsViewController.view.bounds.size.height - 200, 320, 346);
addCommentsViewController.view.backgroundColor = [UIColor darkGrayColor];

[self.view addSubview:addCommentsViewController.view];
[self.view addSubview:commentsViewController.view];

Поэтому, когда я впервые загружаю поповер, addCommentsViewController скрывается комментариями ViewController.Когда я раскрываю это, это выглядит так:

popover with both controllers visible

Пока все хорошо.У меня проблема в том, что отсюда, когда пользователь поворачивает устройство или показывает клавиатуру или показывает клавиатуру, ТОГДА поворачивает устройство, вещи начинают выходить из строя.Контроллер вида сверху (commentsViewController), который является UITableView, всегда делает правильные вещи, независимо от того, какая ориентация или показывает ли клавиатура.Но контроллер нижнего вида (addCommentsViewController) не меняет автоматически свой origin.y, чтобы оставаться непосредственно под контроллером верхнего вида.

Так что мне в основном пришлось взломать дерьмо из моего кода, чтобы сохранить addCommentsViewControllerнепосредственно под commentsViewController, постоянно вычисляя высоту контроллера верхнего вида, чтобы я мог настроить origin.y контроллера нижнего вида.Это включало сброс NSNotifications для состояния отображения / скрытия клавиатуры, а также для ориентации устройства и постоянного пересчета.Очень хакерский и уродливый.

Итак, мой вопрос (наконец-то): есть ли более простой способ контролировать эти взгляды, или я застрял, взламывая его так, как я это сделал?

1 Ответ

0 голосов
/ 22 января 2012

Для обработки вращения есть два соответствующих метода.Во-первых, вы делаете CommentsPopoverController представление подклассом UIView, который переопределяет layoutSubviews, чтобы правильно расположить два ваших представления.Другое - вы определяете viewDidLayoutSubviews на CommentsPopoverController, чтобы выложить свои представления.Если вы размещаете свои представления одним из этих способов, вам не нужно подписываться на уведомления о ротации.

Что касается перемещения вашего вида из-под клавиатуры, это обсуждается в * 1009.* Текст, Интернет и редактирование Руководство по программированию для iOS .Часть техники, включающей подписку на клавиатуру, покажет / действительно скрыла уведомления.

Я предполагаю, что ваш CommentsViewController является подклассом UITableViewController, потому что UITableViewController заботится о настройке представления таблицы, когда клавиатураскрытый или показанный.

...