Closed tora-muscle closed 1 year ago
追加点
小目標カード
、小目標追加ボタン
大目標追加ボタン
押下時、つまり新規大目標作成時は 大目標カード
にはtitle
、小目標追加ボタン
、プログレスサークル
のみ表示opacity 25%
calendar
をインスタンス化し、dateComponents
で指定データを取得calendar.date(bySettingHour:)
で取得したい時間を設定DateComponents
型から作成したDate
型のインスタンスは、Date
型がComparable
プロトコルとStrideable
プロトコルに準拠しているため、2つの Date 型のインスタンス間の差を算出することができる。// 月曜日の0時0分0秒を返す関数
func getMondayOfCurrentWeek() -> Date {
// current プロパティを呼び出して、システム時間に基づくカレンダーインスタンスを取得
let calendar = Calendar.current
// 現在の日付から「年・週」の情報を取得
var components = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: Date())
// 月曜日の情報を設定
components.weekday = 2
// DateComponents 型変数の components から Date 型のインスタンスを作成
let monday = calendar.date(from: components)!
return calendar.date(bySettingHour: 0, minute: 0, second: 0, of: monday)!
}
// その週の月曜日の0時0分0秒と日曜日の23時59分59秒を返す関数
func getWeekRange() -> (monday: Date, sunday: Date) {
let calendar = Calendar.current
let monday = getMondayOfCurrentWeek()
// 月曜日の日付を基に、6日加算した日付、つまり、日曜日を取得
let sunday = calendar.date(byAdding: .day, value: 6, to: monday)!
let sundayEndOfDay = calendar.date(bySettingHour: 23, minute: 59, second: 59, of: sunday)!
return (monday, sundayEndOfDay)
}
▼ 参考記事
init(@ViewBuilder)
を使うと、View
を受け取って中身として表示する実装にできる!!
struct WeekProgressBarCard: View {
let today = Date()
let calendar = Calendar.current
var body: some View {
let weekRange = getWeekRange()
let progress = 0.71 // 現時点ではモック化のために定数に設定
ZStack {
VStack(spacing: 20) {
Spacer().frame(height: 7)
HStack {
let (_, _) = getWeekRange()
Text(formatWeekRangeText(weekRange))
.font(.system(size: 20))
.fontWeight(.bold)
.foregroundColor(Color.uiColorGray)
Spacer()
}
HStack {
Spacer()
CustomProgressBar(progress: progress)
.frame(height: 20)// 進捗ごとに色を変える実装にする予定
Spacer()
}
}
.padding(Edge.Set.horizontal, 50)
.background(
GeometryReader { geometry in
Rectangle()
.fill(Color.cardColorGray)
.cornerRadius(25)
.padding(Edge.Set.horizontal, 25)
// 子 View の高さに応じて可変するようにした
.frame(height: geometry.size.height + 20)
}
)
}
.frame(height: 120) // WeekProgressBarCardの最小の高さ
}
}
▼ 切り出し後(モデル)
struct CardView<Content: View>: View {
let content: Content
// 渡された View を content に保持させることで body で使えるようにしている
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
var body: some View {
ZStack {
VStack(spacing: 20) {
Spacer().frame(height: 7)
content
}
.padding(Edge.Set.horizontal, 50)
.background(
GeometryReader { geometry in
Rectangle()
.fill(Color.cardColorGray)
.cornerRadius(25)
.padding(Edge.Set.horizontal, 25)
.frame(height: geometry.size.height + 20)
.shadow(color: Color.black.opacity(0.2), radius: 10, x: 0, y: 5)
}
)
}
.frame(height: 120)
}
}
▼ 参考文献
▼ 現象
▼ 原因
ZStack
がキーボード出現時に縮んでしまっている。var body: some View {
ZStack {
// 背景色.
Color.backGroundColorGray.ignoresSafeArea()
// メイン画面部分はTabViewで定義.
TabView(selection: $selected) {
ForEach(0 ..< 3) { index in
bottomBarItems[index].view
.tag(index)
}
}
// PageTabスタイルを利用する(インジケータは非表示).
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
VStack {
Spacer(minLength: 0)
// タブビュー部分.
HStack (spacing: (UIScreen.main.bounds.width - 100.0) / 3){
ForEach(0 ..< 3) {
// 略
}
.foregroundColor(self.selected == index ? Color.uiColorGreen : Color.uiColorGray)
.scaleEffect(self.selected == index && self.isBig ? 1.3 : 1.0)
}
}
// 略
}
}
}
}
▼ 解決法
ZStack
に.ignoresSafeArea(.keyboard, edges: .bottom)
プロパティを設定し、ZStack
をセーフエリアから除外▼ 動作確認
動作環境 : iOS16.1.1 iPhone12Pro
▼ 参考記事
0942e4e
iOS16.0以上対応になったaxis: .vertical
の対応バージョンが iOS16 以降なので別の実装方法を模索した方がいいかも。。。
TextField("task title", text: $taskTitle, axis: .vertical)
.font(.system(size: 20))
.fontWeight(.bold)
.foregroundColor(Color.uiColorGray)
▼ 参考文献
WeekProgressBarCard()
にTaskCard()
が覆い被さる▼ 関連コミット
▼ 現象
▼ 原因
CardView
の高さが固定値だったので、テキスト入力でTaskCard()
が大きくなろうがCardView
は大きくなっていなかった。
▶︎ 中身だけ肥大して肝心な部分は大きくならないのでいくらpadding
を設定しても意味ない状況CardView
のframe()
プロパティに設定されていた定数 120 はCardView
の高さが中身によって変動する際の「初期値だと思っていた」ら違った。。。▼ 解決法
.frame(height: 120)
を取り除き、CardView()
の高さを可変にする
▶︎ TaskCard()
のTextField("task title", text: $taskTitle, axis: .vertical)
への入力行数に応じて高さが変わるのでWeekProgressBarCard()
とTaskCard()
の隙間を常に保つことができる。▼ 動作確認 動作環境 : iOS16.1.1 iPhone12Pro
この修正に2時間。。。参考文献なし。。。つらい
TaskCardView
のしたの透明 view の高さを大きくする。ObservableObject
が使えそうObservableObject
として定義すれば解消できるのでは?isTaskDone
を@Publish
に含め、一元管理しないといけない?
view
を持たせること自体がequatable
に準拠させる必要が〜など、面倒臭い実装の元になる。。「もっと簡単」を探すべき▼ 最終的なPlanDo画面
での状態管理変数
class TaskCardManager: ObservableObject{
@Published var taskCardData = [
(
taskTitle: String,
todoData: [(todoText: String, isDone: Bool)]
)
]()
}
https://nrslib.com/clean-ddd-entity/ より拝借
What?
Why?
DDD から得られる恩恵
ビジネス要件の明確化
ビジネスドメインの知識を中心に設計することで、ビジネス要件を明確にすることができる。
モジュールの分離
ビジネスロジックやドメインオブジェクトを明確に定義することにより、モジュールの責務を明確に分離することができる。
テストの容易化
ビジネスロジックやドメインオブジェクトが明確に定義されているため、テストの容易化が期待できる。
可読性の向上
ビジネスドメインに基づいて設計されたコードは、エンジニア以外でも理解しやすい可読性の高いコードになる。
拡張性の向上
ビジネスドメインに基づいて設計されたコードは、ドメインの変更に柔軟に対応することができる。
技術的負債の低減
ビジネスドメインに基づいた設計は、長期的なメンテナンスや拡張において技術的負債を減らすことができる。
▼ 参考記事
TabView
にignoresSafeArea
が適用されない▼ 現象
▼ 原因
ZStack
にframe(height:)
が設定されておらず、ignoreSafearea
を指定している意味がなかった
▼ 解決法
TabView
をラップしているZStack
にframe(height:)
で「画面と同じ高さ」を指定var body: some View {
ZStack {
// 背景色.
Color.backGroundColorGray.ignoresSafeArea()
// メイン画面部分はTabViewで定義.
VStack {
Color.clear.frame(height: 15)
TabView(selection: $selected) {
ForEach(0 ..< 3) { index in
bottomBarItems[index].view
.tag(index).ignoresSafeArea()
}
}
// PageTabスタイルを利用する(インジケータは非表示).
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
Color.clear.frame(height: 65)
}
// 中略
}
// ↓↓↓追加↓↓↓
.frame(
width: UIScreen.main.bounds.width ,
height: UIScreen.main.bounds.height
)
.ignoresSafeArea(.keyboard)
}
▼ 動作確認 動作環境 : iOS16.2 iPhone14(エミュレータ)
▼ 参考記事
✨ 実現したいこと
[x] ヘッダーカード
FF575F
→ 黄FFC542
→ 緑00DBB5
を想定。逐次検討[x] ボディカード
50% or 100%
[x] +ボタン
[x] その他
🚩 やらないこと
🔀 達成条件
👀 備考