iOS 6–;在UINavigationController中强制UIViewController旋转
我有一个iOS 6–;在UINavigationController中强制UIViewController旋转,ios,cocoa-touch,ios6,Ios,Cocoa Touch,Ios6,我有一个UINavigationController,其中堆栈中的所有UIViewController都是纵向的,除了最后一个是横向的。我当前的实现显示了最后一个视图控制器,但我可以旋转到横向,不能旋转回纵向推送视图时,如何强制旋转到横向? MyUINavigationController子类: @interface RotationViewController : UINavigationController @end @implementation RotationViewControl
UINavigationController
,其中堆栈中的所有UIViewController
都是纵向的,除了最后一个是横向的。我当前的实现显示了最后一个视图控制器,但我可以旋转到横向,不能旋转回纵向推送视图时,如何强制旋转到横向?
MyUINavigationController
子类:
@interface RotationViewController : UINavigationController
@end
@implementation RotationViewController
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if (self.topViewController.class == [LoadingViewController class])
{
return UIInterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
if (self.topViewController.class == [LoadingViewController class])
{
return UIInterfaceOrientationLandscapeLeft;
}
return UIInterfaceOrientationPortrait;
}
@end
我只需要横向视图的视图控制器:
@implementation LoadingViewController
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
@end
其他视图控制器不实现这些方法中的任何一种。我有相同的条件。因此,您可以在应用程序中实现以下代码
- (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];
self.navigationController.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
self.navigationController.navigationBar.frame = CGRectMake(0.0, 20.0, 480, 44.0);
}
-(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, 320, 480);
self.navigationController.navigationBar.frame = CGRectMake(0.0, 20.0, 320.0, 44.0);
}
#define degreesToRadian(X) (M_PI * (X)/180.0)
注:-
以上代码是为iphone实现的。因此,如果您将其用于ipad,请更改界限。
您不需要实现
- (BOOL)shouldAutorotate
- (NSUInteger)supportedInterfaceOrientations
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
视图控制器中的函数。。。。因此,请删除这些方法。…检查问题并在那里查看答案,以获得您所需的项目示例
基本上,您需要在viewcontroller(要旋转的)中嵌入自定义导航控制器。在此自定义导航控制器中添加以下方法
- (NSUInteger)supportedInterfaceOrientations
{
return self.topViewController.supportedInterfaceOrientations;
}
并添加到应旋转的视图控制器:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
确保在项目中启用了纵向、横向右侧和横向左侧方向。然后,如果要阻止特定视图的某些方向,请执行以下操作:
– application:supportedInterfaceOrientationsForWindow:
它可以工作(我只需要从我的导航控制器支持的界面方向返回0),但我正在寻找一个如何在按下视图时触发自动旋转的答案。这个解决方案更像是一个技巧…非常适合重新调整屏幕方向!但由于某些原因,状态栏仍然位于顶部。当我重新定位设备以匹配屏幕时,状态栏会转到正确的位置,但当我返回到原始纵向时,屏幕会转到纵向。(所有这些都不受
支持的界面定向的存在/不存在的影响。)