我给了一个应用程序与说10个视图控制器。 我使用导航控制器加载/卸载它们。
所有,但一个在纵向模式。 假设7 VC是在景观。 我需要它的风景,当它被载入呈现。
请提出一个方法来强制从纵向方向转到景观在iOS 6中 (这将是很好的IOS 5的工作以及)。
这里是我在做之前 ,IOS 6:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
UIViewController *c = [[[UIViewController alloc]init] autorelease];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
展示和解雇模态VC是迫使应用程序来审查其走向,所以shouldAutorotateToInterfaceOrientation
渐渐调用。
我已经试图在iOS 6中:
- (BOOL)shouldAutorotate{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationLandscapeLeft;
}
在负载时,控制器保持停留在画像。 旋转设备后,方位的变化只是确定。 但我需要使控制器自动旋转到负载景观,因此用户将不得不旋转设备能够正确看到的数据。
另一个问题:该装置旋转回纵向后,方向变为纵向,虽然我在指定supportedInterfaceOrientations
只UIInterfaceOrientationMaskLandscape
。 为什么会发生?
另外,以上3种方法都不是获取调用。
一些(有用)数据:
- 在我的plist文件我已经指定了3个取向 - 但所有的倒挂。
- 该项目在Xcode 4.3 IOS 5开始前的Xcode 4.5 IOS 6,现在我用的是最新版本的所有类别,包括xibs创建。
- 在plist文件的状态栏设置为可见。
- 在厦门国际银行文件(一个我想在景观)状态栏是“无”,将方向设置为横向。
任何帮助表示赞赏。 谢谢。
Answer 1:
好吧,伙计们,我会后我的解决方案。
是)我有的:
- 视图基础的应用,有几个视图控制器。 (这是基础的导航,但我不得不让它查看基于,由于定位的问题)。
- 所有视图控制器是肖像,除了一个 - landscapeLeft。
任务:
- 我的一个观点控制器必须自动旋转为横向,不管用户如何持有该设备。 所有其他的控制器必须肖像,并留下山水控制器后,应用程序必须强制旋转为纵向,不管了,再次,用户如何持有该设备。
- 这必须作为6.x的IOS工作作为IOS 5.x的
走!
( 更新中删除由@IvanVučica建议宏)
在所有的纵向视图控制器覆盖自转的方法是这样的:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
你可以看到2种方法:一个是IOS 5,另一个是IOS 6。
同样为您的横向视图控制器,添加了一些新变化:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
[image_signature setImage:[self resizeImage:image_signature.image]];
return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
[image_signature setImage:[self resizeImage:image_signature.image]];
return UIInterfaceOrientationMaskLandscapeLeft;
}
注意 :强制自转在iOS 5中,你应该补充一点:
- (void)viewDidLoad{
[super viewDidLoad];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO];
}
如此类推,你离开山水控制器后,您加载任何控制器,你应该再强制自转的iOS 5,但现在你会使用UIDeviceOrientationPortrait
,因为你去的肖像控制器:
- (void)viewDidLoad{
[super viewDidLoad];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
}
现在,过去的事情(这是一个有点怪) -你必须改变你从一个控制器切换到另一个的方式,根据不同的IOS:
做一个NSObject类“Schalter”(德国“开关”)。
在Schalter.h说:
#import <Foundation/Foundation.h>
@interface Schalter : NSObject
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease;
@end
在Schalter.m说:
#import "Schalter.h"
#import "AppDelegate.h"
@implementation Schalter
+ (void)loadController:(UIViewController*)VControllerToLoad andRelease:(UIViewController*)VControllerToRelease{
//adjust the frame of the new controller
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect windowFrame = [[UIScreen mainScreen] bounds];
CGRect firstViewFrame = CGRectMake(statusBarFrame.origin.x, statusBarFrame.size.height, windowFrame.size.width, windowFrame.size.height - statusBarFrame.size.height);
VControllerToLoad.view.frame = firstViewFrame;
//check version and go
if (IOS_OLDER_THAN_6)
[((AppDelegate*)[UIApplication sharedApplication].delegate).window addSubview:VControllerToLoad.view];
else
[((AppDelegate*)[UIApplication sharedApplication].delegate).window setRootViewController:VControllerToLoad];
//kill the previous view controller
[VControllerToRelease.view removeFromSuperview];
}
@end
现在,这是你使用Schalter(假设你从仓管员到产品控制器)方式:
#import "Warehouse.h"
#import "Products.h"
@implementation Warehouse
Products *instance_to_products;
- (void)goToProducts{
instance_to_products = [[Products alloc] init];
[Schalter loadController:instance_to_products andRelease:self];
}
bla-bla-bla your methods
@end
当然,你必须释放instance_to_products
对象:
- (void)dealloc{
[instance_to_products release];
[super dealloc];
}
那么,这是它。 不要犹豫,downvote,我不在乎。 这是谁正在寻找解决方案,而不是名声的人。 干杯! 萨瓦Mazare。
Answer 2:
这应该工作,它类似于前期的iOS 6版本,但有一个UINavigationController
:
UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navigationController presentModalViewController:nc animated:NO];
[self.navigationController dismissModalViewControllerAnimated:NO];
我打电话这个我推下一个之前UIViewController
。 这将迫使下一推UIViewController
显示在人像模式中,即使当前UIViewController
是景观(应为纵向到横向工作太)。 适用于iOS 4 + 5 + 6我。
Answer 3:
我认为,最好的解决办法就是坚持苹果官方的文档。 所以,根据我使用下面的方法,一切都进行得很好在iOS 5和6我VC我重写以下方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}
适用于iOS 6,所支持的第一种方法返回的方向面膜方法(其名称中标明)
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
第二个这就是告诉你VC这是首选接口方向时,VC将被显示出来。
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
只需更改您要为纵向方向;)这种解决方案是工作顺利,我不喜欢创建宏和其他的东西的想法,去解决这个简单的解决方案。 希望这有助于...
Answer 4:
我有同样的问题,在我的应用程序27次从26日在纵向和唯一一个在所有方向(一个图像浏览器:))。 添加在每类中的宏和更换导航不是一个解决方案,我很舒服......
所以,我想保持UINavigationController的力学我的应用程序,而不是与其他代码替换此。
该怎么办:
@ 1在方法didFinishLaunchingWithOptions应用程序委托
if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
// how the view was configured before IOS6
[self.window addSubview: navigationController.view];
[self.window makeKeyAndVisible];
}
else
{
// this is the code that will start the interface to rotate once again
[self.window setRootViewController: self.navigationController];
}
@ 2由于navigationController将只是YES responde的自转,我们需要添加一些限制:扩展UINavicationController - > YourNavigationController和Interface Builder的链接。
@ 3改写从导航控制器中的“是烦人的新方法”。
由于这个类是定制只为这个应用程序也可以承担责任,它的控制器和在他们的地方回应。
-(BOOL)shouldAutorotate {
if ([self.viewControllers firstObject] == YourObject)
{
return YES;
}
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
if ([self.viewControllers firstObject] == YourObject)
{
return UIINterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskPortrait;
}
我希望这能帮到您,
Answer 5:
从iOS 6的发布说明 :
现在,iOS的容器(如UINavigationController的)不咨询自己的孩子,以确定他们是否应该自动旋转。
请问您rootViewController
传递shouldAutoRotate
消息下来ViewController
层次到你的VC?
Answer 6:
我用相同的方法,OP预iOS6的(本并关闭一个模态VC),以显示在横向模式下的单一视图控制器(所有其它部分中纵向)。 它打破了在iOS6的景观带VC纵向显示。
为了解决这个问题,我只是说在景观VC的preferredInterfaceOrientationForPresentation方法。 似乎做工精细的OS 5和OS 6现在。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
- (BOOL)shouldAutorotate
{
return NO;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
Answer 7:
嗨tryng很多不同的可能的解决方案,但没有成功后,我想出了以下解决方案希望它帮助!
我准备了一个食谱:)。
问题:你需要改变在iOS 6中使用navigationcontroller viewcontrollers的方向。
解:
步骤1.一个初始UIviewcontroler触发模态塞格斯到横向和纵向UInavigationControllers作为图为....
更深入地UIViewController1我们根据在AppDelegate中的全局变量需要2个塞格斯行动....
-(void)viewDidAppear:(BOOL)animated{
if([globalDelegate changeOrientation]==0){
[self performSegueWithIdentifier:@"p" sender:self];
}
else{
[self performSegueWithIdentifier:@"l" sender:self];
}
}
我们还需要一种方式回到肖像&| 景观....
- (IBAction)dimis:(id)sender {
[globalDelegate setChangeOrientation:0];
[self dismissViewControllerAnimated:NO completion:nil];
}
步骤2中的第一推UiViewControllers在每个NavigationController去与...
-(NSUInteger)supportedInterfaceOrientations{
return [self.navigationController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate{
return YES;
}
步骤3在我们的UINavigationController的子类覆盖supportedInterfaceOrientations方法....
在customNavigationController我们.....
-(NSUInteger)supportedInterfaceOrientations{
if([self.visibleViewController isKindOfClass:[ViewController2 class]]){
return UIInterfaceOrientationMaskPortrait;
}
else{
return UIInterfaceOrientationMaskLandscape;
}
}
步骤4在故事板或代码,设置wantsFullScreenLayout标志是,以纵向和横向uinavigationcontrollers。
Answer 8:
尝试segueing到UINavigationController
其使用类别或子类被指定期望的取向,那么原因请看到所需的VC。 阅读更多这里 。
Answer 9:
作为替代,你可以做用块相同的:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:viewController animated:NO completion:^{
[self dismissViewControllerAnimated:NO completion:nil];
}];
此外,推新视图之前调用它。
Answer 10:
转到你Info.plist文件并进行更改
Answer 11:
我有同样的问题。 如果您想强制某个特定视图控制器出现在景观,做到这一点你推到导航堆栈权利之前。
UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if (currentOrientation == UIInterfaceOrientationPortrait ||
currentOrientation == UIInterfaceOrientationPortraitUpsideDown)
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft];
UIViewController *vc = [[UIViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
[vc release];
Answer 12:
我解决它通过继承的UINavigationController并重写导航控制器如下的supportedInterfaceOrientations:
- (NSUInteger)supportedInterfaceOrientations
{
return [[self topViewController] supportedInterfaceOrientations];
}
所有的控制器来实现自己理想的方向supportedInterfaceOrientations。
Answer 13:
我已经使用了以下解决方案。 在具有不同的取向比所有其他的一个视图控制器,我添加在prepareForSegue方法的取向检查。 如果目标视图控制器需要比当前显示的一个不同的接口取向,然后将消息发送强制的界面处的塞克期间旋转。
#import <objc/message.h>
...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if(UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
UIInterfaceOrientation destinationOrientation;
if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]])
{
UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
destinationOrientation = [navController.topViewController preferredInterfaceOrientationForPresentation];
} else
{
destinationOrientation = [[segue destinationViewController] preferredInterfaceOrientationForPresentation];
}
if ( destinationOrientation == UIInterfaceOrientationPortrait )
{
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
{
objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
}
}
}
}
文章来源: IOS 6 force device orientation to landscape