# HomeView [SwiftUI 開発記録](https://hackmd.io/29GdyEJPQ2yDAmajfRq0Gw?both#SwiftUI-%E9%96%8B%E7%99%BA%E8%A8%98%E9%8C%B2) ![test1](https://hackmd.io/_uploads/SJno_reWC.gif) [TOC] #### 機能追加情報 > [time=Sat, Apr 20, 2024 3:33 AM] * DatePickerの追加 * 円グラフ * カラー変更 * キャプション削除 * 中央へのテキスト配置 * リスト(プレーンスタイル)の追加 --- #### now code ```swift= // // HomeView.swift // Financial_iPhoneApp // // Created by 有田健一郎 on 2024/02/29. // import SwiftUI import Charts struct FavoriteFruit { let name: String let count: Int var color: Color } struct HomeView: View { let calendar = Calendar.current let formatter = DateFormatter() @State private var selectedDate: Date = Date() @State private var selectedDateString: String = "" @State private var selectedDay: Date? @State private var favoriteFruits: [FavoriteFruit] = [ .init(name: "月の限度額", count: 3, color: .blue), .init(name: "使用金額", count: 1, color: .gray) ] init() { formatter.dateFormat = "yyyy年 MM月" } @State private var isDatePickerVisible = false // 選択された年と月 @State private var selectedYear: Int = Calendar.current.component(.year, from: Date()) @State private var selectedMonth: Int = Calendar.current.component(.month, from: Date()) // 表示する年の範囲 private let minYear: Int = 2000 private let maxYear: Int = 2024 var body: some View { VStack { // 月の切り替えボタン HStack { Button(action: { self.selectedDate = self.calendar.date(byAdding: .month, value: -1, to: self.selectedDate)! }) { Image(systemName: "chevron.left") } Spacer() // 選択された月の表示 Button(action: { // 月の表示部分がタップされたらDatePickerを表示する self.isDatePickerVisible.toggle() }) { Text(formatter.string(from: selectedDate)) .font(.title) .padding() } Spacer() Button(action: { self.selectedDate = self.calendar.date(byAdding: .month, value: 1, to: self.selectedDate)! }) { Image(systemName: "chevron.right") } } .padding(.horizontal) Divider() // スペースを追加 Spacer().frame(height: 20) ZStack { Chart(favoriteFruits, id: \.name) { favoriteFruit in SectorMark( angle: .value("count", favoriteFruit.count),innerRadius: .inset(30) ) .foregroundStyle(favoriteFruit.color) } // 円グラフの中心に表示するテキスト Text("● ").foregroundColor(.gray).font(.caption) + Text("月の限度額:100,000円").font(.subheadline).foregroundColor(.black) + Text("\n● ").foregroundColor(.blue).font(.caption) + Text(" 使用金額:75,000円").font(.subheadline).foregroundColor(.black) //.offset(y: -20) // テキストを上に20ポイント移動 } .frame(width: 300, height: 300) Spacer().frame(height: 30) Text("\(formatter.string(from: selectedDate)) 使用内容").font(.body) Divider() // リスト表示 List { Text("あいうえお") Text("かきくけこ") Text("さしすせそ") Text("たちつてと") Text("なにぬねの") Text("はひふへほ") Text("まみむめも") Text("やゆよ") Text("わをん") } .listStyle(.plain) } .padding(.bottom, 20) // 下部に余白を追加 .sheet(isPresented: $isDatePickerVisible) { // 年月のピッカーを表示するためのシート VStack { // DatePickerを閉じるボタン Button(action: { self.isDatePickerVisible = false // 選択された年月からDateを生成 self.selectedDate = self.calendar.date(from: DateComponents(year: selectedYear, month: selectedMonth)) ?? Date() }) { Text("閉じる") .foregroundColor(.blue) .padding() } HStack { // 年のピッカー Picker(selection: $selectedYear, label: Text("")) { ForEach(minYear...maxYear, id: \.self) { year in Text("\(String(year))年").tag(year) // Stringに変換しないとカンマが入ってしまう } } .pickerStyle(WheelPickerStyle()) .labelsHidden() .frame(maxWidth: .infinity) // 月のピッカー Picker("Month", selection: $selectedMonth) { ForEach(1...12, id: \.self) { month in Text("\(month)月") } } .pickerStyle(WheelPickerStyle()) .frame(maxWidth: .infinity) }.toolbar { } }.presentationDetents([.height(280)]) // シートの高さ } } } #Preview { HomeView() } ``` > [time=Sat, Apr 20, 2024 3:29 AM][name=ariken][color=#31b4ed] --- #### old ```swift= ``` > [time=Sat, Apr 20, 2024 3:29 AM][name=ariken][color=#31b4ed]