0

デフォルトで imageView によって非表示にする必要がある containerView があります。起動時にイメージがコンテナを覆う必要があります。ただし、IB の階層化が正しく、コンテナの後に imageView が更新されたとしても、コンテナはまだ画像の前に表示されています。これが起こらないようにする方法はありますか?

IBの概要は次のとおりです。

ここに画像の説明を入力

これを最初に投稿したとき、私は画像ビューと、メイン ビュー内のビューの 3 つのボタンを持っていました。しかし、それ以来、私はそれが示されている方法に変更しました.

次のように、サブビューごとにアウトレットがあるとします: Container View-Container、Image View-backgroundImage、Buttons-item1、item2、item3。

ここに私が試したことのリストがあります:

  1. [self.view sendSubviewToBack: _Container];
  2. [self.view bringSubviewToFront: _item1];
  3. [self.view bringSubviewToFront: _item2];
  4. [self.view bringSubviewToFront: _item3];
  5. [self.view bringSubviewToFront: _backgroundImage];

ビューコントローラーの可視座標からコンテナービューを移動しようとしましたが、これもうまくいきませんでした。

また、View Controller の viewDidAppear メソッドは次のとおりです。

最初にコンテナ ビューを設定し、次にボタンとイメージ ビューの初期設定を行います。このメソッドの一番下は、サブビュー コマンドを配置した場所です。うまくいけば、これは役に立ちます。

-(void) viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];
[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];

_item1.center = self.view.center;
_item2.center = self.view.center;
_item3.center = self.view.center;
_item1.layer.anchorPoint = CGPointMake(.5,1.5);
_item3.layer.anchorPoint = CGPointMake(.5,-.5);

CGAffineTransform move1 = CGAffineTransformMakeTranslation(0, -15);
CGAffineTransform move3 = CGAffineTransformMakeTranslation(0, 15);

_item1.transform = move1;
_item3.transform = move3;

[_item1 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item2 setTranslatesAutoresizingMaskIntoConstraints:YES];
[_item3 setTranslatesAutoresizingMaskIntoConstraints:YES];

CGAffineTransform scale = CGAffineTransformMakeScale(1.25, 1.25);

_item1.transform = scale;
_item2.transform = scale;
_item3.transform = scale;

_item1.alpha = menuAlpha;
_item2.alpha = menuAlpha;
_item3.alpha = menuAlpha;

_menuBackground.image = [self applyBlurWithRadius:10
                                        tintColor:[UIColor colorWithWhite:.3 alpha:.7]
                            saturationDeltaFactor:1
                                        maskImage:nil];

}

4

1 に答える 1

0

あなたの質問のタイトルにもかかわらず、厄介なビューはコンテナ ビューではありません。置いたところにとどまっています。厄介なビューはのビューであり、ストーリーボードのスクリーン ショットには表示されない追加の包含ビューです。

それが何であるかを本当に理解せずに埋め込みセグエを使用した可能性があります。コンテナ ビューとコンテナ ビュー コントローラ、およびその他のビュー コントローラがあることに気付きました。自分自身を混乱させてしまったのかもしれません。

考えられる最初の解決策の 1 つは、次の行を削除 (コメント アウト) することです。

[self.containerViewController performSegueWithIdentifier:@"embedConverter" sender:nil];
  • 不要です。コンテナー ビューから既に埋め込みセグエがあり、これは自動的に実行されます。コンテナー ビューが正しいビュー コントローラーとそのビューを自動的に読み込まない場合は、ストーリーボードでこの設定が間違っています (おそらく、コンテナーのレベルが多すぎます)。

  • これはView Controllerの親子関係です。これは、子ビュー コントローラーが登場し、まったく新しいビューであるそのビューがインターフェイスに挿入されることを意味します。これは、ビューの前後の位置を制御できない理由を説明しています! 「コンテナ ビュー」は好きなようにいじることができますが、問題を引き起こしているのは表示されているビューではありません。問題を引き起こしているのは新しいビューです。したがって、画像ビューを前面に移動していますが、この新しいビューはすべての前面に挿入されています。

しかし、私はさらに先に進みます。埋め込みセグエを使用することで、注入されたビューのレイヤー順序をすべて制御できなくなります。次の 2 つの質問を自問することをお勧めします。

  1. 親子View Controllerの関係は本当に必要ですか? 多くの場合、答えはノーです。たとえば、インターフェイス内に小さなテーブル ビューが必要だとします。これにはテーブルビューコントローラーと埋め込みセグエが必要だと考える人もいます。しかし、そうではありません。テーブルビューコントローラーは決して必要ではなく、ビューとしてテーブルを管理することができます。

  2. (1) に対する答えが本当に「はい」の場合、この関係 (および結果として挿入されたビュー) を手動で管理したほうがよいでしょうか?

(2) を行った場合、コンテナー ビューは必要なく、注入されたビューをインターフェイスに配置する場所と方法を完全に制御できます。

于 2014-06-01T15:23:44.780 に答える