Как реализовать splitview для iPhone OS 4.2? - PullRequest
0 голосов
/ 12 ноября 2010

В моем приложении используется пользовательский splitview.

пользовательский файл splitview .h файл

@interface CustomUISplitViewController :UISplitViewController {

BOOL keepMasterInPortraitMode;
BOOL  keepMasterInPortraitMode1;
 }

и .m файл

-(void) viewWillAppear:(BOOL)animated {

    keepMasterInPortraitMode1=keepMasterInPortraitMode;
    if(keepMasterInPortraitMode1 == NO) {
        if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
            UIViewController* master = [self.viewControllers objectAtIndex:0];
            UIViewController* detail = [self.viewControllers objectAtIndex:1];
            [self setupPortraitMode:master detail:detail];      
        }
    }

    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        UIViewController* master = [self.viewControllers objectAtIndex:0];
        UIViewController* detail = [self.viewControllers objectAtIndex:1];
        [self setupPortraitMode:master detail:detail];
      } 
     }
}

 - (void)setupPortraitMode:(UIViewController*)master detail:(UIViewController*)detail {
    //adjust master view
    CGRect f = master.view.frame;
    f.size.width = 220;
    f.size.height = 1024;
    f.origin.x = 0;
    f.origin.y =0;

    [master.view setFrame:f];

    //adjust detail view
    f = detail.view.frame;
    f.size.width = 548;
    f.size.height = 1024;
    f.origin.x = 221;
    f.origin.y = 0;

    [detail.view setFrame:f];
}

Это работает правильно под iOS4.0, но под 4.2 я вижу только одно представление при запуске приложения. Что может измениться между версиями ОС?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

У меня была точно такая же проблема с моими приложениями.Я использовал одну и ту же технику создания подклассов, чтобы мастер и детали были видны как в портретном, так и в ландшафтном режимах.Работал отлично до 4.2, который, к сожалению, я не проверял, когда были доступны бета-версии.

Я рекомендую попробовать отличный MGSplitViewController (http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad). Это реализация UISplitViewController с открытым исходным кодом.Единственным недостатком является то, что его не так просто использовать в Интерфейсном Разработчике, но он включает в себя пример проекта. Визуально он идентичен UISplitViewController, но добавляет поддержку нескольких дополнительных функций, таких как перетаскивание позиции разделения во время выполнения.

Просто реализуйте его точно так же, как ваш UISplitViewController, но добавьте куда-нибудь следующую строку:

[splitViewController setShowsMasterInPortrait:YES];

Это очень похоже на Частный API, который Apple запрещает использовать с их версией.

//[splitViewController setHidesMasterViewInPortrait:NO];  // Naughty, Naughty, Not allowed by the Apple police
0 голосов
/ 16 ноября 2010

У меня возникла та же проблема, и я считаю, что это ошибка Apple (я подал ее месяц назад без ответа от них.) Для меня это был именно «подробный» вид, который был пустым при запуске приложения в ориентации UIInterfaceOrientationLandscapeRight (3). Это будет выглядеть так: http://d.pr/cGcU. Это произойдет, когда я ограничу один из двух контроллеров представления (скажем, RootViewController) только в альбомной ориентации:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

При этом во время инициализации подробного представления произойдет следующее:

2010-11-15 20:17:47.792 MultipleDetailViews[96250:207] firstDetailViewController willAnimateRotationToInterfaceOrientation: 3 (landscape)
2010-11-15 20:17:47.792 MultipleDetailViews[96250:207] self.view.hidden is: 0
2010-11-15 20:17:47.799 MultipleDetailViews[96250:207] rotating...
2010-11-15 20:17:47.848 MultipleDetailViews[96250:207] firstDetailViewController didRotateFromInterfaceOrientation
2010-11-15 20:17:47.849 MultipleDetailViews[96250:207] self.view.hidden is: 1

По какой-то причине подробное представление таинственно скрывалось при повороте на ориентацию 3. Пока Apple не исправит эту ошибку (в 3.2 это не происходит), мой обходной путь в настоящее время заключается в переопределении следующего метода в контроллере подробного представления -отображение вида после завершения вращения:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    self.view.hidden = NO;
}

РЕДАКТИРОВАТЬ : Если ваш подробный вид не является прямым подпредставлением splitViewController.view (например, вы используете UINavigationController), вам нужно будет установить hidden в самом верхнем представлении на сторона детали в пределах UISplitViewController:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    // Make sure you set splitViewController via an outlet or get it via your AppDelegate
    for (UIView *splitViewChild in splitViewController.view.subviews)
        splitViewChild.hidden = NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...