Как загрузить разные XIB для разных ориентаций устройства для одного и того же viewcontroller? - PullRequest
7 голосов
/ 21 апреля 2010

В документации говорится, что если я хочу поддерживать как книжную, так и альбомную ориентацию, у меня есть два основных способа сделать это:

  1. Настройте представление viewcontroller так, чтобы подпредставления автоматически меняли размер и вносили меньшие изменения программно во время выполнения
  2. Если изменения более существенны, создать альтернативный ландшафтный интерфейс и нажать / выдвинуть альтернативный модальный viewcontroller во время выполнения

Я хотел бы представить информацию, где компоновка существенно отличается, но логика та же. В идеале, я бы загрузил другую XIB для того же viewcontroller, но, похоже, это не вариант.

Похоже, что # 2 - это то, что мне нужно сделать, но моя проблема с этим заключается в том, что, похоже, он будет использовать стандартные анимации modalviewcontroller, которые не похожи на анимацию вращения устройства. (Конечно, будучи ленивцем, я не проверял эту гипотезу.)

Итак, как мне загрузить альтернативный макет для ландшафта с тем же контроллером вида, но с другой XIB? Должен ли я использовать метод № 2 выше, и является ли анимация вращения естественной? Или есть другой способ?

1 Ответ

1 голос
/ 21 апреля 2010

Я создаю экземпляры UIView в -viewDidLoad: и добавляю их в качестве подпредставлений в свойство view контроллера представления:

- (void) viewDidLoad {
    [super viewDidLoad];

    self.myView = [[[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 280.0f, 210.0f)] autorelease];
    // ...
    [self.view addSubview:myView];
}

Затем я звоню -viewWillAppear:, чтобы центрировать эти подпредставления:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
}

Я также переопределяю -willRotateToInterfaceOrientation:duration:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration {
    [self adjustViewsForOrientation:newInterfaceOrientation];
}

Метод -adjustViewsForOrientation: устанавливает центр CGPoint различных объектов подпредставления в зависимости от ориентации устройства:

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        myView.center = CGPointMake(235.0f, 42.0f);
        // ...
    }
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
        myView.center = CGPointMake(160.0f, 52.0f);
        // ...
    }
}

Когда загружен контроллер вида, экземпляры UIView создаются и позиционируются на основе текущей ориентации устройства. Если впоследствии устройство поворачивается, виды перецентрируются в новые координаты.

Чтобы сделать это более плавным, в -adjustViewsForOrientation: можно было бы использовать анимацию с помощью клавиш, чтобы подвиды более плавно перемещались из одного центра в другой. Но вышесказанное работает для меня, пока.

...