Когда представления автоматически преобразуются на основе их суперпредставления? - PullRequest
3 голосов
/ 01 августа 2011

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

У меня есть следующий код в моем applicationDidFinishLaunching :, создающий 3 представления и добавляющий их какподпредставления окна:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    GLViewController* controller = [[GLViewController alloc] init];
    self.glViewController = controller;
    [controller release];

    glView = [[GLView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    glView.controller = glViewController;
    [glView stopAnimation];
    [window addSubview:glView];

    invisibleView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    invisibleView.alpha = 1.0;
    invisibleView.tag = 2;
    // By the definition of UIViewAutoresizing, 0x3F corresponds to resizing in every direction.
    invisibleView.autoresizingMask = 0x3F;
    obstaclesViewController = [[ObstaclesViewController alloc] init];
    obstaclesViewController.view = invisibleView;
    [window addSubview:invisibleView];

    viewController = [[GazeIntroViewController alloc] initWithNibName:@"GazeIntroViewController" bundle:[NSBundle mainBundle]];
    [viewController.view setFrame:[[UIScreen mainScreen] bounds]];
    [window addSubview:viewController.view];
    [window bringSubviewToFront:viewController.view];

    [window makeKeyAndVisible];

    NSLog(@"window: %@", [window description]);
    NSLog(@"window subviews: %@", [[window subviews] description]);
}

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

Что меня действительно сбивает с толку, так это то, что первый и второй вид выглядят нормально.Если я достану средний блок, где я добавляю invisibleView, то GazeIntroViewController также выйдет правильно.Из NSLogs я вижу, что у представлений, которые выходят правильно, автоматически применяется преобразование ([0, 1, -1, 0, 0, 0]), но Я не понимаю, почему применяется это преобразованиедля некоторых представлений, а не для других , когда их родитель является окном для всех из них.

Вывод, когда invisibleView не добавлен:

2011-07-31 21:00:51.271 GazeDemo[53515:207] window: <UIWindow: 0xa713ab0; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0xa713b90>>
2011-07-31 21:00:51.277 GazeDemo[53515:207] window subviews: (
"<GLView: 0x68bc350; frame = (0 0; 768 1024); layer = <CAEAGLLayer: 0x68bc4e0>>",
"<UIView: 0x68c3ce0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x68c2150>>"
)

Вывод, когда добавлен invisibleView:

2011-07-31 21:11:05.489 GazeDemo[53710:207] window: <UIWindow: 0x689d4d0; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0x689d5b0>>
2011-07-31 21:11:05.496 GazeDemo[53710:207] window subviews: (
"<GLView: 0x689cf50; frame = (0 0; 768 1024); layer = <CAEAGLLayer: 0x689dcb0>>",
"<UIView: 0x68a05f0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = LM+W+RM+TM+H+BM; tag = 2; layer = <CALayer: 0x68a06c0>>",
"<UIView: 0x6b484b0; frame = (0 0; 768 1024); autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x6b4bad0>>"
)

1 Ответ

0 голосов
/ 01 марта 2013

Все приложения запускаются только в портретном режиме, а затем в методе автоматического поворота UIViewController превращаются в ландшафт.

Итак, мы не можем изменить ориентацию MainWindow.xib. Вот почему, если вы добавите вид как подвид главного окна, он всегда будет в портретном режиме, и вы думаете, что он повернут на 90 градусов.

попробуйте добавить подпредставление на rootViewController.view как:

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

    // Some code    
     [self.window.rootViewController.view addSubview:YourView];
    //some code
}

и если вы используете контроллер навигации, используйте это:;

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

    // Some code    
     [self.navigationController.topViewController.view addSubview:YourView];
    //some code
}
...