2

たとえば、iPadの単純な描画プログラムの場合、ユーザーがポートレートモードで(0,0)から(730、1000)まで線を引くと、線全体が表示されます。しかし、ユーザーがiPadを90度回転させた場合、自動回転を許可すると、線が下部で切断されます。

したがって、キャンバスを含むビューは自動回転しないでください。

一方、画面に元に戻すボタンやスライドアウトパネルがある場合、この部分は実際にはiPadの回転状態に応じて自動回転する必要があります。

これはどのように最適に実装されますか?通常、すべてに対して自動回転があるか、自動回転がまったくないためですが、この状況では半分と半分が必要です。

4

2 に答える 2

1

ユーザーがデバイスを回転させたときに図面が回転しないようにしたいと考えるのは難しいというlnafzigerに同意する必要があります。描画するとき、画像の上下と左右の側面は創造的な描画プロセスに非常に不可欠であるため、ビューのコントロールが回転するのを見るのは非常に奇妙だと思いましたが、画像は回転しません。結論として、ユーザーがデバイスを回転させても、画像の上下左右を保持したいのではないかと思います。しかし、あなたは絶対に正しいと思います。ユーザーがデバイスを回転させたときに画像のアスペクト比が変化した場合(つまり、画像を押しつぶした場合)、ユーザーは方向感覚を失ってしまうでしょう。

ここで、アスペクト比が乱れるのを防ぐ1つの解決策をほのめかしました。つまり、768x768などの描画画像を正方形に保ち、いくつかのコントロール/ツールをレイアウトするために余分なスペースを使用する可能性があります。さらに良いことに、ユーザーがパン/スクロールできるページで構成される図面の概念を導入することもできます。そうすれば、ユーザーが望む任意のサイズの画像を作成でき、ユーザーがデバイスを回転させても、画像の「ページ」は変更されず、iPad画面で表されるそのページへの小さなビューポートだけが変更されます。また、ユーザーが画像を回転させたいと確信している場合は、デバイスの向きに関係なく、ページを回転させる機能をユーザーに提供します。彼らが望むすべての座標を新しい空間に簡単にマッピングすることができます。そのマッピングは非常に簡単なはずです。

ただし、デバイスを回転させるときに画像を回転させないと判断した場合(これは良い考えではないと主張しているにもかかわらず)、2つのアプローチがあるようです(最も簡単な解決策を考えていない場合は、これは、アプリで1つの方向のみを許可します):

まず、ユーザーが描画するオブジェクトのすべての座標を再マップし、回転が完了したらオブジェクトを再描画できます。繰り返しますが、90度回転したときのすべてのx、y座標の再マッピングは非常に簡単です。

次に、図面を独自のレイヤーに配置し、デバイスの回転時にCGAffineTransformRotateを実行できます(たとえば、ユーザーがデバイスを時計回りに90度、つまりPI / 2ラジアン回転させた場合、レイヤーPI/2を回転させます。反時計回り)。新しい座標を変換されたレイヤーにマップする必要があるかもしれないので、変換後に新しい線や他のオブジェクトを描画するときにこれが混乱する可能性があると私は思いますが、それを機能させることができると思います。詳細については、 CGAffineTransformRotateのドキュメントを参照してください。そして、あなたがそれをググると、そこにはたくさんの例があります。

于 2012-05-28T03:04:37.357 に答える
1

描画された画像はおそらく回転しないはずだということに同意します。紙に絵を描くとき、​​紙を回転させて画像の一部を上下逆さまにしたり、斜めに描いたりすることがよくあります。画像が自動回転している場合、この手法は不可能な場合があります。理想的には、ユーザーは縦向きまたは横向きの画像を選択できます。たとえば、描画を開始するときに画像の向きを修正する必要があるかもしれません。

私が最初に試みることは、要素の位置と回転を変更するカスタム メソッドをビュー コントローラーに実装することです。

-(void) updateLandscape;

-(void) updatePortrait;

オリエンテーション変更通知に登録します。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];


- (void)orientationChanged:(NSNotification *)notification {
    currentOrientation = [[UIDevice currentDevice] orientation];
    if ( currentOrientation == UIDeviceOrientationLandscapeLeft || currentOrientation == UIDeviceOrientationLandscapeRight ) {
        [self updateLandscape];
    } else {
          if ( currentOrientation == UIDeviceOrientationPortrait || currentOrientation == UIDeviceOrientationPortraitUpsideDown ) {
                [self updatePortrait];
          } else {
             if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
                 [self updateLandscape];
             } else {
                 [self updatePortrait];
             }   
         }
     }
}
于 2012-05-28T09:35:36.613 に答える