我开发了一个iOS应用程序并在iOS6设备上进行了测试。在测试时,我意识到我的应用程序没有按预期响应方向更改。
这是我的代码:
// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationMaskPortrait;
}
准确的说,我想知道iOS中Orientation Changes调用了哪些Methods。
你可以试试这个,也许对你有帮助:
或
Objective-c:
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]
斯威夫特:
if UIDevice.current.orientation.isLandscape {
// Landscape mode
} else {
// Portrait mode
}
你可以试试这个,它可以解决你的问题。
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
请参阅以下链接
App extension
获取设备当前方向(应用程序扩展)
也许很愚蠢,但它正在工作(仅在 ViewController 中):
if (self.view.frame.size.width > self.view.frame.size.height) {
NSLog(@"Hello Landscape");
}
@property (nonatomic) UIDeviceOrientation m_CurrentOrientation ;
/* 您需要在 ViewDidload 或 ViewWillAppear 中声明这些代码 */
- (void)viewDidLoad
{
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];
}
/* 现在,每当我们改变设备的方向时,我们的设备都会发出通知,因此您可以使用当前方向控制您的代码或程序*/
- (void)deviceOrientationDidChange:(NSNotification *)notification
{
//Obtaining the current device orientation
/* Where self.m_CurrentOrientation is member variable in my class of type UIDeviceOrientation */
self.m_CurrentOrientation = [[UIDevice currentDevice] orientation];
// Do your Code using the current Orienation
}
遵循 UIDevice 上的文档。
你需要打电话
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
每次方向改变时,您都会收到 UIDeviceOrientationDidChangeNotification。
本教程很好地简单概述了如何使用
UIDeviceOrientationDidChangeNotification
处理设备旋转。它应该可以帮助您了解如何使用 UIDeviceOrientationDidChangeNotification
在设备方向发生更改时收到通知。
UIDevice.current.orientation.isLandscape
接受的答案读取设备的方向,如上所示,其报告的方向可能与视图控制器的方向不同,特别是如果您的设备保持在几乎水平的位置。
要具体获取视图控制器的方向,您可以使用其
interfaceOrientation
属性,该属性自 iOS 8.0 起已弃用,但仍能正确报告。
在您的 ViewController 中,您可以使用
didRotateFromInterfaceOrientation:
方法来检测设备何时旋转,然后在每个方向上执行您需要的操作。
示例:
#pragma mark - Rotation
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
switch (orientation) {
case 1:
case 2:
NSLog(@"portrait");
// your code for portrait...
break;
case 3:
case 4:
NSLog(@"landscape");
// your code for landscape...
break;
default:
NSLog(@"other");
// your code for face down or face up...
break;
}
}
快速 5 回答
订阅有关方向更改的通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(orientationChangedFromNotification), name: UIDevice.orientationDidChangeNotification, object: nil)
}
处理通知:
@objc func orientationChangedFromNotification() {
self.updateUIForOrientation()
}
处理方向变化:
func updateUIForOrientation() {
let orientation = UIDevice.current.orientation
//TODO: Your logic
}
注意:这将告诉您物理设备的方向。还可以访问应用程序的界面方向:
UIApplication.shared.delegate?.window?.windowScene?.interfaceOrientation
请注意,
[UIDevice currentDevice] orientation]
和 Application sharedApplication].statusBarOrientation
已弃用。
使用
deviceOrientationDidChange
通知似乎是获取当前方向的最佳常规方法,但它在应用程序启动时不提供方向,这对我来说是一个问题。
因此,在
ViewDidLoad
方法中,我读取屏幕尺寸来检测第一个方向:
CGSize __screenSize = [UIScreen];
但是在一定的延迟之前屏幕尺寸是不可靠的,所以我通过在1秒延迟后读取屏幕尺寸找到了我的解决方案,如下所示:
[self performSelector:@selector( readScreenSize ) withObject:nil afterDelay:1];
总而言之,它对我来说是这样的:
1/ 通过在短暂延迟后读取屏幕尺寸来检测第一个方向。
2/ 通过使用“deviceOrientationDidChange”通知检测方向变化。
祝你好运。