В ios, где находится подходящее место в контроллере представления для перемещения ваших подпредставлений для обработки вращений? - PullRequest
2 голосов
/ 02 августа 2011

В ios, где лучшее место в контроллере представления для перемещения ваших пользовательских подпредставлений для обработки вращений? (конечно, это только для тех, где флаги autoresizing не помогают).

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

  • willAnimateRotationToInterfaceOrientation: продолжительность

Это работает, и любые сделанные вами изменения в рамке подпредставления хорошо анимируются, когда устройство поворачивается по горизонтали <-> портрет. Однако, если вы находитесь в контроллере вкладок, он не вызывается, когда виден другой VC. И поэтому, если вы поверните и вернетесь к этой вкладке, она будет иметь неправильный макет.

  • viewWillAppear

Не очень помогает, потому что это вызывается до того, как вращение вступает в силу, поэтому при доступе к self.view.frame вы получаете размер перед вращением, поэтому вы не можете знать, будем ли мы ориентироваться на пейзаж или портрет

  • viewDidAppear

Это лучше, чем viewWillAppear, однако, поскольку он вызывается после того, как представление появляется на экране, вы видите вспышку контента в неправильной компоновке, прежде чем она перевернется.

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

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

У меня обычно есть свой собственный метод layoutViewsForOrientation:(UIInterfaceOrientation), который я вызываю как из willAnimateRotationToInterfaceOrientation:duration (чтобы получить хорошие анимации, которые вы упомянули), так и из моего viewWillAppear: (с self.interfaceOrientation), чтобы настроить мой вид до его появления,

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

2 голосов
/ 02 августа 2011

По моему опыту, проблема в том, что если UIViewController не виден, он не будет вращаться.Вы можете иметь 3 вкладки, каждая с отдельным UIViewController (A, B и C).Если вы находитесь в A и вращаетесь, B и C не будут.Я решил это, имея UIViewController (давайте назовем его D) для хранения UITabBarController, затем в этом UIViewController у меня есть ссылка на каждый UIViewController (A, B и C), поэтому я просто вызываюwillAnimateRotationToInterfaceOrientation:duration метод для каждого UIViewController, когда вращается D.Работает очень хорошо для меня.:)

0 голосов
/ 02 августа 2011

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

- (void)doMyResizing {
    self.somesubview.frame = ...
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self doMyResizing];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self doMyResizing]; // This is for the case when the person uses this tab in portrait, changes to another tab, rotates to landscape, and switches back to this tab
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self doMyResizing]; // This is for the case when the person uses this tab in portrait, changes to another tab, rotates to landscape, and switches back to this tab
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...