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

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

[window addSubview:aSplitViewController.view];
[window insertSubview:aViewController.view aboveSubview:aSplitViewController.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];

}

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

1 Ответ

2 голосов
/ 07 апреля 2011

UIWindow имеет подпредставление, которое оно использует для поворотов и помещает в него другие представления. Вам нужно вставить себя в корневой вид (или что-то более низкое), а не в окно. Посмотрите на -[UIWindow rootViewController].

UIView *rootView = [[[self window] rootViewController] view];
[rootView addSubview:view];

Это будет работать до тех пор, пока вы используете что-то с контроллером корневого представления. Это будет работать до тех пор, пока rootViewController не nil. Если вы работаете с «сырым» приложением, основанным на представлении, то обычно лучше выбрать другое представление и добавить свое представление в качестве родственного, а не копаться в недокументированной иерархии:

UIView *sibling = ... (some other view)
[[sibling superview] addSubview:view];
...