Detecting iOS orientation change instantly

后端 未结 6 2014
忘掉有多难
忘掉有多难 2020-12-02 05:38

I have a game in which the orientation of the device affects the state of the game. The user must quickly switch between Landscape, Portrait, and Reverse Landscape orientati

相关标签:
6条回答
  • 2020-12-02 06:20

    For my case handling UIDeviceOrientationDidChangeNotification was not good solution as it is called more frequent and UIDeviceOrientation is not always equal to UIInterfaceOrientation because of (FaceDown, FaceUp).

    I handle it using UIApplicationDidChangeStatusBarOrientationNotification:

    //To add the notification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:)
    
    //to remove the
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
    
     ...
    
    - (void)didChangeOrientation:(NSNotification *)notification
    {
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    
        if (UIInterfaceOrientationIsLandscape(orientation)) {
            NSLog(@"Landscape");
        }
        else {
            NSLog(@"Portrait");
        }
    }
    
    0 讨论(0)
  • 2020-12-02 06:20

    Try making your changes in:

    - (void) viewWillLayoutSubviews {}

    The code will run at every orientation change as the subviews get laid out again.

    0 讨论(0)
  • 2020-12-02 06:20

    @vimal answer did not provide solution for me. It seems the orientation is not the current orientation, but from previous orientation. To fix it, I use [[UIDevice currentDevice] orientation]

    - (void)orientationChanged:(NSNotification *)notification{
        [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]];
    }
    

    Then

    - (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... }
    

    With this code I get the current orientation position.

    0 讨论(0)
  • 2020-12-02 06:38

    Why you didn`t use

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    

    ?

    Or you can use this

    -(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    

    Or this

    -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
    

    Hope it owl be useful )

    0 讨论(0)
  • 2020-12-02 06:39

    Add a notifier in the viewWillAppear function

    -(void)viewWillAppear:(BOOL)animated{
      [super viewWillAppear:animated];
      [[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(orientationChanged:)    name:UIDeviceOrientationDidChangeNotification  object:nil];
    }
    

    The orientation change notifies this function

    - (void)orientationChanged:(NSNotification *)notification{
       [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
    }
    

    which in-turn calls this function where the moviePlayerController frame is orientation is handled

    - (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation {
    
        switch (orientation)
        {
            case UIInterfaceOrientationPortrait:
            case UIInterfaceOrientationPortraitUpsideDown:
            { 
            //load the portrait view    
            }
    
                break;
            case UIInterfaceOrientationLandscapeLeft:
            case UIInterfaceOrientationLandscapeRight:
            {
            //load the landscape view 
            }
                break;
            case UIInterfaceOrientationUnknown:break;
        }
    }
    

    in viewDidDisappear remove the notification

    -(void)viewDidDisappear:(BOOL)animated{
       [super viewDidDisappear:animated];
       [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
    }
    

    I guess this is the fastest u can have changed the view as per orientation

    0 讨论(0)
  • 2020-12-02 06:41

    That delay you're talking about is actually a filter to prevent false (unwanted) orientation change notifications.

    For instant recognition of device orientation change you're just gonna have to monitor the accelerometer yourself.

    Accelerometer measures acceleration (gravity included) in all 3 axes so you shouldn't have any problems in figuring out the actual orientation.

    Some code to start working with accelerometer can be found here:

    How to make an iPhone App – Part 5: The Accelerometer

    And this nice blog covers the math part:

    Using the Accelerometer

    0 讨论(0)
提交回复
热议问题