特別なアニメーションを起動できるように、デバイスが縦向きになったことを検出する必要があります。しかし、ビューを自動回転させたくありません。
デバイスが縦向きに回転したときにビューの自動回転を無効にするにはどうすればよいですか? 私のアプリは、ビューを横向きに表示するだけで済みますが、縦向きへの回転を検出できるようにする場合は、縦向きもサポートする必要があるようです。
特別なアニメーションを起動できるように、デバイスが縦向きになったことを検出する必要があります。しかし、ビューを自動回転させたくありません。
デバイスが縦向きに回転したときにビューの自動回転を無効にするにはどうすればよいですか? 私のアプリは、ビューを横向きに表示するだけで済みますが、縦向きへの回転を検出できるようにする場合は、縦向きもサポートする必要があるようです。
アプリケーションが読み込まれるとき、またはビューが読み込まれるときに、次のことを試してください。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];
次に、次のメソッドを追加します。
- (void) orientationChanged:(NSNotification *)note
{
UIDevice * device = note.object;
switch(device.orientation)
{
case UIDeviceOrientationPortrait:
/* start special animation */
break;
case UIDeviceOrientationPortraitUpsideDown:
/* start special animation */
break;
default:
break;
};
}
上記により、ビューの自動回転を有効にせずに、デバイスの向きの変更を登録できます。
iOS のすべての場合において、オブザーバーを追加するときは、適切なタイミングでそれを削除します (常にではありませんが、ビューが表示または非表示になるとき)。監視/非監視コードの「ペア」のみを持つことができます。これを行わないと、アプリがクラッシュします。観察する/観察しない場所を選択することは、この QA の範囲を超えています。ただし、上記の「observe」コードと一致する「unobserve」が必要です。
viewWillTransitionToSize
向きの変化を検出する方法を探してこの質問にたどり着いた場合 (必ずしも回転を無効にしたくない場合)、 iOS 8 から利用できる にも注意する必要があります。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in
let orient = UIApplication.sharedApplication().statusBarOrientation
switch orient {
case .Portrait:
println("Portrait")
// Do something
default:
println("Anything But Portrait")
// Do something else
}
}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
println("rotation completed")
})
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
実際の向きを気にする必要がない場合は、次のようにします。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
// do something
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
// do whatever
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
}];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
そして、実際の向きについて心配する必要がない場合 (この回答から取得):
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
// Do view manipulation here.
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
1) デビッドの回答の Swift バージョン 2) 向きの変更がない場合でも向きを検出したい場合 ( iOS でデバイスの向きを検出するにはどうすればよいですか?に対する Moe の回答の Swift バージョン)
// Initial device orientation
let orientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
if(orientation == UIInterfaceOrientation.Unknown){
// code for Unknown
}
else if(orientation == UIInterfaceOrientation.Portrait){
// code for Portrait
}
else if(orientation == UIInterfaceOrientation.PortraitUpsideDown){
// code for Portrait
}
else if(orientation == UIInterfaceOrientation.LandscapeRight){
// code for Landscape
}
else if(orientation == UIInterfaceOrientation.LandscapeLeft){
// ode for Landscape
}
// To detect device orientation change
UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "orientationChanged:",
name: UIDeviceOrientationDidChangeNotification,
object: UIDevice.currentDevice())
方向変更機能
func orientationChanged(note: NSNotification)
{
let device: UIDevice = note.object as! UIDevice
switch(device.orientation)
{
case UIDeviceOrientation.Portrait:
// code for Portrait
break
case UIDeviceOrientation.PortraitUpsideDown:
// code for Portrait
break
case UIDeviceOrientation.LandscapeLeft:
// code for Landscape
break
case UIDeviceOrientation.LandscapeRight:
// code for Landscape
break
case UIDeviceOrientation.Unknown:
// code for Unknown
break
default:
break
}
}
デバイスオブジェクトを作成したくない場合は、次も使用できます
-(void) seObserverForOrientationChanging
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];
}
- (void) orientationChanged:(NSNotification *)note
{
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){
//Do something in landscape
}
else {
//Do something in portrait
}
}
私があなたを正しく理解していれば、あなたのアプリは横向きのみです。アプリのセットアップで、横向きのみであることを指定するだけでよいため、回転について心配する必要はありません。アプリは横向きで起動し、iPad の向きに関係なく横向きに表示されます。
まず、必要な方向以外のすべてを無効にします(回転しないようにします)
次に、Davidが言ったように、デバイスの現在の向きを取得します。
または、加速度計を自分で使用して(とにかくそれがどのように行われるのか)、重力がどこにあるかを確認して、加速度計の向きを確認することもできます。このアプローチを採用すると、値を自分で試してさまざまな結果を得ることができます。
.UIDeviceOrientationDidChange
デバイスが回転していない場合でも、iPhone で何度も通知が呼び出されます。理由はわかりませんが、デバイスが実際に回転したときにのみ必要な場合は、次のようにします。
NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: .UIDeviceOrientationDidChange, object: nil)
オブザーバーから呼び出されるメソッドは次のようになります。
func orientationChanged() {
if traitCollection.isIphone {
defer {
self.previousTraitCollectionForIphone = traitCollection
}
guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else {
updateView()
return
}
if previousTraitCollectionForIphone != traitCollection {
updateView()
}
} else {
updateView()
}
}