Создание альтернативного ландшафтного интерфейса iPad - PullRequest
1 голос
/ 09 апреля 2011

Во время моих последних проектов я использовал некоторые методы для создания альтернативного ландшафтного представления при разработке моих ориентированных подклассов UIViewController, таких как свойства AutosizingMask и добавление дополнительного кода в некоторые методы layoutSubviews. Но теперь я хотел бы позволить дизайнеру моей компании работать с текущим проектом, просто отредактировав некоторые файлы XIB, и для этого, я думаю, мне понадобятся два viewController, связанных с их файлом XIB для каждого ориентированного на приложение представления.

Итак, я начал читать документ Руководство по программированию контроллера View для iOS: http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26 и посмотрел на этот пример кода Apple AlternateViews: http://developer.apple.com/library/ios/#samplecode/AlternateViews/Introduction/Intro.html

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

  • MyLoadingView * Base * ViewController - базовый класс, который хранит логику и ее IBOutlets, являясь fileOwner следующих XIB.

  • MyLoadingView * Portrait * ViewController - который наследует MyLoadingViewBaseViewController выше и имеет персонализированный портретный вид в MyLoadingViewPortraitViewController.xib

  • MyLoadingView * Landscape * ViewController - который также наследует MyLoadingViewBaseViewController и имеет персонализированный ландшафтный вид в MyLoadingViewLandscapeViewController.xib.

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

@interface MyLoadingViewPortraitViewController : MyLoadingViewBaseViewController {

    BOOL _isShowingLandscapeView;
    MyLoadingViewLandscapeViewController *_landscapeViewController;

} @end

И когда устройство поворачивается, экземпляр книжного представления должен представлять экземпляр ландшафта, поверх него есть модальное представление:

- (void)orientationChanged:(NSNotification *)notification
{

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !_isShowingLandscapeView)
    {

        [self presentModalViewController:self.landscapeViewController
                                animated:NO];
        _isShowingLandscapeView = YES;

    }

    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
             _isShowingLandscapeView)
    {

        [self dismissModalViewControllerAnimated:NO];
        _isShowingLandscapeView = NO;

    }
}

Это работает, но давайте поговорим о некоторых проблемах:

  1. По умолчанию анимация вращения iPad не отображается, представления неожиданно меняются, что приводит к нежелательным впечатлениям для пользователя. При попытке исправить это я нашел в примере кода AlternateViews строки ниже.

    - (void)orientationChanged:(NSNotification *)notification
    {
        // We must add a delay here, otherwise we'll swap in the new view    
        // too quickly and we'll get an animation glitch
        [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
    }
    

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

  2. Мне неудобно использовать модальный вид презентации. Подумайте о попытке повернуть представление, которое в настоящее время определено как детализированный контроллер представления, в UISplitViewController. Если подробный вид реализует этот код, после поворота устройства он появится поверх разделенного вида. (Может быть, добавление в качестве подпредставления может быть другим решением. Кто-то из вас пробовал это сделать?)

  3. Почему бы не использовать методы UIViewController «Отвечая на события вращения представления» вместо прослушивания UIDeviceOrientationDidChangeNotification. (Когда горизонтальный вид является передним видом над окном, он получит те методы события поворота и может повторно отправить его в портретный вид, который продолжит управлять им.)

Наконец, я буду благодарен за любые ответы, советы или примеры кодов за создание ориентированного представления. Заранее спасибо.

...