iOS ›› Замена пера при изменении ориентации устройства

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

Что-то вроде этого:

введите здесь описание изображениявведите здесь описание изображения

Я хочу, чтобы оба файла Nib принадлежали одному и тому же контроллеру представления, поэтому они реагируют на одни и те же IBActions, IBOutlets и т. д.

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

Пример Apple для этого сценария проблематичен, так как для этого действия используется переход. Если, например, VC является частью стека контроллера навигации, будет очень проблематично реагировать на нажатие кнопки «Назад» — вместо того, чтобы просто извлекать VC, мне придется вытолкнуть 2 VC (я думаю):

введите здесь описание изображения

Интуитивно я думаю о замене файла Nib (а не о выполнении Segue).

Правомерно ли это действие?

Если да, то как мне выполнить это в коде?

Кроме того, это можно сделать в раскадровке или мне нужно использовать файл .xib?


person Ohad Regev    schedule 17.03.2014    source источник


Ответы (3)


Автомакет идеально подходит для этого сценария, «единственная» проблема заключается в том, что вы не можете сделать это в редакторе раскадровки, а в коде. Я действительно предлагаю вам книгу, в которой есть такая же проблема. Erica Sadun Autolayout demistified.
Подход состоит в том, чтобы иметь разные наборы ограничений, один для альбомной и одной портретной ориентации, удаляя и устанавливая их поочередно, но, возможно, лучше всего было бы просто изменить их приоритеты.
Изменение xib кажется более простым решением, но, по моему мнению, это менее удобные варианты.
Вы должны:

  • создайте 2 xib: один для портрета, другой для ландшафта
  • в xib контроллера представления создайте представление контейнера с масками или ограничениями автоматического изменения размера, которые будут растягивать его в соответствии с изменениями основного вида.
  • в методе контроллера представления - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration поменять местами 2 вида. так как это завернуто в блок анимации, вы можете просто понизить альфу на одном, включить на другом и удалить

Посмотрите здесь

person Andrea    schedule 17.03.2014

Вы можете сделать что-то вроде этого:

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation devOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(devOrientation) && !self.viewIsLandscape ) {
        [self presentModalViewController:self.landscapeVC animated:YES];
        self.viewIsLandscape = YES;
    } else if (UIDeviceOrientationIsPortrait(devOrientation) &&
               self.viewIsLandscape)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.viewIsLandscape = NO;
    }
}

Ссылка: http://www.edumobile.org/iphone/iphone-programming-tutorials/orientation-changes-for-iphone/

Надеюсь, что это поможет вам...

person Vinay Bagale    schedule 17.03.2014

Вы можете создать два отдельных UIView внутри одного XIB вместо двух разных XIB. И вы можете изменить вид на основе изменения ориентации.

person Pooja M. Bohora    schedule 17.03.2014
comment
Создайте два разных вида для обеих ориентаций. Измените вид в методе ориентации willrotate/didrotation. Надеюсь, это прояснит мою точку зрения. - person Pooja M. Bohora; 17.03.2014