次のアプリケーション状態でデバイスの向きを見つける方法:
- 初回起動アプリ
- フォアグラウンドに入るアプリケーション
次のように、アプリケーションの初回起動時に方向を検出できます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil];
}
方向を検出するには:
-(void)deviceOrientationDidChange:(NSNotification *)notification
{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
//Ignoring specific orientations
if (orientation == UIDeviceOrientationFaceUp || orientation == UIDeviceOrientationFaceDown || orientation == UIDeviceOrientationUnknown || currentOrientation == orientation)
{
//To check orientation ;
}
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"deveiceorientation"])
{
// your orientation
}
else
{
[[NSUserDefaults standardUserDefaults] setObject:deviceOrientaion forKey:@"deveiceorientation"];
[[NSUserDefaults standardUserDefaults] synchronize];
// save your orientation
}
}
アプリケーションでフォアグラウンドに入ると、次を使用して同じことを確認できます
-(void)viewDidAppear:(BOOL)animated{
}
試したように、デバイスの向きの通知をオンにすると、デバイスの向きの変更に関する通知を受け取ることができますが、起動時に現在の向きを確実に確認できるかどうかはわかりません。
デバイスの向きが必要なときにView Controllerコードの内部にいる場合は、ほとんどの場合、次のように、向きが必要なときにView Controllerに尋ねるのが最善です。
self.interfaceOrientation
whenself
は UIViewController のインスタンスです。多くの場合、重要なことは、ポートレート モードかランドスケープ モードかを知ることです。その場合、次のようになります。
const UIInterfaceOrientation currentInterfaceOrientation = self.interfaceOrientation;
if (UIInterfaceOrientationIsLandscape(currentInterfaceOrientation)) {
// Set up for landscape orientation.
} else {
// Set up for portrait orientation (including upside-down orientation).
}
編集:application:didFinishLaunching:withOptions:
メソッド の外側でデバイスの向きを最初に確認する必要があります。dispatch_after
デバイスの向きの初期チェックの実行を遅らせるために使用できます。ここで使用しているパターンが気に入るかどうかはわかりませんが、メソッドの最後でこれがうまくいくと思いますapplication:didFinishLaunchingWithOptions:
:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
__block UIDeviceOrientation initialDeviceOrientation;
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
initialDeviceOrientation = [[UIDevice currentDevice] orientation];
NSLog(@"initialDeviceOrientation = %u", initialDeviceOrientation);
});
// Etc.