Два NIB, одни и те же объекты (iPhone) - PullRequest
1 голос
/ 24 марта 2011

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

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)x  
                                     duration:(NSTimeInterval)duration{

 CGRect bounds = [[self view] bounds]; 

 if (UIInterfaceOrientationIsPortrait(x)) {
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 194)];
 } 
 else { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 110)];
 }

}

Я устанавливаю положение каждого объекта в обеих ориентациях. Это похоже на ужасный способ достижения моей цели ..

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

Как бы я назвал перо для вращения? Могу ли я использовать одни и те же объекты с одинаковыми IB-соединениями?

Есть ли лучший способ?

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

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

  1. Найдите набор правил, которые позволяют поддерживать обе ориентации, используя только autoresizingMask и autoresizesSubviews.

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

  3. Иметь два подпредставления, одно длякаждая ориентация.Скрыть один, когда вы вращаетесь.Это позволяет настраивать переходы между подпредставлениями, которые вы не получите, если загрузите новый кончик и замените корневой вид.Если вы загружаете каждое подпредставление из его собственного пера, вы можете выгрузить то, что больше не видно, чтобы уменьшить использование памяти.Затем вам необходимо убедиться, что оба представления отображают одно и то же состояние, запускать одни и те же IBActions и иметь дополнительные ссылки на IBOutlet (или тщательно захватывать состояние из ваших текущих IBOutlets, прежде чем связывать их, загружая новое подпредставление из пера), чтобы вы могли установить атрибутыэквивалентные виды в каждом повороте.

  4. Объедините варианты 2 и 3 выше, чтобы загрузить разные виды с различными режимами компоновки для каждого поворота и перетасовывать подпредставления между ними.

1 голос
/ 10 мая 2012

Это гораздо более простой способ - два NIB, использующие соглашение об именовании Apple. Я подозреваю, что в iOS 6 или 7 Apple может добавить это как «функцию». Я использую его в своих приложениях, и он отлично работает:

  1. срабатывает при повороте воли (ждет, пока не начнется анимация вращения)
  2. использует соглашение об именовании Apple для файлов ландшафта / портрета (Default.png равно Default-landscape.png, если вы хотите, чтобы Apple автоматически загружала альбомную версию)
  3. перезагружает новый NIB
  4. , который сбрасывает self.view - это автоматически обновит дисплей
  5. и затем он вызывает viewDidLoad (Apple НЕ будет вызывать это для вас, если вы вручную перезагрузите NIB)

(NB stackoverflow.com требует это предложение здесь - в модуле форматирования кода есть ошибка)

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if( UIInterfaceOrientationIsLandscape(toInterfaceOrientation) )
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidLoad];
    }
    else
    {
        [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil];

        [self viewDidLoad];
    }
}
...