ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
SwiftUI のツールバー
iOS 14 / macOS 11 から導入された .toolbar モディファイアで宣言的にツールバーを構築します。NavigationView / NavigationStack の上下バーや、独立ウィンドウのツールバーに使えます。
1. 最小例 (NavigationStack + ナビゲーションバー右)
import SwiftUI
struct ContentView: View {
@State private var items: [String] = []
var body: some View {
NavigationStack {
List(items, id: \.self) { Text($0) }
.navigationTitle("リスト")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
items.append("Item \(items.count + 1)")
} label: {
Image(systemName: "plus")
}
.accessibilityLabel("追加")
}
}
}
}
}
2. placement の種類
| placement | 表示位置 |
|---|---|
.navigationBarLeading | ナビゲーションバー左端 |
.navigationBarTrailing | ナビゲーションバー右端 |
.principal | ナビゲーションバー中央 (タイトル位置) |
.bottomBar | 画面下部のツールバー |
.topBarLeading / .topBarTrailing | iOS 17+ の汎用版 |
.keyboard | キーボード上に表示 (テキスト入力時) |
.confirmationAction | OK / 完了相当 (右側) |
.cancellationAction | キャンセル相当 (左側) |
.destructiveAction | 削除系 |
3. 複数ボタンを並べる (ToolbarItemGroup)
.toolbar {
ToolbarItemGroup(placement: .navigationBarTrailing) {
Button { share() } label: {
Image(systemName: "square.and.arrow.up")
}
Button { favorite() } label: {
Image(systemName: "star")
}
Menu {
Button("並び替え") { sort() }
Button("フィルタ") { filter() }
Divider()
Button("削除", role: .destructive) { delete() }
} label: {
Image(systemName: "ellipsis.circle")
}
}
}
4. 下部バー (bottomBar) + Spacer
.toolbar {
ToolbarItemGroup(placement: .bottomBar) {
Button("削除", role: .destructive) { delete() }
Spacer() // ★ 左右に分離
Text("\(items.count) 件")
Spacer()
Button("追加") { add() }
}
}
// 下部バーを常に表示
.toolbarBackground(.visible, for: .bottomBar)
.toolbarBackground(Color.blue, for: .bottomBar)
5. シート/モーダル内のキャンセル・完了
struct EditView: View {
@Environment(\.dismiss) var dismiss
@State var name: String = ""
var body: some View {
NavigationStack {
Form {
TextField("名前", text: $name)
}
.navigationTitle("編集")
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("キャンセル") { dismiss() }
}
ToolbarItem(placement: .confirmationAction) {
Button("保存") {
save()
dismiss()
}
.disabled(name.isEmpty)
}
}
}
}
}
6. キーボード上のツールバー
@FocusState private var focused: Bool
TextField("入力", text: $text)
.focused($focused)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("完了") { focused = false }
}
}
7. principal でカスタムタイトル
.toolbar {
ToolbarItem(placement: .principal) {
HStack {
Image(systemName: "wifi")
Text("接続中")
.font(.headline)
}
}
}
.navigationBarTitleDisplayMode(.inline)
UIKit のツールバー
UIKit では UINavigationItem と UIToolbar の 2 系統があります。
8. ナビゲーションバーのボタン (UIKit)
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = "リスト"
// 右ボタン
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .add,
target: self,
action: #selector(addTapped)
)
// 左ボタン (カスタム画像)
let cancel = UIBarButtonItem(
image: UIImage(systemName: "xmark"),
style: .plain,
target: self,
action: #selector(cancelTapped)
)
navigationItem.leftBarButtonItem = cancel
// 複数ボタン
navigationItem.rightBarButtonItems = [
UIBarButtonItem(systemItem: .action, primaryAction: nil),
UIBarButtonItem(systemItem: .bookmarks, primaryAction: nil),
]
}
@objc func addTapped() { /* ... */ }
@objc func cancelTapped() { dismiss(animated: true) }
}
9. UIToolbar (下部ツールバー)
let toolbar = UIToolbar()
toolbar.translatesAutoresizingMaskIntoConstraints = false
let trash = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteTapped))
let flex = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let add = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
toolbar.items = [trash, flex, add]
view.addSubview(toolbar)
NSLayoutConstraint.activate([
toolbar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
toolbar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
toolbar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
])
10. Storyboard でツールバー設置
- Object Library から Navigation Item または Toolbar をドラッグ
- Bar Button Item を Navigation Bar 上にドロップ
- Attributes Inspector で System Item を選択 (Add / Done / Cancel など)
- Control + Drag でアクションを ViewController に接続
SF Symbols 一覧
iOS 13+ に標準搭載される 5,000+ 種類のベクターアイコン。
| 用途 | シンボル名 |
|---|---|
| 追加 | plus / plus.circle |
| 削除 | trash / minus |
| 共有 | square.and.arrow.up |
| 編集 | pencil / square.and.pencil |
| お気に入り | star / heart |
| 戻る | chevron.left |
| その他 | ellipsis / ellipsis.circle |
| 検索 | magnifyingglass |
Mac のSF Symbols アプリで全シンボルを検索できます。
アクセシビリティ対応
Button { add() } label: {
Image(systemName: "plus")
}
.accessibilityLabel("新しい項目を追加") // VoiceOver 読み上げ
.accessibilityHint("タップでアイテムを追加") // ヒント (二度押し時)
.accessibilityAddTraits(.isButton) // 役割明示
FAQ
Q: ツールバーが表示されない
A: NavigationStack / NavigationView で包んでいますか? .toolbar は親に navigation context が必要です。
Q: bottomBar が出ない
A: .toolbar(.visible, for: .bottomBar) を追加。または TabView 内では別途設計。
Q: Image(systemName:) が表示されない
A: シンボル名が存在しないか、iOS バージョン不足。SF Symbols アプリで確認し、if #available(iOS 17, *) でガード。
Q: ボタンに色を付けたい
A: .tint(.red) または .foregroundStyle(.red)。ナビゲーションバー全体は .toolbarBackground(.blue, for: .navigationBar)。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。



ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?