1

iPadアプリの1つの画面でさまざまなデバイスの向きを処理する方法を理解するのに苦労しています。これが私の状況です:

〜この画面はすべて、1つのラベルを除いて、バネと支柱を使用して完全に回転しています。このラベルの問題は、(対角線上に)非正統的な方法で移動させたいため、スプリングとストラット(またはマスクのサイズ変更が機能しない)であるということです。

〜私がこれを行うことを検討している方法は、そのようなものです:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration
{
    if(UIInterfaceOrientationIsLandscape(newInterfaceOrientation))
    {
        self.myScreenLabel.frame = CGRectMake(600,0,400,100);
    }
    else {
        self.myScreenLabel.frame = CGRectMake(...//something); }
}

同様のロジックでviewDidLoadにもチェックを入れます。 If in portrait mode, put label at... else put label at...

これでうまくいくと思います。ただし、これを行うためのより適切に設計された方法があるかどうか疑問に思っています。上記の方法では、どこにでも番号がハードコーディングされています。したがって、これを行うためのより良い方法はありますか?また、この方法では、縦向きモードのストーリーボードにラベルを完全に配置しているという事実を利用しておらず、変更する必要があるのは横向きだけです。

より良いデザインに関する提案はありますか?

4

2 に答える 2

3

最初の質問です。回転が発生する直前にメソッドがトリガーされても問題がない場合は、アプローチを使用して方向変更の動作を実装しましたが、悪い結果はありません。または、NSNotificationsを使用して、向きの変更時にトリガーを追加することもできます。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil];

次に、次のようなメソッドを追加します。

 - (void) didRotate:(NSNotification *)notification {   
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation == UIDeviceOrientationLandscapeLeft) {
        //your code here
    }
 }

2番目の質問ですが、そのようなフレームの配置は怖いですが、あなたはそれを理解していると思います。代わりに、支柱のように、他の何かに関連する要素を配置します(つまり、常にウィジェット間の距離に対してウィジェットを配置します)。したがって、絶対数ではなく、ウィンドウのフレーム、ビューのフレーム、またはビュー内の他のUIViewサブクラスを使用して、オブジェクトを配置します。

于 2012-06-11T23:26:29.060 に答える
0

いくつかの考え:

  1. iOS 5以降の場合は、viewWillLayoutSubviewsを使用することをお勧めします。これは、iOS 6リリースノートのモーダルビューと画面の向きの変更方法に関するコメントを考えると、おそらくさらに重要です。これには、コードが1か所にあるという利点もあります。私はまだpre5をサポートしているので(これ以上はサポートしませんが)、実際にはiOSバージョンを動的にチェックし、viewWillLayoutSubviewspre 5.0の場合は他のメソッドから呼び出します。それ以外の場合は、手間のかかるviewWillLayoutSubviews作業を行います。

  2. ランドスケープの向きが根本的に異なる場合は、代替ランドスケープインターフェイスの作成を追求することをお勧めします。私はこれをしたことがありませんが、それはあなたの路地にあるようです。さまざまな方向にさまざまなNIBを使用することについてのSOに関する投稿もあります。ただし、これがストーリーボード環境で意味があるかどうかはわかりません。

  3. 画面のサイズに基づいて移動したりサイズを変更したりする必要があるこれらのコントロールの場合、ほとんどの場合、を使用して実行すると思いますviewWillLayoutSubviews。それがその方法の全体的な目的です(私は通常、データの内容と画面の幅に基づいて高さが変化するラベルに使用します)。私は別の方法があるかもしれないと考えるのをやめたことはありませんでした。向きを変更するときに移動するコントロールが1つしかない場合は、2つの追加の非表示のコントロールを作成できます。1つは縦向きの表示コントロールが必要な場所用で、もう1つは横向きの必要な場所用の非表示コントロールです。 (IBでは、ビューの向きを切り替えて、コントロールのレイアウトを容易にすることができます)。その後、あなたのviewWillLayoutSubviews実際に表示されるコントロールのフレームを、これら2つの非表示のコントロールのいずれかのフレームに設定します(もちろん、向きによって異なります)。これにより、コードにフレーム座標をハードコーディングする必要がなくなり、IBの利点を活用できます。この提案全体は半分では可愛すぎるかもしれませんが、私の2番目のポイントの努力をやりたくない場合は、別のアプローチです。

于 2012-06-11T23:43:19.077 に答える