Анимированный переход не работает правильно в альбомной ориентации - PullRequest
8 голосов
/ 16 января 2011

Мое приложение поддерживает только альбомную ориентацию.

Я пытаюсь перейти в представление контроллера представления, но когда он выполняет анимацию перехода (например, свернувшись калачиком), представление поворачивается на 90 градусов (так что симулятор по-прежнему находится в альбомной ориентации, но вид оказывается повернутым на 90 градусов). Когда переход заканчивается, он поворачивается к правильной ориентации. Мой код ниже.

- (IBAction)buttonTouched
{
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil];

    [UIView transitionFromView:self.view 
                        toView:aViewController.view 
                      duration:2 
                       options:UIViewAnimationOptionTransitionCurlUp 
                    completion:NULL];
}

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

РЕДАКТИРОВАТЬ: я также попытался добавить View Controller в файл IB self и перейти к этому представлению (думая, что это может быть слишком близко между инициализацией и переходом), но произошло то же самое.

1 Ответ

16 голосов
/ 01 марта 2011

Ну, главная причина в том, что self.view (который в настоящее время «знает», что вы находитесь в ландшафте) заменяется новым представлением, в котором нет этой информации.Поэтому одна мысль состоит в том, чтобы просто поместить aViewController.view как subView в self.view (при условии, что aViewController непрозрачен).Ах, вы говорите, но тогда я теряю хорошую анимацию transitionFromView.Что ж, попробуйте эту милость:

[UIView transitionWithView:self.view
                  duration:2 
                   options:UIViewAnimationOptionTransitionCurlUp
                animations:^{
                    [self.view addSubview:aViewController.view];
                } 
                completion:NULL];

Если по какой-то причине это не работает для вас, альтернативой является «научить» aViewController.view, что это действительно альбомная ориентация:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) / 180.0 * M_PI)
-(void)setNewViewToLandscape:(UIView*)viewObject {
     //assumes self.view is landscape and viewObject is portrait
     [viewObject setCenter:CGPointMake( self.view.frame.size.width/2,self.view.frame.size.height/2)];
     CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90));
     viewObject.transform = cgCTM;
     viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
}

 MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil];
[self setNewViewToLandscape:aViewController.view];

[UIView transitionFromView:self.view 
                    toView:aViewController.view 
                  duration:2 
                   options:UIViewAnimationOptionTransitionCurlUp 
                completion:NULL];

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

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