簡體   English   中英

ViewController不旋轉

[英]viewcontroller not rotating

我有一個簡單的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中應該棄用了AutorotateToInterfaceOrientation。

 - (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模式下加載!..請指導我!

//可以檢查

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM