viewcontroller不旋转

时间:2013-02-05 07:14:36

标签: objective-c ios6 xcode4.5 autorotate

我有一个简单的viewcontroller,其中添加了一些自定义按钮。

-(void)viewWillLayoutSubviews {

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    NSLog(@"Detected IPAD");
    if ( UIInterfaceOrientationIsPortrait(self.interfaceOrientation) )
    {
        NSLog(@"Orientation is PORTAIT");
    UIImage *serviceTask = [UIImage imageNamed:@"main_l_serviceorder.png"];

    btnServiceOrder = [UIButton buttonWithType:UIButtonTypeCustom];
    btnServiceOrder.frame = CGRectMake(143.0, 37.0, 226.0, 200.0);
    [btnServiceOrder setBackgroundImage:serviceTask forState:UIControlStateNormal];
    [btnServiceOrder addTarget:self action:@selector(gotoServiceOrders:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnServiceOrder];

    //similar codes goes here..
    }
    else
    {
     NSLog(@"Orientation is LANDSCAPE");
  //similar codes goes here.. 
     }
  }
}

我也在IOS6中添加了以下内容:shouldAutorotateToInterfaceOrientation是折旧的。

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  // Return YES for supported orientations
  return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  NSLog(@"Rotated!.");
}

- (BOOL)shouldAutorotate {
return YES;
}

 - (NSInteger)supportedInterfaceOrientations {

return UIInterfaceOrientationMaskAllButUpsideDown;

 }

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return (UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait);
 }

Viewcontroller仅在PORTAIT模式下加载! 请指导我!

1 个答案:

答案 0 :(得分:0)

//检查它

EDIT: This is happening because Apple has changed the way of managing the Orientation of UIViewController. In iOS6 orientation handles differently. In iOS6 shouldAutorotateToInterfaceOrientation method is deprecated. View controllers (such as UINavigationController) do not consult their children to determine whether they should autorotate. By default, an app and a view controller’s supported interface orientations are set to UIInterfaceOrientationMaskAll for the iPad idiom and UIInterfaceOrientationMaskAllButUpsideDown for the iPhone idiom.

If you want a specific view to be changed to the desired orientation you have to do some sort of subclass or category and override the autorotation methods to return the desired orientation.

Place this code in your root view controller. This will help the UIViewController to determine its orientation.

  //RotationIn_IOS6 is a Category for overriding the default orientation.

  @implementation UINavigationController (RotationIn_IOS6)

 -(BOOL)shouldAutorotate
    {
      return [[self.viewControllers lastObject] shouldAutorotate];
    }

  -(NSUInteger)supportedInterfaceOrientations
   {
     return [[self.viewControllers lastObject] supportedInterfaceOrientations];
   }

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
 {
     return [[self.viewControllers lastObject]  preferredInterfaceOrientationForPresentation];
 }

 @end

Now you need to implement below methods (introduced in iOS6) in viewController for orientation

- (BOOL)shouldAutorotate
{
    //returns true if want to allow orientation change
    return TRUE;


}
- (NSUInteger)supportedInterfaceOrientations
{   
     //decide number of origination tob supported by Viewcontroller.
     return UIInterfaceOrientationMaskAll;


}

 - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
   {
     //from here you Should try to Preferred orientation for ViewController 
   }

And put your code inside the below method. Whenever device orientation is changed this method will be called:

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)  interfaceOrientation duration:(NSTimeInterval)duration
{
if([[[SampleApplicationAppDelegate instance].callInfoDictionary valueForKey:IS_CHAT] isEqualToString:NO_RESPONSE])
{
    int nAngle = 0;
    BOOL bRet = NO;

    switch (interfaceOrientation) {
        case UIInterfaceOrientationPortrait:
            nAngle = 90;
            bRet = YES;
            NSLog(@".......Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);

            _previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);

            NSLog(@"Preview = %f %f",_previewCamera.frame.size.width,_previewCamera.frame.size.height);
            break;

        case UIInterfaceOrientationPortraitUpsideDown:
            nAngle = 270;
            bRet = YES;
            _previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
            break;

        case UIInterfaceOrientationLandscapeLeft:
            nAngle = 0;
            bRet = YES;
            //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI*1.5);
            break;

        case UIInterfaceOrientationLandscapeRight:
            nAngle = 180;
            bRet = YES;
            //_previewCamera.transform = CGAffineTransformMakeRotation(M_PI_2);
            break;

        default:
            break;
    }                
  }    

Edit: check your window, you need to add the controller on window as rootViewController rather than addSubview like below

self.window.rootViewController=viewController;