Изменение UIViews во время UIInterfaceOrientation на iPad

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

Вот код, который я использую для достижения этого

В моем методе "viewDidLoad"

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];      
[[NSNotificationCenter defaultCenter] addObserver:self  
                                         selector:@selector(didRotate:)  
                                             name:UIDeviceOrientationDidChangeNotification   
                                           object:nil];      

Затем я вызываю это для вращения:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

- (void)didRotate:(NSNotification *)notification  
{          
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];  

    if ((orientation == UIDeviceOrientationLandscapeLeft) ||
        (orientation == UIDeviceOrientationLandscapeLeft))
    {  
        // present the other viewController, it's only viewable in landscape  
        [self.view addSubview:landScapeView];
    }

    if ((orientation == UIDeviceOrientationLandscapeRight) ||
        (orientation == UIDeviceOrientationLandscapeRight))
    {  
        // present the other viewController, it's only viewable in landscape  
        [self.view addSubview:landScapeView];
    }  
    else if ((orientation == UIDeviceOrientationPortrait ||
             (orientation == UIDeviceOrientationPortrait))
    {
        // get rid of the landscape controller  
        [self.view addSubview:portrait];
    }  
    else if ((orientation == UIDeviceOrientationPortraitUpsideDown ||
             (orientation == UIDeviceOrientationPortraitUpsideDown))
    {
        // get rid of the landscape controller  
        [self.view addSubview:portrait];
    }  
}

person FreeAppl3    schedule 24.06.2011    source источник
comment
Пожалуйста, найдите время, чтобы правильно отформатировать код в следующий раз, когда будете задавать вопрос, так как его будет намного легче читать, и вы получите лучший ответ. Кроме того, я точно не знаю, почему вы дважды проверяете переменную orientation на одно и то же значение в каждом условии if/else; вам следует упростить этот код.   -  person Shaggy Frog    schedule 24.06.2011
comment
Извините, обычно я делаю... уже поздно. Спасибо за исправление!   -  person FreeAppl3    schedule 24.06.2011


Ответы (1)


Вы добавляете свой вид ориентации при повороте, но никогда не удаляете другой, который вам нужен.

// get rid of the landscape controller  
    ((orientation == UIDeviceOrientationPortraitUpsideDown || orientation == 
UIDeviceOrientationPortraitUpsideDown)) {

[landScapeView removeFromSuperview];      
[self.view addSubview:portrait];
    }  

И аналогично в другую сторону.

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

person Warren Burton    schedule 24.06.2011
comment
Я ценю ответ. Имеет смысл, я пытался это сделать, но у меня есть несколько вещей, которые мне нужно решить. Вы определенно направили меня в правильном направлении! Спасибо! - person FreeAppl3; 24.06.2011