)在IOS應用中從豎屏模式強制轉換為橫屏模式

來源:互聯網
上載者:User

在 iPhone 應用裡,有時我們想強行把顯示模式從縱屏改為橫屏(反之亦然),CocoaChina 會員 “alienblue” 為我們提供了兩種思路

第一種:通過人為的辦法改變view.transform的屬性。

 

具體辦法:

 

view.transform一般是View的旋轉,展開移動等屬性,類似view.layer.transform,區別在於View.transform是二維的,也就是使用仿射的辦法通常就是帶有首碼CGAffineTransform的類(可以到API文檔裡面搜尋這個首碼的所有類),而view.layer.transform可以在3D模式下面的變化,通常使用的都是首碼為CATransform3D的類。

 

這裡要記住一點,當你改變過一個view.transform屬性或者view.layer.transform的時候需要恢複預設狀態的話,記得先把他們重設可以使用view.transform = CGAffineTransformIdentity,或者view.layer.transform = CATransform3DIdentity,假設你一直不斷的改變一個view.transform的屬性,而每次改變之前沒有重設的話,你會發現後來的改變和你想要的發生變化了,不是你真正想要的結果。

 

好了,上面介紹了旋轉的屬性,接下來就是關鍵了。官方提供了一個辦法就是查看當前電池條的狀態UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;通過這個辦法,你可以知道當前螢幕的電池條的顯示方向,而且你還可以強制設定他的顯示方向,通過設定這個屬性就OK了,可以選擇是否動畫改變電池條方向。有了這兩個那我們就可以任意的改變我們想要的顯示方式了。

 

1.擷取當前電池條的方向UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation

 

2.擷取當前螢幕的大小CGRect frame = [UIScreen mainScreen].applicationFrame;

 

3.設定我們的View的中心點
CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2));

 

4.根據當前電池條的方向,擷取需要旋轉的角度的大小。通常

 

if (orientation == UIInterfaceOrientationLandscapeLeft) {
return CGAffineTransformMakeRotation(M_PI*1.5);
} else if (orientation == UIInterfaceOrientationLandscapeRight) {
return CGAffineTransformMakeRotation(M_PI/2);
} else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
return CGAffineTransformMakeRotation(-M_PI);
} else {
return CGAffineTransformIdentity;
}

 

5.可以動畫的改變我們view的顯示方式了
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeRight animated:YES];

CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;(擷取當前電池條動畫改變的時間)
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
//在這裡設定view.transform需要匹配的旋轉角度的大小就可以了。
[UIView commitAnimations];

 

第二種:通過setOrientation:的辦法強制性的旋轉到一個特定的方向。

 

注意:Apple在3.0以後都不支援這個辦法了,這個辦法已經成為了私人的了,但是要跳過App Stroe的審核,需要一點巧妙的辦法。

 

不要直接調用[[UIDevice currentDevice] setOrientation: UIInterfaceOrientationLandscapeRight]這樣的辦法來強制性的橫屏,這樣導致你的程式是很難通過App Store審核的。但是你可以選擇使用performSelector的辦法來調用它。具體就幾行代碼如下:

 

//強制橫屏
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
[[UIDevice currentDevice] performSelector:@selector(setOrientation:)
withObject:(id)UIInterfaceOrientationLandscapeRight];
}

 

總結:如果第一種辦法可以滿足你需要的話,最好使用第一種辦法,因為那個上 App Store肯定沒問問題,但是第二種的話是需要冒風險的,但是如果你的結構太複雜了,導致使用第一種辦法人為很難控制的話,可以嘗試簡單的使用第二種辦法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.