iPad / iPhone - лучшая практика? - PullRequest
4 голосов
/ 23 ноября 2010

Я хотел бы преобразовать свои представления в работу для любой ориентации (особенно, поскольку это рекомендуется для iPad).Я использовал IB, чтобы выложить вещи, и я не уверен, как лучше действовать.

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

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

Что другие для этого делают?Они просто проектируют свои представления так, чтобы флаги UIViewAutoResizing могли обрабатывать вращения должным образом?Есть ли у них несколько видов для каждой ориентации и как-то плавно их выключать?

Ответы [ 3 ]

5 голосов
/ 05 февраля 2011

Я нашел информацию здесь (и где-либо еще в StackOverFlow по этой теме), и это заставило меня задуматься о моем предыдущем ответе.Это просто утомительно, если у вас много объектов верхнего уровня.

Затем мне пришло в голову, что вы можете создать «вспомогательный» объект, поэтому я создал проект, чтобы продемонстрировать эту технику.По сути, у помощника есть выход для каждого интересующего объекта в представлении.В самом ViewController есть два объекта Helper (один для p, один для l), и вы создаете их в NIB.При изменении ориентации вы переключаете указатель помощника контроллера представления на соответствующий помощник, а затем обновляете self.view.Это действительно просто (этот текст сложнее).

Итак, как бы вы начали?Ну, это помогает, если вы знаете, априори, что вам нужно два отдельных представления.Как только вы это узнаете, возьмите шаблон Helper в ссылочном проекте ниже, адаптируйте его, добавьте в NIB, а затем подключите справку к соответствующим объектам в портретном виде.У самого View Controller есть только ссылка на два помощника и указатель "curHelper".Ивары Helper общедоступны, поэтому View Controller может ссылаться на такие элементы, как "curHelper-> label1.text = ... - стоимость - разыменование одного указателя (можно просто использовать свойства - ваш вызов).

Кроме того, вы можете напрямую подключить IBActions из объектов в любом представлении. Итак, давайте пройдемся по этому:

  • создаем NIB
  • создаем объект Helper и создаем его в nibпод названием Portrait
  • добавьте все IBOutlets к объекту Helper, обработайте затем в dealloc, viewWillUnload
  • поместите IBActions как обычные в контроллере вида
  • подключите NIB - Helper-> Портретные розетки, действия с контроллером вида
  • заставить все это работать в Портрет
  • добавить новый объект Helper, назовите его Пейзаж
  • дублировать текущий портретный вид, повернутьи сохраните его
  • подключите выходы помощника к новому пейзажному виду (действия уже заданы для вас!)

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

Контроллеру представления необходимо отправлять «viewDidUnload» обоим помощникам, когда он его получает, и освобождать помощников (которые затем освобождают их розетки).

ПРИМЕЧАНИЕ: я просто собрал это, чтобы посмотреть, как это выглядело.Если вы хотите увидеть код и действительно небольшую демонстрацию, вы можете скачать ее с общедоступного dot me dot com slash dhoerl, в папке iPhone с именем Helpers.zip.Я обновлю это и этот текст, если потребуется.

5 голосов
/ 23 ноября 2010

Вы можете создать два отдельных представления в одной и той же XIB, а затем реализовать следующий код:

К @interface

IBOutlet UIView *landscapeView;
IBOutlet UIView *portraitView;

и @implementation

- (void) viewDidLoad {
self.view.frame = [[UIScreen mainScreen] applicationFrame];
  landscapeView.autoresizesSubviews = NO;  <- IMPORTANT!
  portraitView.autoresizesSubviews = NO;   <- IMPORTANT!
}
- (BOOL)shouldAutorotateToInt .... {
  if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight) self.view = landscapeView;
  else if ((interfaceOrientation == UIInterfaceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) self.view = portraitView;
  return YES;
}
0 голосов
/ 05 февраля 2011

Глядя на приведенный выше код, используя два представления - мне это нравится. Чтобы ответить на замечание «теперь я должен поддерживать две ссылки - ну, не существует обходного пути - используйте« ссылки »(мой термин).

Назовите представления и выходы с префиксами l и p, затем определите "псевдо" ивары с базовыми именами, которые вы используете сейчас. Когда вы впервые используете viewDidLoad (или где-либо еще), установите для всех псевдо-иваров переменную l или p. Когда вы переключаете ориентацию, вы просто устанавливаете псевдонастройки в другую ориентацию (вместе с другими операциями).

В viewDidUnload и dealloc ссылаются только на элементы l и p - «настоящие» IBOutlets - и просто обнуляют псевдо-ivars. Сделайте это еще более уродливым - l_no_no_no_ или что-то перед реальными IBOutlets, чтобы вы случайно не использовали его.

Если вы задаете свойства псевдо-ivars, используйте ASSIGN, а не RETAIN !!!

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