在这种情况下我不需要指定方向,我只需要检测它,但我遇到了麻烦。我有条件代码,只能在肖像中工作,如果设备在横向,我需要做其他事情。由于deviceOrientation不一定与interfaceOrientation相同,我无法想出一种测试纵向模式的方法。
我在Google上找到的大多数教程都是强制横向或进行某种轮换的方法。我唯一想做的就是确定方向是什么。这是我的代码,它不起作用:
-(void)viewDidLoad {
[super viewDidLoad];
//currentOrientation is declared as UIInterfaceOrientation currentOrientation
currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation); // == NULL
}
我需要有条件地确定interfaceOrientation和program的值。谢谢你的帮助!
答案 0 :(得分:77)
您是否了解interfaceOrientation
类的UIViewController
属性?
- (void) viewDidLoad {
[super viewDidLoad];
BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
// now do whatever you need
}
答案 1 :(得分:40)
特别是在发布时,我发现以下内容对于UI始终是准确的,无论UIDevice所说的方向是什么。
[UIApplication sharedApplication].statusBarOrientation
答案 2 :(得分:10)
self.interfaceOrientation
不可靠。例如,在tabbar应用程序中重新排列选项卡会返回不正确的值。
但[UIApplication sharedApplication].statusBarOrientation
总是可靠的。你为我节省了很多时间。谢谢。
答案 3 :(得分:4)
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if ((orientation == UIInterfaceOrientationLandscapeLeft)
|| (orientation == UIInterfaceOrientationLandscapeRight) )
{
//Landscape
}
else
{
//Portrait
}
答案 4 :(得分:1)
我知道这是一个非常古老的帖子。我怎么想补充一点,说检查状态栏方向更好更好。当你拨打self.interfaceorientation
时,它每次都在呼叫shouldRotateToOrientation
。如果你在该方法中编写了一些代码,它将被执行。所以要小心!。
答案 5 :(得分:1)
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
if(debug){
NSLog(@"Nothing to change because it is gone to Flat");
}
return;
}
if(deviceOrientation !=statusBarOrientation){
if(debug){
NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation );
}
}
你不会相信我,直到你在控制台看到第二个输出! 有些情况 - 它们存在! - 显示最后一个NSLog内容!
比你必须做一些变通办法,iOS没有错误,祝大家好运!
啊......论坛主持人也许会删除这篇文章,因为这并不意味着他的意见和回答!
我希望它曾经对某人有所帮助,它也发生在iphone上......(我得到了)
答案 6 :(得分:1)
将它混合一点:
BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;
(编辑)显然,之前的答案是正确的方法,在视图控制器不是全屏的情况下,此解决方案将失败。
答案 7 :(得分:1)
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
some instructions;
} else {
some instructions;
}
}
这是我的某个程序的片段。 当然,您也可以在ViewDidLoad通知中使用if语句。
答案 8 :(得分:1)
我已经通过@slycrel投了答案,但我想花时间写这篇文章,并指出一些似乎在这个老问题中丢失的东西,以及关于这个问题的许多其他问题。 / p>
Apple确实不希望我们根据方向更改来更新我们的大多数UI,但它仍然完全有可能,有时候需要根据具体情况进行更新,直到Apple改进他们的新功能(ish)API(例如viewWillTransitionToFrame:
比viewWillTransitionToSize:
更有用。只是说')
为什么我通过@slycrel投票给你的答案与UIDeviceOrientation
和UIInterfaceOrientation
之间的逻辑差异需要牢记在一起。
状态栏表示应用程序当前已知的UIInterfaceOrientation
。关于FaceUp
,FaceDown
的所有这些内容仅与设备的方向相关,而不一定与您的应用程序相关。 应用程序无论如何都不支持设备方向。实际上,UIDeviceOrientation
可以完全忽略,如果您只需要确保在界面中适当地布局和动画,这是应用程序开发人员用例的99%。目前,这是通过来自@ slycrel的答案的状态栏UIInterfaceOrientation
来实现的:
[UIApplication sharedApplication].statusBarOrientation
应该注意,此属性的 readwrite 版本已弃用, readonly 版本不推荐使用。
举个例子:
UIViewController
,这会导致状态栏方向变为风景。preferredInterfaceOrientationForPresentation
为该视图控制器返回的内容,当前设备方向是什么,以及视图控制器支持的界面方向(请参阅下一点) )。supportedInterfaceOrientations
返回的内容支持横向。假设我们使用UIInterfaceOrientationMaskLandscape
支持左右横向。UIDeviceOrientation
的组合。UIInterfaceOrientation
UIDeviceOrientation >,你无论如何也不必。前面的示例是可能的,因为当视图控制器转换即将开始时系统栏方向不会更新(系统要求动画师的转换委托等)。然后在转换开始动画时更新(例如,在调用animationTransition:
时)。这样,您只需使用状态栏的UIInterfaceOrientation
的初始值和当前值进行比较。
即使不使用视图控制器转换,根据状态栏方向更新视图仍然是安全的。
请记住,如果您手动更新状态栏,并且如果您没有在Info.plist中使用“查看基于控制器的状态栏外观”,那么您的应用程序的逻辑必须是知道状态栏何时会改变方向。您可能会为这些案例寻找几个NSNotification
名称,这些名称是:
UIApplicationWillChangeStatusBarOrientationNotification
UIApplicationDidChangeStatusBarOrientationNotification
以及这些UIApplicationDelegate
方法:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
另一个有用的UIApplication
属性:
@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;
答案 9 :(得分:0)
自iOS8起,API已被弃用或返回无用的结果,例如.FaceUp
.FaceDown
这是因为Apple不希望您使用方向更新UI,而是使用大小类,约束和比例(使用n%的superview)。
实际上,取决于方向的代码可能无法在整个设备和用例范围内提供良好的结果(尤其是多任务处理)