在iOS 5中,我们可以通过编程方式更改设备方向,如下所示:
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
但是iOS6setOrience
已弃用,我如何在iOS6中以编程方式更改设备方向?
这并不是回答如何更改设备方向,而是一个可能对您有所帮助的附加信息。
iOS6 UI界面方向-应该AutorotateToInterface方向:不工作
如果你是一个新手,刚刚盯着可可工作,想知道为什么你的视图控制器在iOS6搞砸了,在iOS5完美了,只要知道应该AutorotateToInterfaceOriection:不再受支持。即使它可能适用于Xcode 4到4.3,它也不会适用于Xcode 4.5。
苹果提供了一种新的方法来完成这件事,以一种更干净的方式。您可以改用supportedInterfaceOrientations。它返回视图控制器支持的所有界面方向,即界面方向值的掩码。
UIInterfaceOrientationMask枚举:
这些常量是用于指定视图控制器支持的接口方向的掩码位。
typedef enum {
UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
UIInterfaceOrientationMaskLandscape =
(UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
UIInterfaceOrientationMaskAll =
(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
UIInterfaceOrientationMaskAllButUpsideDown =
(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight),
} UIInterfaceOrientationMask;
使用shouldAutorotateToInterfaceOrientation:方法:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return UIInterfaceOrientationIsLandscapeRight(toInterfaceOrientation);
}
使用support tedInterfaceOrientations方法:
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
以下是在iOS6中向UIViewController添加的有关方向的方法
>
UIViewController应该自动旋转
UIViewController支持接口方向
向UIApplication中添加了有关iOS6中方向的方法
>
UIApplication SupportedInterfaceDirectionsforWindow:
UIInterfaceOrientationMask
我发现强制设备更改方向的最简单方法是呈现一个新的视图控制器(使用演示视图控制器:动画:完成:
),其中新视图控制器指定了一个特定的首选方向(通过实现方法-(UIInterfaceOrient)preferredInterfaceOrientationForPresent
)。
如预期的那样,当显示新的视图控制器时,方向将更改为新视图控制器首选的方向。所以,最简单的实现(最佳实践?)将以特定方向将您所需的所有功能嵌入到单独的视图控制器中,并根据需要进行显示。系统将负责为您更改方向。
显然,这可能不适合所有用例,但幸运的是,相同的技巧也适用于强制设备更改现有视图控制器的方向。
诀窍是使用所需的特定首选方向显示新的视图控制器,然后立即将其隐藏。这将导致在显示新视图控制器时临时更改方向。最好的部分是,当新的视图控制器关闭时,会再次查询原始(显示)视图控制器的preferredInterfaceOrientationForPresentation,您可以在此处指定所需的最终方向。
这里要注意的一件重要事情是还临时禁用原始视图控制器中的自动旋转(当从新呈现然后被解雇的视图控制器返回时),以便当用户将手机旋转到新方向时,它不会触发进一步的自动旋转。
下面的代码应该说明我的观点,我的示例强制旋转为纵向,如果需要其他方向,只需相应更改即可。
假设您有名为Source
的原始视图控制器和名为ForcePortrait
的临时视图控制器
@interface Original : UIViewController
{
BOOL orientationToPortrait; //should set to NO by default
}
@end
@implementation Original
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation
{
if(orientationToPortrait)
{
//when we manually changed, show in Portrait
return UIInterfaceOrientationPortrait;
}
else
{
//before manual orientation change, we allow any orientation
return self.interfaceOrientation;
}
}
-(BOOL) shouldAutorotate
{
//we should 'lock' the rotation once we manually change it
return !orientationToPortrait;
}
-(void) changeOrientationToPortrait
{
//Sample method to change the orientation
//when called, will show (and hide) the temporary view
//Original.preferredInterfaceOrientationForPresentation will be called again after this method
//flag this to ensure that we tell system we prefer Portrait, whenever it asked again
orientationToPortrait = YES;
//presenting the following VC will cause the orientation to temporary change
//when the new VC is dismissed, system will ask what is our (Original) orientation preference again
ForcePortrait* forcePortrait = [[ForcePortrait alloc] init];
[self presentViewController:forcePortrait animated:NO completion:^{
[forcePortrait dismissViewControllerAnimated:NO completion:nil];
}];
}
@end
@interface ForcePortrait : UIViewController
@end
@implementation ForcePortrait
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
@end
这是我的“五美分”,在iOS7上用ARC测试
[[UIDevice currentDevice] setValue:
[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
forKey:@"orientation"];
这不会像performSelector那样生成“泄漏”警告。
UIAlertView-使用此代码,当您在查看期间打开UIAlertView(将会/确实出现)时,您会注意到,除了此视图之外,所有视图都是纵向的(苹果,真的吗?)我无法强制视图重新定向,但发现如果在打开UIAlertView之前稍有延迟,则视图有时间更改方向。
请注意,我将从2014年9月12日开始发布我的应用程序周,如果它通过或失败,我将更新帖子。
我想将我的应用程序的某些视图限制为横向视图。如何实现此功能。根据苹果的指导方针,这可能吗。
我正在使用AutoLayout开发iPad应用程序,如果用户启用某个模式(“平视”模式),我希望只支持纵向(或纵向倒置)方向,而且,如果设备处于横向,我希望自动切换到纵向模式。 在顶视图控制器中,我有以下内容: 根据我在这里其他地方看到的答案,答案似乎是我应该使用“application SetStatusBaroOrientation”。因此,在用户选择“抬头”模式的方法中,我包括: 然而,这似
场景:我将默认设备方向设置为纵向。但是,我想允许横向模式的一些视图。 我的大多数视图不需要是横向的。但是有一些带有方向检测,允许以横向模式显示全尺寸线性图。 我希望我的应用程序在大多数情况下都以肖像为中心。 问:我如何在需要的时候冻结肖像,但在情况允许的情况下允许风景?
我做了一个均衡器来配合我的应用程序,但我不确定如何改变搜索栏的拇指和进度颜色。默认情况下,它似乎是粉红色的,这不符合我的应用程序的美学。
服务器时间在单击按钮事件中自动设置为我的设备。
我使用下面的hack以编程方式更改homeAsupIndicator。 但这在大多数新手机(HTC One、Galaxy S3等)上都不起作用。是否有一种方法可以跨设备统一更改。我只需要在主屏幕上更改它。其他屏幕将具有默认屏幕。因此无法使用样式。xml