75

特別なアニメーションを起動できるように、デバイスが縦向きになったことを検出する必要があります。しかし、ビューを自動回転させたくありません。

デバイスが縦向きに回転したときにビューの自動回転を無効にするにはどうすればよいですか? 私のアプリは、ビューを横向きに表示するだけで済みますが、縦向きへの回転を検出できるようにする場合は、縦向きもサポートする必要があるようです。

4

9 に答える 9

179

アプリケーションが読み込まれるとき、またはビューが読み込まれるときに、次のことを試してください。

[[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」が必要です。

于 2012-02-03T00:55:56.633 に答える
21

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)
}

ここからのObjective-Cの例

- (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];
}

こちらもご覧ください

于 2015-09-10T05:30:18.157 に答える
3

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
    }
}
于 2015-07-19T22:33:02.873 に答える
1

デバイスオブジェクトを作成したくない場合は、次も使用できます

-(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
    }
}
于 2016-08-29T07:57:56.403 に答える
1

私があなたを正しく理解していれば、あなたのアプリは横向きのみです。アプリのセットアップで、横向きのみであることを指定するだけでよいため、回転について心配する必要はありません。アプリは横向きで起動し、iPad の向きに関係なく横向きに表示されます。

于 2012-02-03T00:55:25.733 に答える
0

まず、必要な方向以外のすべてを無効にします(回転しないようにします)

次に、Davidが言ったように、デバイスの現在の向きを取得します。

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

または、加速度計を自分で使用して(とにかくそれがどのように行われるのか)、重力がどこにあるかを確認して、加速度計の向きを確認することもできます。このアプローチを採用すると、値を自分で試してさまざまな結果を得ることができます。

于 2012-02-03T01:29:05.133 に答える
0

.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()
    }
}
于 2017-04-30T08:10:36.837 に答える