Как загрузить другой XIBs для различных ориентаций устройства для того же viewcontroller?

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

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

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

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

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

7
задан Cœur 2 June 2019 в 15:57
поделиться

1 ответ

Я создаю свои экземпляры 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 различных объектов subview, в зависимости от ориентации устройства:

- (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: , чтобы подпредставления более плавно перемещались из одного центра в другой. Но на данный момент все вышесказанное работает для меня.

1
ответ дан 7 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: