UIView добавляет подписку после изменения ориентации: Сообщите представлению об изменении размера

У меня есть 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];

Спасибо!


person marimba    schedule 13.05.2011    source источник
comment
У меня была эта проблема с двумя морщинами: (1) я использовал управляемое представление, перо загружало UIVC; & (2) он появился только под iOS 4.3, а не 5.0. Метод yasirmturk исправил это для меня.   -  person Clay Bridges    schedule 05.01.2012


Ответы (4)


Часто файл 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];

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

person idz    schedule 14.05.2011
comment
Это работает! Большое спасибо! Отредактирую сообщение, чтобы отразить ваше решение. - person marimba; 14.05.2011
comment
Если бы вы хотели, вы могли бы быть действительно причудливыми и проверить маски автоизменения размеров и только одно измерение, но мне кажется, что большую часть времени в этих ситуациях вы хотите настроить оба. Я отправлю ссылку на это в другом вопросе. Рад, что у вас сработало! - person idz; 14.05.2011
comment
Я разработал представление ввода для многократного использования, и я собираюсь изменить show: to showOnViewController: (UIViewController *) vc, таким образом InputView может установить свой собственный фрейм. - person marimba; 14.05.2011
comment
Вы могли бы это сделать, но тогда, если вы когда-нибудь захотите, чтобы это было только частью более сложного представления, вам придется изменить свой код. Вот почему подклассы UIKit UIView не устанавливают свои собственные фреймы. Контроллер представления - это класс, который знает обо всем, что происходит на экране, которым он управляет. Это хорошая идея, чтобы все было под контролем. Просто мысль. - person idz; 14.05.2011
comment
У меня есть представление с контролем обзора именно с этой проблемой. Ответ yasirmturk - это тот, который у меня сработал. - person Clay Bridges; 05.01.2012

[self.view addSubview:viewSpinner];
viewSpinner.frame = self.view.frame;
[viewSpinner setNeedsLayout];

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

person yasirmturk    schedule 05.08.2011
comment
Я тоже, ср. комментарий к исходному сообщению. - person Clay Bridges; 05.01.2012

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

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

  • window
    • subviewcontroller

(вы реализовали shouldautorotate правильно, чтобы отвечать на требуемые ориентации)

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

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

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

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

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

person Phil K.    schedule 26.09.2011

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

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

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

person occulus    schedule 13.05.2011