Автоориентация в iPhone - PullRequest
       3

Автоориентация в iPhone

0 голосов
/ 12 сентября 2011

Я использовал UIDeviceOrientationDidChangeNotification, чтобы получать уведомления о ландшафтном и портретном режиме. В моем проекте мне необходимо изменить позиции UIControls, размещенные на UIView соответственно. Нужно ли менять размер кадра вручную для каждого UIControl, так как это беспокойство?

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

В вашем контроллере представления вы должны реализовать метод:

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

Этот метод должен возвращать YES для поддерживаемых ориентаций.

Если вы хотите, чтобы размер ваших подпредставлений изменялся и изменялся автоматически, вам следует установить соответствующее свойство autoresizingMask для этих представлений. Например:

blackView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight |
                                 UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | 
                                 UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
0 голосов
/ 12 сентября 2011

Вам нужно использовать метод shouldAutorotateToInterfaceOrientation ..., но вам нужно сделать немного больше, прежде чем он будет работать должным образом. Прежде всего, вам понадобятся два файла XIB, один для альбомной ориентации и один для книжной ориентации. Затем вам нужно будет использовать вашу функцию следующим образом:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft){
    //prepare for a Landscape view
    }
else{
    //prepare for a portrait view
    }
    return YES;
}

Что касается подготовки к пейзажному или портретному просмотру, может сработать использование авторазмера, но вам может потребоваться иметь полностью отдельные xibs. Я не смог найти способ изменить xib в активном контроллере представления, поэтому я бы предложил создать отдельный экземпляр вашего контроллера представления. Пример:

Когда вы представите свой первый экземпляр viewController, представьте его с портретным символом xib. Вам также может понадобиться логическое значение, чтобы отслеживать текущий XIB. Затем выполните этот код:

/*Assuming you are using a viewcontroller called viewController, and you have a boolean called xibPortrait.
You have presented this view controller using the portrait xib.
You also have a landscape xib, Landscape.xib
*/

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ((interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft) && xibPortrait){
        xibPortrait = FALSE;
        viewController *Land = [[ViewController alloc] initWithNibName:@"Landscape" bundle:nil];
        [self presentModalViewController:Land animated:NO];
        [Land release];
    }
else if(!xibPortrait){
    [self.parentViewController dismissModalViewControllerAnimated:NO];
    xibPortrait = TRUE;
    }
return YES;
}


//This should work but if you can, you should try to use Autoresizing.

EDIT: Я также нашел это, что кто-то отправил на один из моих вопросов. Это может помочь вашему приложению работать более эффективно, чем при использовании моего метода выше: http://aseriesoftubes.com/articles/ipad-development-101-orientation/

...