2013-08-31 29 views
1

在我的iOS應用程序中,我已經根據比例設置了一切。它會根據設備的寬度和高度以編程方式創建所有圖像。我在網上找到,我需要使用:設備旋轉後直接啓動的方法

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
             duration:(NSTimeInterval)duration 

然而,因爲我用的是屏幕寬度和高度,我需要打電話給我重裝它旋轉之後。我會使用這樣一個在旋轉發生後觸發的函數嗎?

+1

'didRotateFromInterfaceOrientation:'? – Till

回答

0

UIDevice能夠生成通知,告訴您事後的方向更改。請記住,爲UIDeviceOrientation聲明的枚舉與爲UIInterfaceOrientation聲明的枚舉不完全相同。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    NSLog(@"%d",orientation); 

}]; 
+0

儘管可以這樣做,但我建議不要這樣做,因爲這完全與ViewController旋轉事件分離 - 當您實際上試圖依賴ViewController機制時,會遇到各種問題。 – Till

+0

我同意,我寧願使用viewWillLayoutSubviews,從iOS 5.0起可用。 –

3

從IOS開發商reference on UIViewController旋轉:

當發生旋轉時用於可見視圖控制器,所述 willRotateToInterfaceOrientation:持續時間:, willAnimateRotationToInterfaceOrientation:持續時間:和 didRotateFromInterfaceOrientation:方法被稱爲在 期間輪換。 viewWillLayoutSubviews方法也在 視圖的大小調整並由其父級定位後調用。如果視圖控制器 在方向更改發生時不可見,則永遠不會調用方法旋轉。但是,視圖變爲可見時,將調用viewWillLayoutSubviews方法 。您執行此 方法可以調用statusBarOrientation方法來確定設備的方向。

所以你有你需要的所有信息。請使用viewWillLayoutSubviews或者,如果您的目的爲時已晚,請使用didRotateFromInterfaceOrientation:

+0

我回復並看到您的信息。我已經提高了你的答案,以便你獲得信貸。 –

1

方法viewWillLayoutSubviews在界面更改方向後調用。調用self.view.bounds.size將爲您提供新方向的正確寬度和高度。自iOS 5.0起可用。請參閱Apple文檔中的UIViewController類參考。

+1

我與@Till並行回答,但他在我兩分鐘前得到了答案,所以應該給他留下信用。 –

1

從iOS 8開始,所有旋轉相關的方法都被棄用。相反, 旋轉視爲視圖控制器的視圖大小的變化,因此使用 viewWillTransitionToSize:withTransitionCoordinator:方法報告。當界面方向改變時,UIKit在窗口的 根視圖控制器上調用此方法。該視圖控制器然後通知其子 視圖控制器,在整個視圖 控制器層次結構中傳播該消息。

來源:iOS Developer Library

下面是如何使用它的例子。

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { 

     // Stuff you used to do in willRotateToInterfaceOrientation would go here. 
     // If you don't need anything special, you can set this block to nil. 

    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { 

     // Stuff you used to do in didRotateFromInterfaceOrientation would go here. 
     // If not needed, set to nil. 

    }]; 
}