iPad Модальный вид не вращается - PullRequest
2 голосов
/ 02 сентября 2010

Итак, в моем приложении отображается модальное представление, в котором есть небольшая информация, которую пользователь должен заполнить. Проблема в том, что когда устройство поворачивается, возникает некоторая анимация, но только в кадре. Сама форма не вращается. Все параметры автоповорота установлены на ДА. Я показываю это, когда пользователь нажимает на поле в поповере. Это заставляет меня подозревать, что это как-то связано с этим, но я не уверен. Это странно, потому что, если устройство находится в любом виде, а затем отображается модальное окно, это нормально. Это происходит только тогда, когда устройство поворачивается в модальном виде. У кого-нибудь есть идеи, что может быть причиной такого поведения при повороте устройства? Спасибо!

Вот фрагмент кода, который обрабатывается в контроллере представления popover:

if (currentLevel == 1 && businessOrLocation == 0){
    if(tbsViewController == nil)
        tbsViewController = [[BusinessFilteredViewController alloc] initWithNibName:@"BusinessFilteredView" bundle:[NSBundle mainBundle]];

    NSMutableArray *tempBusiness = [[NSMutableArray alloc] init];
    for (id theKey in appDelegate.groupedBusiness) {
        NSMutableArray *tempArr = [appDelegate.groupedBusiness objectForKey:theKey];
        [tempBusiness addObject:tempArr];
    }

    tbsViewController.businessOrLocation = businessOrLocation;
    tbsViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    tbsViewController.modalTransitionStyle = UIModalPresentationFullScreen;
    [self presentModalViewController:tbsViewController animated:YES];
}

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Я тоже столкнулся с этой проблемой.Основная проблема заключается в том, что контроллеры popover не могут представлять модальные представления - кажется, что случай не был должным образом рассмотрен или спроектирован.В моей ситуации это было достаточно легко обойти.Я только что расширил протокол делегата для моего контроллера представления, размещенного на popover.Основное представление устанавливает себя в качестве делегата для представления popover и принимает на себя ответственность за отображение и отклонение модальных представлений, которые пользователь запрашивает из popover.

Так как у меня уже был протокол делегата для чистого отклонения popoverПосмотрите, когда пользователь нажимает «готово», это было всего лишь небольшое растяжение, чтобы заставить автоповорот работать так, как я этого хотел.Вот некоторые фрагменты:

@protocol InfoViewControllerDelegate <NSObject>

@optional

// Implement this to close the info view once the user clicks done.
- (void)infoViewDidFinish:(InfoViewController *)view;

// Implement this method if the delegate launched us as a popup view and must therefore
// take responsibility for diplaying help.
- (void)infoViewDidRequestHelp:(InfoViewController *)view;

@end

И в моем основном представлении iPad, которое представляет это всплывающее окно:

#pragma mark - InfoViewControllerDelegate methods

- (void)infoViewDidFinish:(InfoViewController *)view {
    [self hideInfo:self];
}

- (void)infoViewDidRequestHelp:(InfoViewController *)view {
    [self hideInfo:self];  // Close the info view first
    HelpViewController *help = [[HelpViewController alloc] init];
    help.delegate = self;
    [self presentModalViewController:help animated:YES];
    [help release];
}

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

- (IBAction)help:(id)sender {
    if ([delegate respondsToSelector:@selector(infoViewDidRequestHelp:)]) {
        [delegate infoViewDidRequestHelp:self];
    } else {
        HelpViewController *help = [[HelpViewController alloc] init];
        help.delegate = self;
        [self presentModalViewController:help animated:YES];
        [help release];
    }
}

С этим кодом весь мой интерфейс плавно автоматически на обоих устройствах независимо от того, были ли задействованы всплывающие окна.

0 голосов
/ 04 марта 2011

Я предполагаю, что вы реализовали - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation в BusinessFilteredViewController и возвращает YES

Не могли бы вы проверить, что вы добавили более 1 подпредставлений в окно приложения.Если это так, попробуйте создать контейнер UIViewController для всех viewControllers, которые вы хотите добавить в окно.

0 голосов
/ 28 января 2011

Просто я правильно понимаю ... Вы отображаете всплывающее окно, и внутри этого всплывающего окна, если пользователь нажимает на определенный элемент, вы отображаете полноэкранный контроллер модального представления?Ви никогда не пробовал этого раньше, и это кажется странным по двум причинам.

Сначала это кажется раздражающим для пользователя на мой взгляд.Popover дает вам хороший, интегрированный пользовательский интерфейс, а модальное убирает вас.

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

Я бы посоветовал вам отобразить контроллер навигации в контроллере всплывающих окон, и вместо того, чтобы модально представлять новый контроллер представления по всему экрану, просто нажмите его на контроллере навигации в поповере и удерживайте пользователя внутри поповера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...