2011-09-12 43 views
0

我已經使用UIDeviceOrientationDidChangeNotification來獲取景觀和potrait模式的通知。在我的項目中,我需要相應地更改放置在UIView上的UIControls的位置。我是否必須手動更改每個UIControl的幀大小,因爲這是忙碌的?iPhone中的自動定位

回答

1

在您的視圖控制器應實現方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

這種方法應該支持的方向返回YES

如果您希望子視圖自動調整大小和重新定位,那麼您應該設置適當的屬性autoresizingMask該視圖。例如:

blackView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | 
           UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | 
           UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; 
+0

這裏autoresizingMask意味着我可以縮小或縮放子視圖,這是相對於superview更改靈活嗎?但是在我的項目中,根據定向模式的類型,我已經給每個uicontrol固定位置。我可以使用autoresizingMask來更改uicontrols的來源。 – user574089

+0

值'UIViewAutoresizingFlexibleWidth'和'UIViewAutoresizingFlexibleHeight'將幫助您根據其超級視圖自動調整視圖的大小。其他值將幫助您在超視圖中更改視圖的來源。嘗試與他們一起玩......也可以打開IB - > Pick View - > Utilities - > Size Inspector - > Autoresizing。 – Nekto

0

您確實需要使用shouldAutorotateToInterfaceOrientation ...方法,但您需要做更多的工作才能正常工作。首先,您需要兩個xib文件,一個用於橫向,另一個用於縱向。然後,您將需要使用你的函數是這樣的:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft){ 
    //prepare for a Landscape view 
    } 
else{ 
    //prepare for a portrait view 
    } 
    return YES; 
} 

至於準備橫向或縱向視圖,使用自動尺寸可以工作,但你可能需要有完全獨立的xibs。我找不到在活動視圖控制器中更改xib的方法,因此我建議製作一個視圖控制器的獨立實例。示例:

當您呈現viewController的第一個實例時,請將其與肖像xib一起展示。您可能還需要一個布爾值來跟蹤當前的xib。然後有這樣的代碼來實現:

/*Assuming you are using a viewcontroller called viewController, and you have a boolean called xibPortrait. 
You have presented this view controller using the portrait xib. 
You also have a landscape xib, Landscape.xib 
*/ 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ((interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft) && xibPortrait){ 
     xibPortrait = FALSE; 
     viewController *Land = [[ViewController alloc] initWithNibName:@"Landscape" bundle:nil]; 
     [self presentModalViewController:Land animated:NO]; 
     [Land release]; 
    } 
else if(!xibPortrait){ 
    [self.parentViewController dismissModalViewControllerAnimated:NO]; 
    xibPortrait = TRUE; 
    } 
return YES; 
} 


//This should work but if you can, you should try to use Autoresizing. 

編輯: 我也發現了這裏面有人貼在我的問題之一。它可以幫助你的應用程序比上面使用我的方法更有效地工作: http://aseriesoftubes.com/articles/ipad-development-101-orientation/

+0

兩個單獨的視圖控制器到不同的屏幕位置?壞主意......嘗試計算內存分配+免費,如果用戶將打開你的應用程序,並將旋轉設備10倍... – Nekto

+0

Idk,我無法找到更改方向時更改xibs的方法。我還沒有在自己的應用程序中處理這個問題,我只需要在風景方向之間進行切換,這很簡單很多,因爲從另一側看,視圖看起來是一樣的。你有更好的想法嗎? – WolfLink

+0

您應該以編程方式執行此操作。當你可以改變位置時分配新的記憶是不好的選擇。 – Nekto