Контроллер модального вида для 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;
}