2

常に縦向きモードで表示されるアプリが 1 つあります (Xcode プロジェクトの概要では、縦向きのみがサポートされています)。

今私がやりたいことは、アプリの任意のビュー コントローラーからアプリを使用しているときに、デバイスを右に横向きに回転させると、アプリはビュー コントローラー (ARViewController.m) を右に横向きに表示することです。ランドスケープ右への回転は、ARViewController.m を提示するトリガーです。しかし、私が経験したことは、最初のView Controllerは縦向きのみをサポートしているため、デバイスを横向きにしても、最初のものから提示したいView Controller(ARViewController.m)も縦向きではなく、横向き右。

これを 2 番目のビュー コントローラー (ARViewController.m) に記述しても、自動回転しません (このビュー コントローラーはあらゆる向きで表示できます)。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ 
  return YES;
}

2 番目のビュー コントローラー (ARViewController.m) が表示された後、iPhone を 1 回回転させる必要があります。

そして、最初のビュー コントローラーからこの 2 番目のビュー コントローラー (ARViewController.m) を呼び出す方法を次に示します。

ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
[self presentModalViewController:arVC animated:YES];

「ViewController.m」から呼び出しています。これrootViewControllerは AppDelegate.m で定義されています。

このようなことをするのはこれが初めてです。解決策を探しましたが、それでも同じ問題です。これに関するヒントはありますか?

4

2 に答える 2

5

私は最終的にこの問題を解決しました。代替手段があると思いますが、これはうまくいきます:

実際には、向きの制限でポートレートのみを保持しました。次に、携帯電話を横向きに右または左に向けると、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
    }
}
于 2012-10-23T10:47:23.223 に答える
0

私が見つけたのは、まず第一に、アプリケーション全体の回転を止めているのはプロジェクトの概要シートです。あなたがすべきことは、プロジェクトの概要シートで制限の選択を解除し、各 UIViewController にメソッドを配置することです。あなたが持っているUIViewControllerで、メソッドを横向きで使用できるようにし、メソッドを実装します

[UIViewControllerSubclass willRotateToInterfaceOrientation:<interfaceOrientation> duration:<NSTimeInterval>]

Apple のコメント:

willRotateToInterfaceOrientation:duration:

ユーザー インターフェイスが回転を開始する直前にビュー コントローラーに送信されます。

  • (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 期間:(NSTimeInterval)期間

パラメーター

toInterfaceOrientation

ユーザー インターフェイスの新しい向き。可能な値は、UIInterfaceOrientation で説明されています。

間隔

保留中のローテーションの継続時間 (秒単位)。

討論

サブクラスはこのメソッドをオーバーライドして、ローテーションの直前に追加のアクションを実行できます。たとえば、このメソッドを使用して、ビュー インタラクションを無効にしたり、メディアの再生を停止したり、高価な描画やライブ更新を一時的にオフにしたりすることができます。これを使用して、現在のビューを新しいインターフェイスの向きを反映するものに交換することもできます。このメソッドが呼び出されると、interfaceOrientation プロパティにはまだビューの元の向きが含まれています。

このメソッドは、コードが 1 ステップ ローテーションを実行するか、2 ステップ ローテーションを実行するかに関係なく呼び出されます。


だから、これはあなたが探している方法のようです。これを実装し、ビュー呼び出しコードを内部に配置するだけで動作するはずです。(また、提示されたビューにこれらの 1 つを配置して、元に戻したときに戻るようにします)

また、とにかく回転していて、表示が変化していることは明らかであるため、View Controller をモーダルに表示しないことを検討する必要があります。

于 2012-10-22T00:57:27.630 に答える