簡體   English   中英

iOS:旋轉iphone后,僅從支持肖像模式的視圖控制器以橫向顯示視圖控制器

[英]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保留在方向限制中。 然后,當我左右移動手機時,我會模態調用我的AR​​ViewController,但是在加載它之前,我會像下面這樣進行適當的旋轉,以強制此視圖控制器進入風景(在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>]

蘋果怎么說:

willRotateToInterfaceOrientation:時間:

在用戶界面開始旋轉之前發送給視圖控制器。

  • (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation持續時間:(NSTimeInterval)duration

參數

toInterfaceOrientation

用戶界面的新方向。 可能的值在UIInterfaceOrientation中進行了描述。

持續時間

待定輪播的持續時間(以秒為單位)。

討論

子類可以重寫此方法以在旋轉之前立即執行其他操作。 例如,您可以使用此方法禁用視圖交互,停止媒體播放或暫時關閉昂貴的圖形或實時更新。 您也可以使用它來將當前視圖交換為一個反映新界面方向的視圖。 調用此方法時,interfaceOrientation屬性仍包含視圖的原始方向。

無論您的代碼執行單步旋轉還是兩步旋轉,都將調用此方法。


因此,這似乎是您要尋找的方法。 只需實現此功能,然后將您的視圖調用代碼放入其中,它便會起作用。 (此外,將其中一個放置在顯示的視圖中以在向后旋轉時返回)

同樣,您應該考慮在視圖控制器無論如何旋轉時都不會模態顯示,並且很明顯顯示在變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM