Как принудительно настроить отдельную UIInterfaceOrientation на индивидуальном представлении в UINavigationController?
Хорошо, так вот ситуация:
У меня есть приложение, в котором я хочу только ОДНОГО конкретного представления в UINavigationController иметь ориентацию ландшафта. Это представление UIImageView, в котором я записываю подпись (эта часть работает потрясающе). Итак, вот так:
previous view --> signature view --> next view
(portrait) (landscape) (portrait)
Я не могу найти хороший способ принудительно настроить ориентацию устройства на ландшафт на этом сигнатурном экране. Нет смысла иметь портретную ориентацию в представлении подписи, потому что действительно нет подходящего места для подписи на этой ширине экрана.
Итак, какие-нибудь яркие идеи о том, как это сделать? Я считал, что возможно сделать вид подписи в моде, таким образом, вырваться из навигационного контроллера. Мысли?
Ответы
Ответ 1
Вы можете попытаться заставить устройство повернуть на нужную ориентацию, но вам нужно обрабатывать его вручную (в дополнение к переопределению методов ориентации ориентации UIViewController).
Чтобы повернуть устройство, вы можете использовать следующие методы:
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
Но в нем может не работать во всех ситуациях...
Также доступен недокументированный подход:
[[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:")
withObject:(__bridge id)((void*)UIInterfaceOrientationLandscapeLeft)];
Ответ 2
Просто переопределите этот метод UIViewController, чтобы возвращать true только для ландшафта, так что iphone будет принудительно поворачиваться на эту ориентацию устройства, поскольку у него нет другой опции.
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
Ответ 3
К сожалению, все корневые UIViewControllers внутри контроллера навигации должны поддерживать любую их дочернюю ориентацию. Это означает, что первый контроллер представления в вашей настройке должен поддерживать пейзаж, иначе ребенок будет поддерживать только портрет.
Лучший способ реализовать то, что вы ищете, - создать UIViewController, который отображает его содержимое на повернутом преобразовании, и просто по умолчанию все UIViewControllers в этом стеке для портрета.
Ответ 4
Я думаю, вы можете встроить это представление в контроллер представления и перезаписать метод ShouldRotateToInterfaceOrientation.
Удачи!
Ответ 5
Чтобы использовать представление только в ландшафте, в ViewController есть следующее:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
Ответ 6
Это может быть то, что вы ищете.
// Rotates the view.
CGAffineTransform transform = CGAffineTransformMakeRotation(3.14159/2);
self.view.transform = transform;
// Repositions and resizes the view.
CGRect contentRect = CGRectMake(-80, 80, 480, 320);
self.view.bounds = contentRect;
из http://www.iphonedevsdk.com/forum/iphone-sdk-development/1394-landscape-uiviewcontroller-uiview-rotation.html
Ответ 7
У меня есть приложение, в котором есть только пейзажи, которые даже начинаются в ландшафте. Это отлично работает в iOS 5.x, но перестало работать в iOS 6.x
После многого другого, более сомнительного, чем другие, я нашел решение, которое для меня ясное и предсказуемое.
Я сделал несколько вещей.
- Я сохранил представления в ландшафтном режиме в IB.
- Я проверил оба ландшафтных режима в настройках проекта - там четыре значка для управления им
- Ориентация mgmt изменилась в iOS 6.x. Я должен был перезаписать несколько методов, чтобы поддержать изменение ландшафта.
этот метод предназначен для iOS 5.x
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations.
return (interfaceOrientation & UIInterfaceOrientationMaskLandscape);
}
эти 2 метода предназначены для iOS 6.x
- (NSUInteger)supportedInterfaceOrientations
{
NSUInteger supportedOrientations = UIInterfaceOrientationMaskLandscape;
return supportedOrientations;
}
- (BOOL)shouldAutorotate
{
return YES;
}
- Но ключ должен был изменить логику в AppDelegate. Первоначальный код, который у меня был, добавлял к окну subview (controller.view). Это перестало работать в iOS 6.x - я изменил вызов на window.setRootController. Это был последний шаг, который закрепил его - он не сработает, не сделав этого окончательного изменения
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//[self.window addSubview:viewController.view];
[self.window setRootViewController:viewController];
[self.window makeKeyAndVisible];
return YES;
}
Ответ 8
UINavigationController переопределяет настройки ориентации UIViewController, поэтому вам нужно создать собственный подкласс UINavigationController со следующим для 5.1:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[self topViewController] isKindOfClass:[SigCaptureViewController class]]) {
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
} else {
return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}
}
Для версии 6.0 и выше вам необходимо:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
if ([[self topViewController] isKindOfClass:[EXTRASigCaptureViewController class]]) {
return UIInterfaceOrientationMaskLandscape;
} else {
return UIInterfaceOrientationMaskPortrait;
}
}
Я не понял, как заставить вращение UINavigationController вращаться. вызов [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]
заставляет строку состояния вращаться, но не приводит к вращению представления.