View rotation notifications: why didRotateFromInterfaceOrientation: doesn't get called?

前端 未结 2 2087
暖寄归人
暖寄归人 2020-12-31 09:25

I\'m trying to detect any device orientation change so that I can update the views.

I want to update the views whether the orientation is portrait or landscape, so I

相关标签:
2条回答
  • 2020-12-31 09:59

    You need to add notification observer something like

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
    

    and add the method

    - (void) didRotate:(NSNotification *)notification
    {   
          UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    
           if (orientation == UIDeviceOrientationLandscapeLeft)
          {
            NSLog(@"Landscape Left!");
          }
    }
    
    0 讨论(0)
  • 2020-12-31 10:07

    Quick summary, change this:

    [window addSubview:viewController.view];
    

    to this:

    [window setRootViewController:viewController];
    

    I'm sorry if I took somebody's time for a silly mistake of mine. I found out why the method – willRotateToInterfaceOrientation:duration: would never get called. Something brought my attention to the navigation controller:

    Only the root view controller's willRotate method is being called. Most likely you have a strange hierarchy of view controllers.

    I found these post in another forum and I had a look at the app delegate. My code was as follows:

    CGRect bound = [[UIScreen mainScreen] bounds];
    window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, bound.size.width, bound.size.height)];
    TestViewController *viewController = [[TestViewController alloc] init];
    [window addSubview:viewController.view];
    [viewController release];
    [self.window makeKeyAndVisible];
    

    The problem was that I was not setting any view controller for the window, but I was just adding a view. It was a mistake I did due to the hurry to test something. I had to fix the code like this:

    CGRect bound = [[UIScreen mainScreen] bounds];
    window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, bound.size.width, bound.size.height)];
    TestViewController *viewController = [[TestViewController alloc] init];
    [window setRootViewController:viewController];
    [viewController release];
    [self.window makeKeyAndVisible];
    
    0 讨论(0)
提交回复
热议问题