検索時にツールバーが非表示にならないようにしたい【searchPresentationToolbarBehavior】

この記事は約4分で読めます。

searchPresentationToolbarBehaviorは、SwiftUIで検索バーの表示動作を制御するために使用されます。

デフォルトの動作においては、検索フィールドに文字を入力する際にツールバーのコンテンツが非表示になります。
このプロパティを設定することで、検索時にもツールバーのコンテンツを表示したままにすることができます。

  • iOS:17.1以上
  • XCode(当サイトの環境):15.0.1

基本的な使い方

searchPresentationToolbarBehaviorには、以下の3つのオプションがあります:

  • .automatic: デフォルトの動作を使用します
  • .avoidHidingContent: 常にツールバーのコンテンツを表示します

サンプルコード

以下はリストビューに、ツールバー上部にボタンと検索フィールドを表示しています。

searchPresentationToolbarBehaviorのオプションを切り替えることで、検索フィールド入力時のツールバー表示、非表示を切り替えられます。

import SwiftUI

struct searchPresentationToolbarBehaviorSmp: View {
    @State private var searchText = ""

    var body: some View {

        NavigationStack {
            List {
                ForEach(0..<100) { index in
                    Text("Item \(index)")
                }
            }
            .toolbar {
                ToolbarItem(placement: .confirmationAction) {
                    Button(action: {
                        print("confirmation button tapped")
                    }) {
                        Image(systemName: "star")
                    }
                }
                ToolbarItem(placement: .cancellationAction) {
                    Button(action: {
                        print("cancellation button tapped")
                    }) {
                        Image(systemName: "heart")
                    }
                }
            }
            .searchable(text: $searchText, placement:.navigationBarDrawer(displayMode: .always), prompt: "検索文字列")
            .navigationTitle("Searchable List")
            .searchPresentationToolbarBehavior(.automatic)
        }
    }
}

サンプルコードの動作

searchPresentationToolbarBehaviorにおいて、avoidHidingContentを指定すると、右側のように検索フィールドに文字列を入力してもツールバーのコンテンツを表示したままにすることができます。

.searchPresentationToolbarBehavior(.automatic)
.searchPresentationToolbarBehavior(.avoidHidingContent)

まとめ

earchPresentationToolbarBehaviorを使用することで、SwiftUIアプリケーションにおける検索バーの表示動作を簡単に制御することができます。細かい部分ですが、よければ参考にしてください。

タイトルとURLをコピーしました