我想在我的应用程序中仅旋转我的一个视图,无论是横向左侧还是横向右侧。我的所有其他视图都处于纵向模式,我已将我的应用程序设置为仅支持纵向模式。在iOS 6中改变方向,我不知道如何做到这一点。我试过下面发布的以下内容。谁能告诉我我做错了什么?谢谢!
-(BOOL)shouldAutorotate {
return YES;
}
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
}
我也尝试过:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
return YES;//UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
}
-(void)didRotate:(NSNotification *)notification {
UIDeviceOrientation orientation = [[notification object] orientation];
if (orientation == UIDeviceOrientationLandscapeLeft) {
[theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
[self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
} else if (orientation == UIDeviceOrientationLandscapeRight) {
[theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
[self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
[theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
[self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortrait) {
[theImage setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
[self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
}
}
答案 0 :(得分:19)
这对我有用How to force a UIViewController to Portrait orientation in iOS 6
从UINavigationController创建一个新类别,覆盖旋转方法:
-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}
@end
答案 1 :(得分:6)
iOS 6中有关于处理视图旋转的更改。 仅支持在应用Info.plist
中定义的方向。即使你要归还其他人。
尝试选择项目支持的所有方向。
处理视图轮播
在iOS 6中,您的应用支持应用的
Info.plist
文件中定义的界面方向。视图控制器可以覆盖supportedInterfaceOrientations
方法以限制支持的方向列表。通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕;子视图控制器使用由父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策。应用程序的方向遮罩和视图控制器的方向遮罩的交点用于确定视图控制器可以旋转到哪个方向。您可以覆盖旨在以特定方向全屏显示的视图控制器的
preferredInterfaceOrientationForPresentation
。在iOS 5及更早版本中,
UIViewController
类仅以纵向模式显示视图。要支持其他方向,必须覆盖shouldAutorotateToInterfaceOrientation:
方法,并为子类支持的任何方向返回YES。如果正确配置了视图的自动调整属性,则可能只需要执行此操作。但是,UIViewController
类为您提供了额外的挂钩,以便根据需要实现其他行为。通常,如果您的视图控制器旨在用作子视图控制器,它应该支持所有接口方向。当可见视图控制器发生旋转时,在旋转期间会调用
willRotateToInterfaceOrientation:duration
:,willAnimateRotationToInterfaceOrientation:duration:
和didRotateFromInterfaceOrientation:
方法。调整视图大小并由其父视图定位后,也会调用viewWillLayoutSubviews
方法。如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews
方法。您对此方法的实现可以调用statusBarOrientation
方法来确定设备方向。
答案 2 :(得分:2)
按照以下步骤
我为此创建了一个完美的示例项目。下载并集成到您的项目中:https://www.dropbox.com/s/nl1wicbx52veq41/RotationDmeo.zip?dl=0
答案 3 :(得分:0)
我有一个:
TabbarController - > NavigationController - > ViewController - >的ViewController
我进行了Subclassed UITabBarController
并添加....
-(NSUInteger)supportedInterfaceOrientations{
if (self.selectedIndex >= 0 && self.selectedIndex < 100) {
for (id vC in [[self.viewControllers objectAtIndex:(unsigned long)self.selectedIndex] viewControllers]) {
if ([vC isKindOfClass:[CLASS_WHICH_SHOULD_ALLOW class]]) {
return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskLandscape;
}
}
}
return UIInterfaceOrientationMaskPortrait;
}
答案 4 :(得分:0)
我一直在寻找解决方案几个小时!
所以在各地实施所需的方法之后。 shouldAutorotate
不需要设置为YES
,因为它已设置为默认值:
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}
当需要显示需要与其他视图不同的方向的UIViewController
时,我在内部创建了一个UIStoryboardSegue
:
#import "Showing.h"
@implementation Showing
- (void)perform{
NSLog(@"Showing");
UIViewController *sourceVC = self.sourceViewController;
UIViewController *presentingVC = self.destinationViewController;
[sourceVC.navigationController presentViewController:presentingVC
animated:YES
completion:nil];
}
@end
在UIStoryboard
内,我用这个segue连接了视图(显示):
重要的是,你正在使用
presentViewController:animated:completion:
AND NOT
pushViewController:animated:
否则将不再确定方向。
<小时/> 我一直在尝试像这样的事情
[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
或这个方向应该更改的UIViewController
内的这个,我也尝试在UIStoryboardSegues
和{{{{}}之前在我的自定义presentingViewController
内调用它1}}:
dismissViewController
或强>
[UIViewController attemptRotationToDeviceOrientation];
但他们中没有人工作过。当然最后一个例子不应该是一个选项,因为如果苹果会改变他们api的任何内容,这可能会导致你的应用程序内部出现问题。
我还尝试使用NSNumber *numPortrait = [NSNumber numberWithInt:UIInterfaceOrientationPortrait];
[[UIDevice currentDevice] setValue:numPortrait forKey:@"orientation"];
方法,并在查找实际AppDelegate
的正确UIInterfaceOrientation
后始终确定此方法内的方向,但有时在切换时有时会崩溃从一个到另一个方向。所以我仍然想知道为什么它变得如此复杂,似乎也没有任何文档可以正确解释。
甚至关注this part didn't help我。
答案 5 :(得分:0)
的UIViewController + OrientationPermissions.h
@interface UIViewController (OrientationPermissions)
+ (void)setSupportedOrientations:(UIInterfaceOrientationMask)supportedOrientations;
+ (UIInterfaceOrientationMask)supportedOrientations;
@end
的UIViewController + OrientationPermissions.m
@implementation UIViewController (OrientationPermissions)
static UIInterfaceOrientationMask _supportedOrientations;
+ (void)setSupportedOrientations: (UIInterfaceOrientationMask)supportedOrientations {
_supportedOrientations = supportedOrientations;
}
+ (UIInterfaceOrientationMask)supportedOrientations {
return _supportedOrientations;
}
@end
在您的UIApplication代表
中- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return [UIViewController supportedOrientations];
}
然后在所需的视图控制器上执行类似
的操作- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[UIViewController setSupportedOrientations:UIInterfaceOrientationMaskAll];
}
在离开此视图控制器之前,请不要忘记重置遮罩
注意,如果您使用的是UINavigationController或UITabBarController,请参阅https://stackoverflow.com/a/28220616/821994如何绕过
答案 6 :(得分:-2)
反向工作请尝试。 我在2天后解决了
// AppDelegate.m - 不幸的是,此方法在iOS6之前不可用
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
orientations = [presentedViewController supportedInterfaceOrientations];
}
return orientations;
}
// MyViewController.m - 返回你想为每个UIViewController支持的方向
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}