Проблема с использованием [window insertSubview] - PullRequest
0 голосов
/ 07 апреля 2011

Когда я использую следующий код для вставки вида поверх разделенного вида, у меня возникают проблемы с ориентацией.

Вот код, который я использую,

[window addSubview:aSplitViewController.view];
[window insertSubview:aViewController.view aboveSubview:aSplitViewController.view];

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

Я чувствую, что window insertSubview создает эту проблему, потому что, когда я использовал [window addSubview:aViewController.view] представление отображается должным образом в альбомном режиме с его компонентами также в альбомном режиме ...

Вот код, который, как мне кажется, вызывает у меня проблему

В моем делегате приложения

- (void) makeSplitViewController {

    NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];

    // First tabbbar item
    // detail view
    detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
    UINavigationController *navDetailView = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
    navDetailView.hidesBottomBarWhenPushed = YES;


    // root view
    rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];
    rootViewController.detailViewController = detailViewController;
    rootViewController.navigationItem.title = @"List";

    UINavigationController *navRootView = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];
    navRootView.hidesBottomBarWhenPushed = YES;
    navRootView.navigationBar.barStyle = UIBarStyleBlackTranslucent;

    splitViewController = [[UISplitViewController alloc] init];
    splitViewController.tabBarItem.title = @"Face Sheet";
    splitViewController.tabBarItem.image = [UIImage imageNamed:@"gear1.png"];
    splitViewController.navigationItem.title = @"Face Sheet";
    splitViewController.viewControllers = [NSArray arrayWithObjects:navRootView, navDetailView, nil];
    splitViewController.delegate = detailViewController;
    splitViewController.hidesBottomBarWhenPushed = YES;
    [controllers addObject:splitViewController];

    // Second tabbbar item
    scoreViewController = [[ScoreCardViewController alloc] initWithNibName:@"TableViewController" bundle:nil];
    scoreViewController.tabBarItem.title = @"Score Card";
    scoreViewController.tabBarItem.image = [UIImage imageNamed:@"gear1.png"];
    scoreViewController.navigationItem.title = @"Score Card";
    [controllers addObject:scoreViewController];

    tabBarController.viewControllers = controllers;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.
    // Create tabbar
    tabBarController = [[UITabBarController alloc] init];
    //tabBarController.delegate = self;

    // Set window
    [window addSubview:splashController.view];
    [window insertSubview:tabBarController.view belowSubview:splashController.view];
    [self.window makeKeyAndVisible];

    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;

    return YES;
}

и вот код в моем SplashScreenView

- (IBAction) proceedButtonClick:(id)sender
{
    // Initialize loginpopview
    PhysicianLoginViewController *loginViewController = [[PhysicianLoginViewController alloc] init];

    popOverController = [[UIPopoverController alloc] initWithContentViewController:loginViewController];
    popOverController.popoverContentSize = CGSizeMake(350, 200);
    popOverController.delegate = self;

    // Set a notification to dismiss it later
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginViewControllerDone:) name:@"loginViewControllerDone"  object:popOverController.contentViewController];

    // Present popover
    if ([popOverController isPopoverVisible])
    {
        [popOverController dismissPopoverAnimated:YES];
    }
    else 
    {

        [popOverController presentPopoverFromRect:CGRectMake(485, 600, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    }

}

// Dismiss popview controller and setup the tabbar
- (void)loginViewControllerDone:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    // Button in content view controller was tapped, dismiss popover...
    [self.popOverController dismissPopoverAnimated:YES];

    // remove subview
    [self.view removeFromSuperview];

    // set tabbar
    i3EAppDelegate *appDelegate = (i3EAppDelegate *) [[UIApplication sharedApplication]delegate];
    [appDelegate makeSplitViewController];

}

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

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Ваша проблема в том, что обработка вращения UIWindow и UIViewController просто не предназначена для такой работы. Квот документация :

В приложении для iOS объект окна выполняет большую часть работы, связанной с изменением текущей ориентации. Однако он работает совместно с контроллерами представления приложения, чтобы определить, должно ли вообще происходить изменение ориентации, и если да, то какие дополнительные методы следует вызывать для реагирования на изменение. В частности, он работает с контроллером представления, корневой вид которого был недавно добавлен или представлен в окне. Другими словами, объект окна работает только с самым передним контроллером вида, вид которого отображался с использованием одного из механизмов, описанных в разделе «Представление вида контроллера вида».

Этот параграф несколько расплывчатый и противоречивый (это самый последний добавленный контроллер представления или контроллер для самого верхнего представления?), И на практике, кажется, не обязательно совпадает с наблюдениями. Суть в том, что добавление нескольких видов в UIWindow приведет к нарушению автоматической обработки поворота.

Вы должны изменить свой код, чтобы использовать presentModalViewController:animated: (возможно, с modalPresentationStyle, установленным на UIModalPresentationFormSheet) или UIPopoverController вместо добавления нескольких подпредставлений в окно.

0 голосов
/ 30 марта 2012

Попробуйте:

[aViewController.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
...