好的,伙计们,我将发布我的解决方案。
是)我有的:
- 基于视图的应用程序,具有多个视图控制器。(它是基于导航的,但由于方向问题,我不得不使其基于视图)。
- 所有视图控制器都是纵向的,除了一个 - LandscapeLeft。
任务:
- 无论用户如何握住设备,我的视图控制器之一都必须自动旋转到横向。所有其他控制器必须是纵向的,并且在离开横向控制器后,应用程序必须强制旋转到纵向,无论用户如何握住设备。
- 这必须像在 IOS 6.x 上一样在 IOS 5.x 上工作
去!
(更新删除了@Ivan Vučica 建议的宏)
在您的所有 PORTRAIT 视图控制器中,都会覆盖这样的自动旋转方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
-(BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
您可以看到 2 种方法:一种用于 IOS 5,另一种用于 IOS 6。
您的 LANDSCAPE 视图控制器也是如此,但有一些添加和更改:
- (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];
}
类似地,在您离开 LANDSCAPE 控制器后,无论您加载什么控制器,您都应该再次强制 IOS 5 自动旋转,但现在您将使用UIDeviceOrientationPortrait
,当您转到 PORTRAIT 控制器时:
- (void)viewDidLoad{
[super viewDidLoad];
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0)
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
}
现在是最后一件事(这有点奇怪) - 您必须根据 IOS 更改从控制器切换到另一个控制器的方式:
制作一个 NSObject 类“Schalter”(德语中的“Switch”)。
在 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 的方式(假设您从 Warehouse 控制器转到 Products 控制器):
#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];
}
嗯,就是这样。不要犹豫投反对票,我不在乎。这是给那些正在寻找解决方案的人,而不是为了声誉。干杯! 萨瓦马扎雷。