Как предотвратить исчезновение модального вида при вращении на iPad? - PullRequest
6 голосов
/ 14 февраля 2011

Я использую willRotateToInterfaceOrientation для смены просмотров, когда мой iPad вращается. Если у меня есть модальное представление или представление предупреждений, когда мое устройство поворачивает и меняет представления, представление меняется, и предупреждение исчезает и не появляется снова, даже если предупреждение снова «представлено» позже.

Edit: Я немного сузил эту проблему. Когда модальное представление представлено с UIModalPresentationFullScreen, модальное представление «выживает» вращениями.

Что я могу сделать, чтобы это исправить?

Вот моя реализация willRotateToInterfaceOrientation:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

//
//  Load an alternate view depending on the orientation
//


if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {

    [UIView beginAnimations:@"" context:nil];
    [self setView:theLandscapeView];
    self.view.bounds = CGRectMake(0, 0, 1024, 768);
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (-90));
    [UIView commitAnimations];      

}else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {

    [UIView beginAnimations:@"" context:nil];
    [self setView:theLandscapeView];
    self.view.bounds = CGRectMake(0, 0, 1024, 768); 
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (90));
    [UIView commitAnimations];

}else if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {

    [UIView beginAnimations:@"" context:nil];
    [self setView:thePortraitView];
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (0));
    self.view.bounds = CGRectMake(0, 0, 768, 1024);
    [UIView commitAnimations];

}else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {

    [UIView beginAnimations:@"" context:nil];
    [self setView:thePortraitView];
    self.view.transform = CGAffineTransformMakeRotation(kDegreesToRadians * (180));
    self.view.bounds = CGRectMake(0, 0, 768, 1024);
    [UIView commitAnimations];
}   
}

Ответы [ 3 ]

2 голосов
/ 13 марта 2011

Если бы я решал эту проблему, я бы сделал одно из следующих действий

  1. Добавить альтернативные представления в родительское представление, а не изменять свойство представления
  2. Создание дизайна для представлений, который не требует замены полного представления, но переставляет или скрывает подэлементы представления.
  3. Представить любой модал из корневого ViewController иерархии

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

0 голосов
/ 05 января 2013

Вот идея: оставьте основной вид постоянным, но измените подпредставление на свой портретный или альбомный вид. что-то вроде:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    // Remove the current subview from the main view
    if (self.view.subviews.count) {
        [self.view.subviews objectAtIndex:0] removeFromSuperview];
    }

    // Use your if-else block, but change [self setView:] for [self.view addSubview:]
}

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

Обратите внимание, что я не проверял это, так как после двух недель перерыва вернул свою голову программированию ... Удачи!

0 голосов
/ 05 июня 2011

Если вы меняете представления, вы также должны поменять модальные представления, я думаю.

Например, если вы представите контроллер поповера - он будет автоматически удален, а затем появится с поворотом пользовательского интерфейса.

...