Универсальный двоичный файл iOS — переключение ModalPresentationStyle

Я обычно делаю приложения для iPhone; сегодня я пытаюсь создать интерфейс для приложения (универсальный двоичный файл). Проблема в том, что у меня есть экраны с несколькими элементами управления, и я хотел бы адаптировать интерфейс с помощью UIModalPresentationFormSheet. Но после экрана, в котором используется такая презентация, я хотел бы вернуться в полноэкранный режим (используя тот же навигационный контроллер).

Изначально в части iPhone у меня есть UINavigationController -> субконтроллеры. Поскольку это контроллеры того же класса, я хотел бы сохранить аналогичную архитектуру для iPad. В настоящее время я делаю следующее UINavigationController -> ModalController -> UINavigationController -> субконтроллеры. Но, как объяснялось выше, субконтроллеры должны иметь возможность переключаться с FormSheet на полноэкранный режим с панелью навигации вверху. Я использую раскадровку.

И, как я знаю, я не очень хорош для объяснений, вот скриншот, который должен прояснить мою проблему: https://dl.dropbox.com/u/9858108/stack_overflow_iPad_nav_issue.jpg


person SlumTheSlug    schedule 17.07.2012    source источник


Ответы (1)


Хорошо, я нашел грязное решение, но это решило проблему. У меня есть следующая конфигурация NavigationController -> UIViewController -[Modal]-> UINavigationController -> UIViewController1 -[Push]-> UIViewController2 (см. скриншот выше).

Теперь идея состоит в том, чтобы изменить размер ModalView (я использую ландшафтный режим, поэтому портрет не поддерживается, но вы можете легко изменить код). У меня есть класс singletton, который содержит полезные методы, я назвал AppKit. В AppKit.m:

#pragma mark - Window functions (modal, ...)

/**
 * Cette méthode redimmensionne une modal view en type PaperSheet.
 * Utilisé dans le viewDidAppear du controller enfant.
 * Permet de mettre des modal view en fullscreen.
 *
 * @param id viewController Le viewController parent
 */
- (void)resizeModalToPaperSheet:(id) viewController {
    // Adaptation de la taille de la fenêtre pour iPad
    if (isIPad) {
        [viewController navigationController].view.superview.center = CGPointMake(0.0f, 0.0f);
        [viewController navigationController].view.superview.frame = CGRectMake(84.0f, 242.0f, 540.0f, 540.0f);
    }
}

/**
 * Cette méthode redimmensionne une modal view en type FullScreen.
 * Utilisé dans le viewDidAppear du controller enfant.
 * Permet de mettre des modal view en fullscreen.
 *
 * @param id viewController Le viewController parent
 */
- (void)resizeModalToFullScreen:(id) viewController {
    // Adaptation de la taille de la fenêtre pour iPad
    if (isIPad) {
        [viewController navigationController].view.superview.center = CGPointMake(0.0f, 0.0f);
        [viewController navigationController].view.superview.frame = CGRectMake(20.0f, 0.0f, 754.0f, 1024.0f);
    }
}

Теперь в моих подчиненных контроллерах мне нужно вызвать метод два раза (иначе, когда вы нажимаете назад, размер модального представления сохраняется от предыдущего контроллера, поэтому вы должны поместить его в viewDidAppear).

ViewController 1 (размер листа бумаги):

-(void) viewWillAppear:(BOOL)animated {
    [[AppKit sharedInstance] resizeModalToPaperSheet: self];
}

-(void) viewDidAppear:(BOOL)animated {
    [[AppKit sharedInstance] resizeModalToPaperSheet: self];
}

ViewController 1 (полноэкранный размер):

-(void) viewWillAppear:(BOOL)animated {
    [[AppKit sharedInstance] resizeModalToFullScreen: self];
}

-(void) viewDidAppear:(BOOL)animated {
    [[AppKit sharedInstance] resizeModalToFullScreen: self];
}

И это работает очень хорошо; Я могу легко переключаться между полноэкранным режимом и PaperSheet. Теперь осталась одна проблема: на раскадровке представление все еще маленькое, и добавить внутрь что-то непросто. Итак, вы должны сделать это: 1/В раскадровке щелкните контроллер представления, который является маленьким (значок коробки) 2/На панели атрибутов установите размер на полноэкранный режим iPad.

Надеюсь, это поможет, любые комментарии о том, как улучшить код, приветствуются :)

person SlumTheSlug    schedule 18.07.2012