2012-05-23 17 views
6

ViewController.m在iPad,如果我們打印出視圖的框架高度的輕敲事件處理程序:在iOS上,爲什麼一個視圖的幀的高度在旋轉後保持幾乎相同?

NSLog(@"Height of main view is %f", self.view.frame.size.height); 

然後在人像模式中,值是1004(用於設備狀態行20的像素,所以1024 - 20 = 1004),如果該設備旋轉到風景模式,我預計它是約768或748,但打印的值實際上是1024. (更新:如果應用程序在風景模式下啓動,旋轉,它也打印爲1024)。爲什麼會這樣,並且有一個經驗法則可以期望獲得748或768的價值? (有沒有多種方法可以獲得這個功能?)

+0

只是可以肯定,是你的['autoresizingMask'(http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview。 html#// apple_ref/occ/instp/UIView/autoresizingMask)屬性是否正確設置了標誌'UIViewAutoresizingFlexibleHeight'? – psycho

+0

我使用了'UIWindow * window = [[[UIApplication sharedApplication]委託]窗口]; window.autoresizingMask | = UIViewAutoresizingFlexibleHeight; self.view.autoresizingMask | = UIViewAutoresizingFlexibleHeight;'在viewDidLoad'方法中編譯並旋轉了幾次,高度仍然爲1024 –

+0

嗯..如果您在視圖中添加了標籤或其他東西,縱向模式下的視圖底部,它仍然可以在橫向模式下觀看嗎? (如果是的話,沒有更多的想法:/) – psycho

回答

4

在蘋果公司的文件,有關的UIView的框架:

警告:如果變換屬性不是恆等變換,這個屬性的 值是不確定的,因此應被忽略。

所以你應該使用界限屬性。

+0

由於'initWithFrame'可以初始化一個視圖,如果我們忽略'frame'屬性,它可能會很奇怪,因爲它設置了一些以 –

+0

開始的東西當視圖被初始化時,它的變換就是標識變換,這裏沒問題。你嘗試使用邊界,而不是框架? – jrturton

+0

是的,邊界工作...如果應用程序在設備處於橫向模式時啓動,那麼視圖是否仍然使用標識轉換進行初始化?因爲即使沒有進一步的旋轉,高度仍然是1024 –

0

背後的原因是,當您旋轉設備時,視圖的框架將更改爲適應狀態欄,但實際上並不旋轉視圖的框架。該設備只是渲染處於旋轉狀態的視圖,而視圖實際上未旋轉。我相信子視圖會受到這種變化的影響,但總的看法並非如此。

+0

,我們如何得到768或748的價值......? –

+0

你需要檢測什麼時候在景觀中將寬度視爲高度,在這種情況下 – CStreel

+0

所以我們的代碼將用'if(){} else {}'來處理呢?它可以工作,但似乎不太健壯的代碼。 –

1

您可以通過編程方式來管理方向,並覆蓋willRotateToInterfaceOrientation方法。看到的樣子:

#define IPAD_SIZE_PORTRAIT   CGSizeMake(768, 960) 
#define IPAD_SIZE_LANDSCAPE   CGSizeMake(1024, 704) 

-(void)relayoutSubviews:(UIInterfaceOrientation)orientation 
{ 
CGSize scrSize; 

if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) 
{ 
    scrSize = IPAD_SIZE_LANDSCAPE; 
} 
else 
{ 
    scrSize = IPAD_SIZE_PORTRAIT; 
} 

self.view.bounds = CGRectMake(0, 0, scrSize.width, scrSize.height); 
self.view.frame = CGRectMake(0, 0, scrSize.width, scrSize.height); 
} 

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
[self relayoutSubviews:toInterfaceOrientation]; 
} 
相關問題