3

(他の標準の Cocoa Touch コントロールに加えて) 6 つのボタンとラベルを内部に持つサブビューがあります。

ここに画像の説明を入力

この厄介なコードを使用して、回転イベントでこれらのボタンとラベルを回転およびサイズ変更しています。

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation {
    if (UIInterfaceOrientationIsPortrait(orientation)) {
        button1.frame = CGRectMake(20, 59, 130, 80);
        button2.frame = CGRectMake(170, 59, 130, 80);
        button3.frame = CGRectMake(20, 176, 130, 80);
        button4.frame = CGRectMake(170, 176, 130, 80);
        button5.frame = CGRectMake(20, 293, 130, 80);
        button6.frame = CGRectMake(170, 293, 130, 80);

        label1.frame  = CGRectMake(20, 147, 130, 21);
        label2.frame  = CGRectMake(170, 147, 130, 21);
        label3.frame  = CGRectMake(20, 264, 130, 21);
        label4.frame  = CGRectMake(170, 264, 130, 21);
        label5.frame  = CGRectMake(20, 381, 130, 21);
        label6.frame  = CGRectMake(170, 381, 130, 21);
    } else {
        button1.frame = CGRectMake(20, 59, 130, 60);
        button2.frame = CGRectMake(20, 155, 130, 60);
        button3.frame = CGRectMake(177, 59, 130, 60);
        button4.frame = CGRectMake(177, 155, 130, 60);
        button5.frame = CGRectMake(328, 59, 130, 60);
        button6.frame = CGRectMake(328, 155, 130, 60);

        label1.frame  = CGRectMake(20, 127, 130, 21);
        label2.frame  = CGRectMake(20, 223, 130, 21);
        label3.frame  = CGRectMake(177, 127, 130, 21);
        label4.frame  = CGRectMake(177, 223, 130, 21);
        label5.frame  = CGRectMake(328, 127, 130, 21);
        label6.frame  = CGRectMake(328, 223, 130, 21);
    }
}

これは少し面倒ですが、問題なく動作し、ビュー内の要素の位置を正確に制御できます

ここに画像の説明を入力

ちなみに、「CPUパワー」とメモリ消費に関しては、2つの異なるビューを持ち、ローテーションでそれらを反転させる方が効率的かどうか疑問に思っています(2つではなく1つのビューを使用する方がメモリに適していると思いますが、間違っている可能性があります.私はiOSプログラミングにかなり慣れていません)。

ご提案ありがとうございます。

4

2 に答える 2

2

あなたが尋ねる:

ちなみに、「CPUパワー」とメモリ消費に関しては、2つの異なるビューがあり、それらをローテーションで反転させる方が効率的かどうか疑問に思っています...

逆のことが当てはまると思います。メソッドを呼び出すだけの単一のビューを使用する方がはるかに効率的ですviewWillLayoutSubviews(iOS 5では、iOS 4では通常使用しますwillAnimateRotationToInterfaceOrientation)。効率の向上は控えめですが、効率が目標である場合は、単一のビューが進むべき道だと思います。根本的に異なる場合は個別のビューを使用することをお勧めします。そのため、単一のビューでコードを管理するのは困難になりますが、それ以外の場合は1つのビューを使用します。個人的には、デバイスを回転させたときにコントロールを所定の位置にアニメーション化する方が、より強力なユーザーインターフェイスだと思います。

個人的には、このような方向の変更で再編成するコンテンツがある場合、ハードコードされた座標を使用するのではなく、ビューの寸法を使用して、コントロールのレイアウト(行ごとの数など)をアルゴリズムで決定します。そこで、それらの座標を決定します。このように、横向きと縦向きだけでなく、ユニバーサルアプリ(特に将来的に画面サイズが異なる他のデバイスがある場合)も簡単に処理できます。また、iOS 6が、コントロールのレイアウトにいくつかの優れた機能拡張を提供することも期待できると思います(ただし、iOS 6を必要とするアプリの開発が快適になるまでにはしばらく時間がかかります)。

于 2012-09-08T20:31:14.820 に答える
2

現在、私はあなたが書いたものと同様のコードに取り組んでいます。プロジェクトは非常に大きく、どこを変更するかを追跡するのは困難です。これは iOS 3 用に作成されたもので、クライアントにいくつかの変更が必要になりました。iOS が pushModal を変更せず、iOS6 で廃止される場合、問題はそれほど大きくありません...私の場合、GUI スケルトンを書き直す必要があり、ポートレート/ランドスケープの要件がありました。必要に応じて、いくつかのリンクを確認してください: question1 question2 question3 question4

目に見えない iOS の変更の場合、特に 2 年後は、そのコードを概観するのが難しくなります。以前に働いたことのあるプログラマーの過ちを繰り返すつもりはありません。

私の場合、私はさまざまなソリューションから選択します(ただし、これは確かではありません):

解決策 1: 横向きと縦向きに異なる xib を作成します。モジュール性の利点があります。後で、さまざまな理由でランドスケープが必要なくなった場合、コードから簡単にリンクを解除できます。新しいビューを作成するという欠点がありますが(キャッシュすることもできます)、それでもオブジェクトが異なり、モデル-View2-コントローラー間でデータの同期が必要です。

解決策 2: 1 つの xib ファイルのみを使用し、サイズ インスペクター (5 番目のタブ) でプロパティを設定してコンポーネントを自動的にレイアウトします。構成が非常に難しい

解決策3:そのxibファイル内でコンポーネントランドスケープを作成し、それらのコンポーネントを予想されるデザイン、サイズに合わせてレイアウトし、実行時にそれらのサイズを読み取って設定しますが、これは視覚的に編集できます。

ストーリーボードまたはxib、それは私にとってほとんど同じです.2つのUIViewControllerがあり、ポートレート/ランドスケープをポップ/プッシュして、スタックが回転でいっぱいにならないようにすることができます:)

まったく回転しない場合の速度は最高ですが、それでも必要な場合は、可視性を2〜4回変更する必要がないため、1つのxibに2つのコンポーネントがあり、多くの関数呼び出しがトリガーされます。 viewwillappear、wiewdidapear、viewwilldisapers など。

于 2012-09-08T19:29:52.910 に答える