Поверните UIViewController, чтобы противодействовать изменениям в UIInterfaceOrientation - PullRequest
1 голос
/ 22 марта 2010

Я много искал по этому поводу и не могу найти ничего, чтобы помочь мне.

У меня есть UIViewController, содержащийся в другом UIViewController. Когда родительский UIViewController вращается, скажем, из Portrait в LandscapeLeft, я хочу, чтобы это выглядело так, как будто ребенок не вращался. Так сказать. Я хочу, чтобы ребенок имел одинаковую ориентацию на небо независимо от ориентации родителей. Если он имеет UIB-кнопку, которая находится в вертикальном положении в Portrait, я хочу, чтобы правая сторона кнопки была "вверху" в UIInterfaceOrientationLandscapeLeft.

Возможно ли это? В настоящее время я делаю такие грубые вещи, как это:

-(void) rotate:(UIInterfaceOrientation)fromOrientation: toOr:(UIInterfaceOrientation)toOrientation
{
    if(((fromOrientation == UIInterfaceOrientationPortrait) && (toOrientation == UIInterfaceOrientationLandscapeRight))
       || ((fromOrientation == UIInterfaceOrientationPortraitUpsideDown) && (toOrientation == UIInterfaceOrientationLandscapeLeft)))
    {

    }
    if(((fromOrientation == UIInterfaceOrientationLandscapeRight) && (toOrientation == UIInterfaceOrientationPortraitUpsideDown))
       || ((fromOrientation == UIInterfaceOrientationLandscapeLeft) && (toOrientation == UIInterfaceOrientationPortrait)))
    {

    }
    if(((fromOrientation == UIInterfaceOrientationPortrait) && (toOrientation == UIInterfaceOrientationLandscapeLeft))
       || ((fromOrientation == UIInterfaceOrientationPortraitUpsideDown) && (toOrientation == UIInterfaceOrientationLandscapeRight)))
    {

    }
    if(((fromOrientation == UIInterfaceOrientationLandscapeLeft) && (toOrientation == UIInterfaceOrientationPortraitUpsideDown))
       || ((fromOrientation == UIInterfaceOrientationLandscapeRight) && (toOrientation == UIInterfaceOrientationPortrait)))
    {

    }
    if(((fromOrientation == UIInterfaceOrientationPortrait) && (toOrientation == UIInterfaceOrientationPortraitUpsideDown))
       || ((fromOrientation == UIInterfaceOrientationPortraitUpsideDown) && (toOrientation == UIInterfaceOrientationPortrait)))
    {

    }
    if(((fromOrientation == UIInterfaceOrientationLandscapeLeft) && (toOrientation == UIInterfaceOrientationLandscapeRight))
       || ((fromOrientation == UIInterfaceOrientationLandscapeRight) && (toOrientation == UIInterfaceOrientationLandscapeLeft)))
    {

    }   
}

, который выглядит как совершенно бесполезная трата кода. Кроме того, я планировал использовать CGAffineTransform (как указано здесь: http://www.crystalminds.nl/?p=1102), но я не уверен, стоит ли мне изменять размеры представления в соответствии с тем, что будет после поворота.

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

Я мог бы действительно помочь с этим, спасибо!

Ответы [ 2 ]

5 голосов
/ 22 марта 2010

Лучшее, что вы можете сделать, - это изменить кадры ваших подпредставлений в соответствии с ориентацией вашего интерфейса. Вы можете сделать это как:

 #pragma mark -
 #pragma mark InterfaceOrientationMethods

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
        //self.view = portraitView;
        [self changeTheViewToPortrait:YES andDuration:duration];

    }
    else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft){
        //self.view = landscapeView;
        [self changeTheViewToPortrait:NO andDuration:duration];
    }
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

- (void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration{

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:duration];

    if(portrait){
        //change the view and subview frames for the portrait view
    }
    else{   
        //change the view and subview  frames for the landscape view
    }

    [UIView commitAnimations];
}

Надеюсь, это поможет.

0 голосов
/ 25 августа 2010

я кое-что понял .. скажем, наш проект имеет несколько слоев ViewController (как если бы вы добавили подпредставление другого контроллера представления в свой контроллер представления)

willRotateToInterfaceOrientation: метод продолжительности не будет вызываться для второгослой ViewController ...

так что я сделал, после того, как я инициализировал свой контроллер представления 2-го уровня с самого верхнего слоя, затем, когда будет вызываться метод willRotateToInterfaceOrientation: duration на самом верхнем слое, я будуwillRotateToInterfaceOrientation: длительность для контроллера представления второго уровня

...