web-dev-qa-db-ja.com

自動レイアウトと「プッシュ時に下部バーを非表示にする」

私のアプリの(簡略化された)構造は次のとおりです。

UITabBarControllerは、1つのUINavigationControllerを保持し、UITableViewControllerをルートビューコントローラーとして保持します。

テーブルビューコントローラーセルの1つをタップすると、通常のUIViewController(VCと呼びます)を押して、最後のタブバーを非表示にします。 (「プッシュ時に下部バーを非表示にする」フラグを使用)

ストーリーボードでは、通常のUIViewサブクラスをVCに追加します。これは下部バーのように見えます。自動レイアウトを使用して、VCビュー。

問題
プッシュVCこのビューが下部に固定されるまでに1秒かかります。自動レイアウトでは、タブバーが非表示になっていないように下部に固定されます。しばらくすると、タブバーが非表示になっていることが認識され、ビューの真下に移動します。

私はそれが最良の説明ではないことを知っているので、問題を示すために 非常に単純なプロジェクト を追加しました。

40
Eyal

問題は、ビューと下部レイアウトガイドの上部の間にあるこの特定の制約にあります。

enter image description here

制約を選択し、その「Second Item」プロパティを編集します

enter image description here

ここで下を選択する必要があります

enter image description here

それができたら、ピンクのビューはレイアウトガイドの影響を受けなくなります。レイアウトガイドは、プッシュされたView Controllerのルートビューがメイン画面の境界内にある場合にのみTab Barが非表示になることを認識しており、これはアニメーションが終了したときにのみ発生します。

そして、それがビューの階層を再度レイアウトする必要がある理由であり、それが不要なアニメーションを引き起こします。

62
Earl Grey

受け入れられた答えは私にはうまくいきませんでした(オプションは利用できませんでした)。しかし、別の解決策を見つけました。 ( 自動レイアウトでプッシュされたときに下部バーを非表示にする )に基づく

ビューと整列するオブジェクト(この場合はbtnShare)を選択し、新しい整列制約(ボトムエッジ)を追加します。

enter image description hereenter image description here

32
Vincenzo

こんにちは、ストーリーボードでTabバーを選択し(Tab Bar Controller Scene> Tab Bar Controller> Tab Bar)、属性インスペクターでTranslucentボックスをオフにします。このアクションは問題を修正します。 (ただし、「プッシュ時に下部バーを隠す」はツールバーにあります)。

14
Onik IV

「Navigation Controller」を選択し、「Attribute Inspector」で「Under Bottom Bars」からチェックマークを外します。

6
Arash

Xcode 7以降でbottomlayoutguide bottomを選択できない場合

like there 単に次の操作を行います:ストーリーボードをソースコードエディターで開きます

open in editor コントローラーの識別子を検索

search in source file find <layoutGuides>、タイプ<bottom>、IDをコピー

find layoutGuides ID変更属性で上から下へ検索

find and replace お楽しみください。

ストーリーボードで、Tabバーを非表示にするView Controllerに移動し、Attribute Inspectorをクリックして、押されたときに下のバーを非表示にします。以下の画像を確認してください。

storyboard example

3
Mário Carvalho

タブバーを非表示にする場合は、このコードをコントローラーに追加して、

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tabBarController.tabBar.hidden = YES;
}

また、タブバーを表示するコントローラーにそのコードを配置する必要があります(ただし、NOを渡します)。また、IBの[プッシュ時に下部バーを隠す]ボックスの選択を解除する必要があります。

編集後:

最初のコントローラーで、非表示でないタブバーのアルファ値を短時間で0から1にアニメーション化すると、より良いアニメーションが得られます。これは、戻るボタンで戻る場合によく見えます。スワイプバックを使用する場合は、interactivePopGestureRecognizerを使用してより複雑な操作を行う必要があります。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tabBarController.tabBar.hidden = NO;
    self.tabBarController.tabBar.alpha = 0.0;
    [UIView animateWithDuration:.4 animations:^{
        self.tabBarController.tabBar.alpha = 1.0;
    }];
}
2
rdelmar

uINavigationBar TranslucentをNOに設定します。

このような: self.navigationController.navigationBar.translucent = NO;

1
taitanxiami
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.tabBarController.tabBar.hidden = NO;
    self.tabBarController.tabBar.alpha = 0.0;
    [UIView animateWithDuration:.3 animations:^{
        self.tabBarController.tabBar.alpha = 5.0;
    }];
}
1
Breno Morais

ビューの下部をスーパービューの下部に固定し、下部のレイアウトを固定しないでください

0
Karthik Rao