![](/img/trans.png)
[英]Maintain one view controller in Portrait and other in Landscape mode iOS
[英]iOS: Presenting a view controller in landscape right from a view controller supporting only portrait mode after rotating the iphone
我有一個始終以“縱向”模式顯示的應用程序(在Xcode項目的摘要中,僅支持縱向方向)。
現在我想做的是在使用該應用程序時,從該應用程序的任何視圖控制器中,如果我沿橫向旋轉設備,則該應用程序將以橫向顯示一個視圖控制器(ARViewController.m),實際上向右旋轉到右側是顯示ARViewController.m的觸發條件。 但是我所體驗到的是,由於第一個視圖控制器僅支持縱向模式,即使我將設備正確地橫向放置,所以我要從第一個視圖控制器呈現的視圖控制器(ARViewController.m)也處於縱向模式,而不是縱向模式在風景中。
即使我在第二個視圖控制器(ARViewController.m)中編寫此代碼,它也不會自動旋轉(此視圖控制器可以在各個方向上顯示):
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return YES;
}
在第二個視圖控制器(ARViewController.m)呈現完整之后,我必須旋轉iphone一次。
這是我從第一個視圖控制器調用第二個視圖控制器(ARViewController.m)的方式:
ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
[self presentModalViewController:arVC animated:YES];
我從“ ViewController.m”調用它,這是在AppDelegate.m中定義為rootViewController
。
這是我第一次這樣做,我一直在尋找解決方案,但仍然是同樣的問題。 有什么提示嗎?
我終於解決了這個問題,我想有替代方法,但是這個方法很好用:
實際上,我僅將Portrait保留在方向限制中。 然后,當我左右移動手機時,我會模態調用我的ARViewController,但是在加載它之前,我會像下面這樣進行適當的旋轉,以強制此視圖控制器進入風景(在viewWillAppear中):
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self transformView2ToLandscape];}
-(void) transformView2ToLandscape {
NSInteger rotationDirection;
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
if(currentOrientation == UIDeviceOrientationLandscapeLeft){
rotationDirection = 1;
}else {
rotationDirection = -1;
}
CGAffineTransform transform = [arController.viewController.view transform];
transform = CGAffineTransformRotate(transform, degreesToRadians(rotationDirection * 90));
[arController.viewController.view setTransform: transform];}
編輯:在Swift 4
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
transformViewToLansdcape()
}
func transformViewToLansdcape(){
var rotationDir : Int
if(UIDeviceOrientationIsLandscape(UIDevice.current.orientation)){
rotationDir = 1
}else{
rotationDir = -1
}
var transform = self.view.transform
//90 for landscapeLeft and 270 for landscapeRight
transform = transform.rotated(by: (rotationDir*270).degreesToRadians)
self.view.transform = transform
}
extension BinaryInteger {
var degreesToRadians: CGFloat {
return CGFloat(Int(self)) * .pi / 180
}
}
我發現的是,首先,阻止整個應用程序旋轉的是項目摘要表。 您應該做的是取消選擇項目摘要表中的限制,並按照自己的意願在每個UIViewController中放置一個方法。 在您擁有的UIViewController中,使該方法可用於橫向方向並實現該方法
[UIViewControllerSubclass willRotateToInterfaceOrientation:<interfaceOrientation> duration:<NSTimeInterval>]
蘋果怎么說:
在用戶界面開始旋轉之前發送給視圖控制器。
參數
toInterfaceOrientation
用戶界面的新方向。 可能的值在UIInterfaceOrientation中進行了描述。
持續時間
待定輪播的持續時間(以秒為單位)。
討論
子類可以重寫此方法以在旋轉之前立即執行其他操作。 例如,您可以使用此方法禁用視圖交互,停止媒體播放或暫時關閉昂貴的圖形或實時更新。 您也可以使用它來將當前視圖交換為一個反映新界面方向的視圖。 調用此方法時,interfaceOrientation屬性仍包含視圖的原始方向。
無論您的代碼執行單步旋轉還是兩步旋轉,都將調用此方法。
因此,這似乎是您要尋找的方法。 只需實現此功能,然后將您的視圖調用代碼放入其中,它便會起作用。 (此外,將其中一個放置在顯示的視圖中以在向后旋轉時返回)
同樣,您應該考慮在視圖控制器無論如何旋轉時都不會模態顯示,並且很明顯顯示在變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.