我已经为 Iphone 和 Ipad 创建了一个应用程序,它由两个带导航控制器的主视图组成。导航控制器被插入到 tabBar 控制器中。 我想将主视图锁定为纵向方向,并且只有导航控制器的子视图触发可能的方向为 Partrait 和横向。 是否可以? 我该怎么办?
谢谢
到目前为止给出的两个答案都是错误的。
这就是你要做的:
确保您在 info.plist 文件中支持的方向列表中列出了纵向和横向。 (默认的应用程序模板包括 iPad 的所有方向,以及 iPhone 的除纵向倒置之外的所有方向,这可能正是您想要的。)
您想要在要限制为纵向的视图控制器中实现方法
supportedInterfaceOrientations:
:
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
任何包含该代码的视图控制器将仅支持纵向。所有其他人都将支持您的 info.plist 中列出的所有方向。
仅当您支持 6.0 之前的操作系统版本时才需要旧方法
shouldAutorotateToInterfaceOrientation:
。
如果有时可能返回 NO(不旋转),则只需要实现 shouldAutorotate 方法。)
这是基于
UIViewController
类别和方法调配的通用方法。
// UIViewController+Orientation.h
@interface UIViewController (Orientation)
- (void)setOrientation:(NSUInteger)orientation;
@end
// UIViewController+Orientation.m
#import "UIViewController+Orientation.h"
#import <objc/runtime.h>
static NSUInteger __orientation = UIInterfaceOrientationMaskAll;
@implementation UIViewController (Orientation)
+ (void)load
{
Method original, swizzled;
original = class_getInstanceMethod(self, @selector(viewWillDisappear:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillDisappear:));
method_exchangeImplementations(original, swizzled);
}
- (void)swizzled_viewWillDisappear:(BOOL)animated
{
__orientation = UIInterfaceOrientationMaskAll;
[self swizzled_viewWillDisappear:animated];
}
- (NSUInteger)supportedInterfaceOrientations
{
return __orientation;
}
- (void)setOrientation:(NSUInteger)orientation
{
__orientation = orientation;
}
@end
现在您可以通过在
orientation
中设置
viewWillAppear:
来固定任何控制器的方向
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.orientation = UIInterfaceOrientationMaskPortrait;
}
Swizzling 关心控制器更改时的自动释放方向锁定。
此方法适用于所有类型的控制器,包括 TabbarViewController 和 UINavigationController 的情况,它们实际上响应旋转事件。
人们甚至可以在应用程序中创建一个锁定按钮,该按钮将获取当前方向并通过类别将其设置为固定。
是的,当然你可以做到。
下面的代码强制横向视图控制器, 您可以修改为纵向。 我用它来 iPhone。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(270));
landscapeTransform = CGAffineTransformTranslate (landscapeTransform, 0.0, 0.0);
[[self navigationController].view setTransform:landscapeTransform];
//NSLog(@"%f %f",self.view.frame.size.width,self.view.frame.size.height);
self.navigationController.view.bounds = CGRectMake(0.0, 0.0, self.width, self.height);
self.navigationController.navigationBar.frame = CGRectMake(0.0, y, self.width, 44.0);
[appdelegate stopProgressIndicator];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(0));
landscapeTransform = CGAffineTransformTranslate (landscapeTransform, 0.0, 0.0);
[[self navigationController].view setTransform:landscapeTransform];
self.navigationController.view.bounds = CGRectMake(0.0, 0.0, self.height, self.width);
self.navigationController.navigationBar.frame = CGRectMake(0.0, y, self.height, 44.0);
}
将其放入所有课程中......
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
if ([[[UIDevice currentDevice] systemVersion] integerValue]<7.0) {
return UIInterfaceOrientationLandscapeRight|UIInterfaceOrientationLandscapeLeft;
}else{
return UIInterfaceOrientationPortrait;
}
}
-(BOOL) shouldAutorotate {
return NO;
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
if ([[[UIDevice currentDevice] systemVersion] integerValue]<7.0) {
return UIInterfaceOrientationLandscapeRight|UIInterfaceOrientationLandscapeLeft;
return YES;
}else{
return UIInterfaceOrientationPortrait;
}
return NO;
}