UIView добавляет Subview после изменения ориентации: указать вид, чтобы изменить размер - PullRequest
7 голосов
/ 13 мая 2011

У меня есть UIView в качестве XIB в портретном режиме.

Это представление программно добавляется в контроллер вида, например так:

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
    InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
    [self.view addSubview:inputView];

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

Однако, если ориентация уже альбомная, и я создаю вид после изменения ориентации, он имеет начальное значениепортретная ориентация.

Есть ли способ указать виду, чтобы инициализировать или изменить его размер для портрета, используя его маски?

Заранее спасибо за любой ответ!

РЕДАКТИРОВАТЬ: Используя предложенияOcculus и Inder Kumar Rathore (спасибо, ребята!), я изменил код так:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];

К сожалению, никаких изменений нет.Я думаю, что я нашел кого-то, кто задавал тот же вопрос:

При добавлении вспомогательного представления размер не изменяется, если приложение находится в альбомном режиме

Ответ определяет проблемуправильно, но не очень обнадеживает ... Конечно, я мог бы создать два кончика или изменить размер кадра, но это кажется настолько противоречащим идее автоматического изменения размера.Мне трудно поверить в то, что после пробуждения невозможно определить перо и добавить его в представление для использования его функций автоматического изменения размера ... что-то, что работает безупречно, когда устройство вращается.

РЕДАКТИРОВАТЬ 2:

Решение idz работает:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

Спасибо!

Ответы [ 4 ]

19 голосов
/ 14 мая 2011

Часто файл NIB / XIB содержит UIViewController, который позаботится обо всем этом.В этом случае, поскольку у них нет контроллера представления (в NIB / XIB), вам необходимо взять на себя его обязанности после загрузки.

Вызов layoutSubviews напрямую или косвенно через setNeedsLayout или layoutIfNeeded не принесет вам большой пользы, поскольку реализация по умолчанию ничего не делает.

Предполагая, что вы хотите, чтобы представление ввода заполнялов рамках self.view вы делаете следующее:

InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];

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

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

Я не знаю, если у вас все еще есть эта проблема.

Допустим, у вас есть следующая архитектура:

  • окно
    • subviewcontroller

(вы ввели правильность ответа для ответа на требуемые ориентации)

В этот субконтроллер вы хотите добавить представления новых контроллеров UIViewController, просто вызвав функцию addSubview.

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

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
  self.newUIViewController.view.frame = self.view.bounds;
}

didRotateFromInterface ... вызывается после shouldRotate. В этой функции границы уже установлены правильно.

Таким образом, вам не нужно так много манипуляций с кодом.

1 голос
/ 05 августа 2011
[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

Это работает для меня (Y)

0 голосов
/ 14 мая 2011

См. Этот связанный вопрос:

Когда маски автоматического изменения размеров вступают в силу в iOS?

Итак, после загрузки нового представления из пера и добавления в качестве подпредставленияна self.view, попробуйте позвонить setNeedsLayout.

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