我创建了一个Iphone和Ipad的应用程序,它由两个带导航控制器的主视图组成。导航控制器插入tabBar控制器。 我想将主视图锁定到纵向方向,只有导航控制器的子视图触发了Partrait和Landscape的可能性。 可能吗? 我该怎么办?
谢谢
答案 0 :(得分:12)
到目前为止给出的答案都是错误的。
这是你做的:
确保在info.plist文件中支持的方向列表中列出纵向和横向。 (默认的应用程序模板包括iPad的所有方向,而iPhone的所有方向都是颠倒的,这可能是你想要的。)
您希望在要限制为纵向的视图控制器中实现方法supportedInterfaceOrientations:
:
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
包含该代码的任何视图控制器仅支持纵向。所有其他人都将支持info.plist中列出的所有方向。
只有在支持6.0之前的操作系统版本时才需要旧方法shouldAutorotateToInterfaceOrientation:
。
如果你有时可能会返回NO(不要旋转),你也只需要实现方法shouldAutorotate。)
答案 1 :(得分:3)
以下是基于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的情况,它实际上回复了旋转事件。
甚至可以在应用程序中创建一个锁定按钮,该按钮将获得当前方向并通过类别将其设置为固定。
答案 2 :(得分:0)
是的,当然可以这样做。
下面的代码强制视图控制器为景观, 您可以修改纵向。 我用它来制作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);
}
答案 3 :(得分:-1)
把它放在所有类......
-(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;
}