2013-07-23 59 views
2

我有一個VC,用戶可以拍攝照片或從他們的庫中選擇一張照片。基於照片方向設置自動旋轉和首選方向

拍攝/選擇照片後,它將被傳遞到下一個VC上的UIImageView

我想顯示這個視圖控制器,只在圖片在的方向。因此,如果用戶在左側橫向拍攝照片(一旦他們選擇「使用」),則下一個視圖控制器應該在橫向上加載該UIImageView中的該圖像。如果他們以縱向拍攝圖像,視圖控制器將以縱向加載。一旦VC以正確的方向加載,它就不應該移動(再旋轉)。

這是我到目前爲止已經試過,但不能讓它工作,我如何期望:

#pragma mark - 
#pragma mark - Auto Rotation Overrides 
- (BOOL)shouldAutorotate { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 1 || self.photoImage.imageOrientation == 0) { 
      // Landscape left = 0, Landscape rigt = 1 
      return YES; 
     } else { 
      // Portrait normal = 3, portait upside down = 2 
      return NO; 
     } 
    } 

    // Fallback to portrait 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 0) { 
      return UIInterfaceOrientationMaskLandscapeLeft; 
     } else if (self.photoImage.imageOrientation == 1) { 
      return UIInterfaceOrientationMaskLandscapeRight; 
     } else { 
      return UIInterfaceOrientationMaskPortrait; 
     } 
    } 

    // Fallback to Portrait 
    return UIInterfaceOrientationMaskPortrait; 
} 


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    if (self.photoImage != NULL) { 
     // Check that photoImage has an image 
     if (self.photoImage.imageOrientation == 0) { 
      return UIInterfaceOrientationLandscapeLeft; 
     } else if (self.photoImage.imageOrientation == 1) { 
      return UIInterfaceOrientationLandscapeRight; 
     } else { 
      return UIInterfaceOrientationPortrait; 
     } 
    } 

    // Fallback to Portrait 
    return UIInterfaceOrientationPortrait; 
} 

----- -----編輯

由於shouldAutoRotate不叫直到設備實際旋轉,我怎麼讓它自動在viewDidLoad基於圖像方向改變方向。我看到supportInterfaceOrientations方法被調用,只有一個風景被返回,但不會立即移動視圖...?

----- ----- EDIT2

是否在iOS6的preferredInterfaceOrientationForPresentation工作嗎?我可以設置我的導航控制器子類來查看self.topViewControllers preferredInterfaceOrientationForPresentation,但是這似乎意味着每個topViewController都需要使用此方法。理想情況下,我想要設置子類以說: 如果topViewController對preferredInterfaceOrientationForPresentation有響應,則使用其他縱向/默認值。這可以做到嗎?

如果是這樣,我當然可以更新preferredInterfaceOrientationForPresentation這將加載該VC在正確的方向,然後shouldAutoRotate將控制它不會被轉回到另一個方向?

回答

0

從我的理解,沒有辦法強制輪換事件,所以你必須與一些tricksy的東西來。我做了谷歌搜索「迫使一個UIView旋轉」,並發現了一些鏈接,可以幫助:

Removing and re-adding the view from the window

Rotating the view with a transform

就個人而言,我會嘗試變換第一,這裏是有關的代碼:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES]; 
self.view.transform = CGAffineTransformIdentity; 
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 

我不知道,如果設置狀態欄方向將改變導航欄的方向,如果你使用的是一個......

+0

謝謝,是的,我正在使用導航欄。我想這應該應用在viewDidAppear基於我有的圖像方向的if語句。 – StuartM

+0

viewWillAppear,viewDidLoad或viewDidAppear應該取決於你的情況。 – JonahGabriel

+0

感謝它旋轉的意見,但不是你認爲的導航欄...所以這不是一個解決方案的時刻。我的第二個想法是讓prefferredInterface方法工作,而不是這樣,它顯示在正確的界面,並且shouldAutoRotate會讓它再次旋轉......?我將編輯與更新 – StuartM

0

我過去爲這種情況所做的工作是爲橫向和縱向創建單獨的viewControllers(例如我不希望視圖自動旋轉)。一旦你有你單獨視圖控制器,你可以看的UIImage的,像這樣的尺寸:

if(sourceImage.size.width>sourceImage.size.height) 
    { 
     LandscapeViewController *LandscapeView = [[LandscapeViewController] init]; 
     [self presentViewController:LandscapeView animated:YES completion:nil]; 
     NSLog(@"go to Landscape View"); 
    } 
    //Else load into portrait Edit view 
    else 
    { 
     PortraitViewController *PortraitView = [[PortraitViewController alloc] init]; 
     [self presentViewController:PortraitView animated:YES completion:nil]; 
     NSLog(@"go to Portrait View"); 
    } 

我敢肯定有更有效的辦法,但是這是非常簡單和工程!

+0

這似乎不適用於我。我在故事板中創建了兩個獨立的VC,一個是Landscape和另一個端口。但視圖總是先以人像加載。還有其他需要嗎? – StuartM

0

從iOS 6開始,它是處理方向的navigationController。如您所想,您可以對其進行子類化,並使用respondsToSelector:檢查topviewcontroller是否具有所需的選擇器。

- (NSUInteger)supportedInterfaceOrientations { 
     if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]){ 
      return [self.topViewController supportedInterfaceOrientations]; 
     } 
    return [super supportedInterfaceOrientations]; 
} 

我的需要是強迫景觀。我還添加在控制器的viewDidLoad

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO]; 

您需要的方向改變爲一個你想要的。