1

加速度計によって報告された値に応じて、一連の異なるビューのいずれかを表示する必要があるアプリケーションがあります。Xcode、née Interface Builder の Storyboard Editor でビューを設定したいと思います。さらに、Xcode の新しい自動レイアウト ツールを使用したいと考えています。基本的に、これらのツールを使用すると、オブジェクト間の制約を定義でき、ランタイム システムがオブジェクトの行き先を把握します。

疑似コードで、私が望むものの簡単な例を次に示します。

if (accelerometer == toTheLeft) {
    [topLevelView showSubview:leftView];
} else if (accelerometer == toTheRight) {
    [topLevelView showSubview:rightView];
} else {
    [topLevelView showSubview:centerView];
}

架空のshowSubview:方法を実行するには、現在表示されている間違ったビューを実際に削除し、必要なビューを追加する必要があることはわかっていますが、それはここでのポイントではありません。

前に述べたように、 Storyboard Editor/Interace Builder を使用して、これらの各UIViewオブジェクト (つまり、leftViewrightView、および) をレイアウトしたいと思います。centerViewただし、そうしようとすると、IB でさまざまなビューが積み重なって混乱することになります。私のView Controllerは最終的にそのビューからビューを追加および削除しますが、自動レイアウトの設定はこの方法ではかなり困難です.

最後に質問です。 1 つのビュー コントローラーのストーリーボード エディターで、重なり合うことが多い多くのビューを簡単に配置するより良い方法はありますか、それともプログラムですべてを設定する必要がありますか?


熱心な読者のための内省的なよくある質問:

  1. Storyboard Editor/IB に固執するのはなぜですか? ビューの配置とサイズ変更の面倒な部分の多くを自動的に把握します。それはいいです!できることなら、自分のために働かせたいと思っています。

  2. 誰かが以前にこれを尋ねたに違いありませんよね?ええと、ちょっと。 この質問は、私が見つけたものの中で最も近いものです。ただし、このソリューションでは、フレームをプログラムで設定する必要があり、IB を使用する最善の理由であると思われる自動レイアウトが無効になります。 これも私を興奮させましたが、実際には同じことではありません。

4

2 に答える 2

1

私が取り組んでいたアプリケーションでも同様の状況がありました。私がしたことは、2 つのコンテナー ビューをメインのビュー コントローラーに追加したことです (1 つしか必要ないように聞こえますが)。コンテナー内に埋め込まれたビューを削除し、ヘッダー ファイルに IBOutlets として追加しました。

@property (weak, nonatomic) IBOutlet UIView *topContainerView;
@property (weak, nonatomic) IBOutlet UIView *bottomContainerView;

次に、使用したい 3 つの子ビューのそれぞれに UIViewControllers を作成し、ストーリーボードを介してデザインできるようにしました。

私の実装ファイルには、さらに 2 つのプロパティがありました。

@interface WorkOrderContainerViewController ()
@property UIViewController *topViewController;
@property UIViewController *bottomViewController;
@end

どのビュー コントローラーを表示するかを切り替えるには、次の方法を使用しました (ボトム コンテナー ビューにも同様の方法が 2 つあります)。

- (void)presentTopViewController:(UIViewController *)viewController
{
    // Remove current top view controller.
    if (topViewController != nil) {
        [self removeTopViewController];
    }

    [self addChildViewController:viewController];
    [[viewController view] setFrame:[topContainerView bounds]];
    [topContainerView addSubview:[viewController view]];
    [self setTopViewController:viewController];
    [viewController didMoveToParentViewController:self];
}

- (void)removeTopViewController
{
    [topViewController willMoveToParentViewController:nil];
    [[topViewController view] removeFromSuperview];
    [topViewController removeFromParentViewController];
}

次に、ビューを単純にインスタンス化できます

[self presentTopViewController:[storyboard instantiateViewControllerWithIdentifier:@"leftView"]];

重複するビューを管理する方法を探していたことは知っていますが、それぞれを個別のビュー コントローラーとしてこの方法で実行する方がおそらく簡単でしょう。

于 2013-09-27T21:40:40.163 に答える
0

3 つのタブを持つタブ ビュー コントローラーを使用して、タブ バーを非表示にすることができます。これは、技術的にも意味的にもあなたのシナリオに非常によく当てはまると思います。

于 2013-09-29T20:35:36.060 に答える