Контроллер модального вида для iPad, действующий в портретном режиме

У меня возникли трудности с представлением ModalViewController в ландшафтном режиме. В основном это проявляется в правильной ориентации интерфейса и вращается только тогда, когда устройство удерживается в ландшафтном режиме, но контроллер вида действует так, как будто он находится в портретном режиме.

Я представляю модал вот так

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];

    LoginViewController *lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]];
    [self.window.rootViewController presentModalViewController:lvc animated:NO];

    return YES;
}

В LoginViewController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    NSLog(@"%@",NSStringFromCGRect(self.view.frame));
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}    

Результаты журнала после нескольких вращений:

2012-03-06 13:51:49.308 OrientationTest[3132:207] {{0, 0}, {1024, 748}}
2012-03-06 13:51:49.310 OrientationTest[3132:207] {{0, 0}, {1024, 748}}
2012-03-06 13:51:49.310 OrientationTest[3132:207] {{0, 0}, {1024, 748}}
2012-03-06 13:51:49.310 OrientationTest[3132:207] {{0, 0}, {1024, 748}}
2012-03-06 13:51:49.313 OrientationTest[3132:207] {{0, 20}, {1024, 748}}
2012-03-06 13:51:49.314 OrientationTest[3132:207] {{0, 0}, {748, 1024}}
2012-03-06 13:51:49.315 OrientationTest[3132:207] {{20, 0}, {748, 1024}}
2012-03-06 13:51:50.991 OrientationTest[3132:207] {{20, 0}, {748, 1024}}
2012-03-06 13:51:50.991 OrientationTest[3132:207] {{20, 0}, {748, 1024}}
2012-03-06 13:51:51.647 OrientationTest[3132:207] {{20, 0}, {748, 1024}}
2012-03-06 13:51:51.648 OrientationTest[3132:207] {{0, 0}, {748, 1024}}
2012-03-06 13:51:53.481 OrientationTest[3132:207] {{0, 0}, {748, 1024}}
2012-03-06 13:51:53.482 OrientationTest[3132:207] {{0, 0}, {748, 1024}}
2012-03-06 13:51:53.897 OrientationTest[3132:207] {{0, 0}, {748, 1024}}
2012-03-06 13:51:53.898 OrientationTest[3132:207] {{20, 0}, {748, 1024}}

По сути, loginViewController действует так, как если бы он находился в портретном режиме. У меня есть два текстовых поля в этом представлении, и когда я нажимаю на одно из них, я хочу переместить вид вверх, чтобы клавиатура не отображалась над текстовым полем. Чтобы сделать это, я должен изменить frame.origin.x вместо y, потому что ось инвертирована (представление действует как портрет), и это вызывает много проблем.

Редактировать:

Если я изменяю стиль модального представления в LoginViewController на UIModalPresentationPageSheet, он работает так, как задумано, поэтому возникает проблема только с полноэкранным режимом.

Второе редактирование:

Я разобрал код до основ. Я даже больше не представляю модальный контроллер представления, просто инициализирую этот контроллер представления как корневой контроллер представления, и все же это происходит.

Делегат приложения:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

На мой взгляд контроллер:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    NSLog(@"%@",NSStringFromCGRect( self.view.frame));
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

3 ответа

Решение

Итак, я наконец-то нашел способ, чтобы это правильно работало. Кажется, если вы просто создадите новый контроллер представления и представите, что он всегда будет инвертирован. Исправление, которое я нашел, было помещением контроллера представления в контроллер навигации.

LoginViewController *lvc = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:[NSBundle mainBundle]];
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:lvc];
nvc.navigationBarHidden = YES;
lvc.modalPresentationStyle = UIModalPresentationFullScreen;
lvc.parentView = self.navController.view;
[self.window.rootViewController presentModalViewController:nvc animated:NO];

Инвертированный кадр х / у - это "фича";) Вам не хватает convertRect:fromView, Посмотрите на преобразование ректов и точек между взглядами.

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

[self.view convertRect:keyboardFrame fromView:keyboardView];

Изменить это

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    NSLog(@"%@",NSStringFromCGRect(self.view.frame));
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}    

в это

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    NSLog(@"%@",NSStringFromCGRect(self.view.frame));
    return YES;
}    
Другие вопросы по тегам