Conversation
|
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthrough챌린지 관련 뷰의 레이아웃·타이포그래피 조정, ChallengeProgressViewModel에 완료 판정 속성(isChallengeCompleted) 추가 및 완료 시 Coordinator로 조건부 네비게이션 로직 추가, 다수 이미지 자산을 SVG에서 PNG(1x/2x/3x)로 마이그레이션함. Changes
Sequence Diagram(s)sequenceDiagram
participant View as ChallengeProgressView
participant VM as ChallengeProgressViewModel
participant Coord as ChallengeCoordinator
View->>VM: await viewModel.advanceDay()
Note right of VM: currentDay 증가 및 상태 업데이트
VM-->>View: Published 상태 변경
alt VM.isChallengeCompleted == true
View->>Coord: challengeCoordinator.push(.startChallenge)
else
Note right of View: 추가 네비게이션 없음
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/Coordinator/ViewModel/ChallengeProgressViewModel.swift`:
- Around line 97-99: The isChallengeCompleted property currently hardcodes the
7-day completion check; change it to use a configurable duration value (e.g., a
Challenge.duration / totalDays constant or a value from the Challenge
model/repository) instead of the literal 7. Update ChallengeProgressViewModel to
reference that configurable property (for example challengeDuration or
challenge.totalDays) when evaluating currentDay in isChallengeCompleted so
different challenge lengths are supported. Ensure the new source is injected or
accessible in the ViewModel constructor or via its existing challenge/currentDay
data so you don't introduce globals.
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`:
- Around line 160-175: The completion branch calls
challengeCoordinator.push(.startChallenge) regardless of whether
viewModel.advanceDay() succeeded; modify the branch handling in the
CherrishButton action so you await and verify success before navigating: call
viewModel.advanceDay() and check its result (or catch errors if it throws) and
only call challengeCoordinator.push(.startChallenge) when advanceDay reports
success; update viewModel.advanceDay() to return a Bool or throw if it currently
doesn't so you can gate navigation in the completion path (symbols:
CherrishButton, viewModel.isChallengeCompleted, viewModel.advanceDay(),
challengeCoordinator.push(.startChallenge)).
| var isChallengeCompleted: Bool { | ||
| currentDay == 7 | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
완료 기준(7일) 하드코딩 확인 필요.
챌린지 기간이 고정 7일이 아니라면 데이터/상수로 분리해 기준을 맞추는 편이 안전합니다.
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/Coordinator/ViewModel/ChallengeProgressViewModel.swift`
around lines 97 - 99, The isChallengeCompleted property currently hardcodes the
7-day completion check; change it to use a configurable duration value (e.g., a
Challenge.duration / totalDays constant or a value from the Challenge
model/repository) instead of the literal 7. Update ChallengeProgressViewModel to
reference that configurable property (for example challengeDuration or
challenge.totalDays) when evaluating currentDay in isChallengeCompleted so
different challenge lengths are supported. Ensure the new source is injected or
accessible in the ViewModel constructor or via its existing challenge/currentDay
data so you don't introduce globals.
| CherrishButton( | ||
| title: "오늘 미션 종료하기", | ||
| title: viewModel.isChallengeCompleted ? "챌린지 종료하기":"오늘 미션 종료하기", | ||
| type: .small, | ||
| state: .constant(buttonState), | ||
| leadingIcon: nil, | ||
| trailingIcon: nil | ||
| ) { | ||
| Task { | ||
| await viewModel.advanceDay() | ||
| if viewModel.isChallengeCompleted { | ||
| Task { | ||
| await viewModel.advanceDay() | ||
| challengeCoordinator.push(.startChallenge) | ||
| } | ||
| }else { | ||
| Task { | ||
| await viewModel.advanceDay() | ||
| } |
There was a problem hiding this comment.
완료 분기에서 advanceDay 실패 시에도 네비게이션됩니다.
advanceDay()가 실패해도 곧바로 새 챌린지로 이동하면 서버 상태와 UI가 어긋날 수 있습니다. 성공 확인 후 이동하도록 가드가 필요합니다.
✅ 수정 제안
- if viewModel.isChallengeCompleted {
- Task {
- await viewModel.advanceDay()
- challengeCoordinator.push(.startChallenge)
- }
- }else {
- Task {
- await viewModel.advanceDay()
- }
- }
+ if viewModel.isChallengeCompleted {
+ Task {
+ await viewModel.advanceDay()
+ guard viewModel.errorMessage == nil else { return }
+ challengeCoordinator.push(.startChallenge)
+ }
+ } else {
+ Task {
+ await viewModel.advanceDay()
+ }
+ }🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`
around lines 160 - 175, The completion branch calls
challengeCoordinator.push(.startChallenge) regardless of whether
viewModel.advanceDay() succeeded; modify the branch handling in the
CherrishButton action so you await and verify success before navigating: call
viewModel.advanceDay() and check its result (or catch errors if it throws) and
only call challengeCoordinator.push(.startChallenge) when advanceDay reports
success; update viewModel.advanceDay() to return a Bool or throw if it currently
doesn't so you can gate navigation in the completion path (symbols:
CherrishButton, viewModel.isChallengeCompleted, viewModel.advanceDay(),
challengeCoordinator.push(.startChallenge)).
wotjs020708
left a comment
There was a problem hiding this comment.
고생하셨습니다. 근데 폰트 마다 높이 잡아주셔야 하는 거 아닌가요?
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Fix all issues with AI agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swift`:
- Around line 16-29: The fixed frame heights applied to TypographyText in
ChallengeLoadingView (the TypographyText(...) calls with .frame(height: ...))
prevent Dynamic Type resizing and can truncate text; remove the explicit
.frame(height:) on those TypographyText instances (or replace with a flexible
.frame(minHeight: ...) or no height constraint), add .lineLimit(nil) and
.fixedSize(horizontal: false, vertical: true) so lines can grow, and ensure the
TypographyText view itself uses a scalable font (applies .font with a
.scaledFont / .dynamicType support or .environment(\.sizeCategory) handling) so
the text responds to accessibility Dynamic Type changes.
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`:
- Around line 51-53: The ChallengeProgressView currently declares
`@EnvironmentObject` private var challengeCoordinator: ChallengeCoordinator which
can crash if not injected and declares `@StateObject` var viewModel:
ChallengeProgressViewModel with non-private visibility; update the view to
ensure safe EnvironmentObject usage by either (1) asserting or providing a
fallback when ChallengeCoordinator is missing at creation sites (verify all
ChallengeProgressView initializers call
.environmentObject(ChallengeCoordinator()) or wrap uses in a parent that injects
it) or (2) change the property to `@EnvironmentObject` private var
challengeCoordinator: ChallengeCoordinator? and guard/handle the nil case to
avoid runtime crashes; also make viewModel private (change to `@StateObject`
private var viewModel) and adopt the init-injection pattern for
ChallengeProgressView by adding an init(_ viewModel: ChallengeProgressViewModel)
that assigns _viewModel = StateObject(wrappedValue: viewModel) to satisfy
SwiftLint and visibility expectations, and then update all call sites to pass
the viewModel and ensure .environmentObject(ChallengeCoordinator) is applied
where the view is created.
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeSelectRoutineView.swift`:
- Around line 21-31: The two TypographyText views inside the VStack are forced
to a fixed height via .frame(height: 27.adjustedH) which can cause truncation
for longer translations or Dynamic Type; remove the fixed height or replace it
with a dynamic-friendly approach for the TypographyText components used here
(e.g., allow flexible height, remove .frame(height:), and if necessary add
modifiers like lineLimit(nil) / fixedSize(horizontal: false, vertical: true) or
use .multilineTextAlignment and a minHeight constraint) so the text can grow
with accessibility font sizes and long locales while keeping the existing VStack
and TypographyText usages intact.
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift`:
- Around line 20-23: The two TypographyText instances (the one with "이번엔 어떤 루틴으로
관리할까요?" using .frame(height: 30.adjustedH) and the one with "루틴을 지킬수록 체리가 성장해요."
using .frame(height: 24.adjustedH)) use fixed heights that can truncate wrapped
or localized text; remove the fixed .frame(height: ...) or replace it with a
flexible layout approach and enable multiline by adding lineLimit(nil) and
allowing vertical expansion (e.g., fixedSize(horizontal: false, vertical: true)
or no explicit height constraint) so the text can grow for wrapping/localization
while keeping any intended spacing via surrounding containers or Spacer.
♻️ Duplicate comments (1)
Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift (1)
169-183: 완료 분기에서 advanceDay 실패 여부 확인 없이 네비게이션됨
advanceDay()가 실패해도 종료 화면으로 이동할 수 있어 서버 상태와 UI가 어긋날 수 있습니다. 성공 확인 후 이동하도록 가드가 필요합니다.✅ 수정 제안
- if viewModel.isChallengeCompleted { - Task { - await viewModel.advanceDay() - challengeCoordinator.push(.startChallenge) - } - }else { - Task { - await viewModel.advanceDay() - } - } + if viewModel.isChallengeCompleted { + Task { + await viewModel.advanceDay() + guard viewModel.errorMessage == nil else { return } + challengeCoordinator.push(.startChallenge) + } + } else { + Task { + await viewModel.advanceDay() + } + }
| highlight(highlightText: viewModel.selectedRoutine?.description ?? "", normalText: "방향을 바탕으로") | ||
| .padding(.top, 113.adjustedH) | ||
| .frame(height: 27.adjustedH) | ||
| .padding(.top, 94.adjustedH) | ||
| TypographyText("TO-DO 미션을 만들고 있어요.", style: .title1_sb_18, color: .gray800) | ||
|
|
||
| LottieView(animationName: "splash", loopMode: .loop) | ||
| .frame(width: 130.adjustedW, height: 154.adjustedH) | ||
| .padding(.top, 60.adjustedH) | ||
|
|
||
| Spacer() | ||
| .frame(height: 80.adjustedH) | ||
|
|
||
| TypographyText("잠시만 기다려주세요!", style: .title2_sb_16, color: .gray800) | ||
| .frame(height: 27.adjustedH) | ||
| Image(.loading) | ||
| .frame(height: 364.adjustedH) | ||
| .padding(.top, 17.adjustedH) | ||
| TypographyText("잠시만 기다려주세요!", style: .title2_m_16, color: .gray800) | ||
| .frame(height: 24.adjustedH) | ||
| .padding(.top, 17.adjustedH) | ||
|
|
||
| Spacer() | ||
|
|
||
| TypographyText("AI가 맞춤형 루틴을 제작하고 있어요.", style: .body3_m_12, color: .gray600) | ||
| .frame(height: 17.adjustedH) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# ChallengeLoadingView.swift 파일 위치 및 크기 확인
find . -name "ChallengeLoadingView.swift" -type fRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 196
🏁 Script executed:
# 파일 내용 확인 (전체 구조 파악)
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 1841
🏁 Script executed:
# adjustedH가 무엇인지 확인 (커스텀 modifier 또는 extension 검색)
rg "adjustedH" --type swift -B 2 -A 2Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 50383
🏁 Script executed:
# TypographyText 구현 확인
find . -name "*.swift" -type f -exec grep -l "struct TypographyText" {} \;Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 139
🏁 Script executed:
# 다른 뷰에서 동적 타입 처리 방식 확인 (lineLimit, minimumScaleFactor 등)
rg "lineLimit|minimumScaleFactor|\.font\(" --type swift | head -30Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 585
🏁 Script executed:
# TypographyText 구현 찾기
find . -name "*.swift" -type f | xargs grep -l "struct TypographyText\|typealias TypographyText"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 139
🏁 Script executed:
# TypographyText의 전체 구현 확인
rg "struct TypographyText" -A 20 --type swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 1678
🏁 Script executed:
# Font+.swift 파일 내용 확인
cat -n ./Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 3963
🏁 Script executed:
# Adjust+.swift 전체 내용 확인
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Adjust+.swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 1218
TypographyText 동적 타입 대응 검토 필요
adjustedH는 기기별 비례 스케일링이므로 SE/Pro Max 간 높이 차이는 자동 조정됩니다. 그러나 TypographyText의 명시적 frame(height:)은 동적 타입 크기 변화에 대응하지 않아, 접근성 설정(Dynamic Type XL 이상)에서 텍스트 절단 가능성이 있습니다. 동적 타입 환경에서 테스트하고 필요시 lineLimit 또는 최소 높이 조정을 고려하세요.
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeLoadingView.swift`
around lines 16 - 29, The fixed frame heights applied to TypographyText in
ChallengeLoadingView (the TypographyText(...) calls with .frame(height: ...))
prevent Dynamic Type resizing and can truncate text; remove the explicit
.frame(height:) on those TypographyText instances (or replace with a flexible
.frame(minHeight: ...) or no height constraint), add .lineLimit(nil) and
.fixedSize(horizontal: false, vertical: true) so lines can grow, and ensure the
TypographyText view itself uses a scalable font (applies .font with a
.scaledFont / .dynamicType support or .environment(\.sizeCategory) handling) so
the text responds to accessibility Dynamic Type changes.
| @EnvironmentObject private var challengeCoordinator: ChallengeCoordinator | ||
| @StateObject var viewModel: ChallengeProgressViewModel | ||
|
|
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
EnvironmentObject 주입 보장 및 @StateObject 가시성 정리 필요
새로 추가된 EnvironmentObject가 상위에서 주입되지 않으면 런타임 크래시가 납니다. 생성 위치에서 주입 여부를 확인해 주세요. 또한 @StateObject는 보통 private로 두고 init에서 주입하는 패턴이 권장됩니다(SwiftLint 경고).
♻️ `@StateObject` 접근성 정리 제안
- `@StateObject` var viewModel: ChallengeProgressViewModel
+ `@StateObject` private var viewModel: ChallengeProgressViewModel
+
+ init(viewModel: ChallengeProgressViewModel) {
+ _viewModel = StateObject(wrappedValue: viewModel)
+ }#!/bin/bash
# ChallengeProgressView 생성 위치와 EnvironmentObject 주입 여부 확인
rg -n --type=swift -C3 '\bChallengeProgressView\b'
rg -n --type=swift -C3 '\.environmentObject\([^)]*ChallengeCoordinator'🧰 Tools
🪛 SwiftLint (0.57.0)
[Warning] 52-52: SwiftUI state properties should be private
(private_swiftui_state)
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeProgressView.swift`
around lines 51 - 53, The ChallengeProgressView currently declares
`@EnvironmentObject` private var challengeCoordinator: ChallengeCoordinator which
can crash if not injected and declares `@StateObject` var viewModel:
ChallengeProgressViewModel with non-private visibility; update the view to
ensure safe EnvironmentObject usage by either (1) asserting or providing a
fallback when ChallengeCoordinator is missing at creation sites (verify all
ChallengeProgressView initializers call
.environmentObject(ChallengeCoordinator()) or wrap uses in a parent that injects
it) or (2) change the property to `@EnvironmentObject` private var
challengeCoordinator: ChallengeCoordinator? and guard/handle the nil case to
avoid runtime crashes; also make viewModel private (change to `@StateObject`
private var viewModel) and adopt the init-injection pattern for
ChallengeProgressView by adding an init(_ viewModel: ChallengeProgressViewModel)
that assigns _viewModel = StateObject(wrappedValue: viewModel) to satisfy
SwiftLint and visibility expectations, and then update all call sites to pass
the viewModel and ensure .environmentObject(ChallengeCoordinator) is applied
where the view is created.
| VStack(alignment: .leading, spacing: 0){ | ||
| TypographyText("지금 나에게 가장 필요한", | ||
| style: .title1_sb_18, | ||
| color: .gray1000 | ||
| ) | ||
| .frame(height: 27.adjustedH) | ||
| TypographyText("관리 루틴을 선택해주세요.", | ||
| style: .title1_sb_18, | ||
| color: .gray1000 | ||
| ) | ||
| .frame(height: 27.adjustedH) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# 파일 구조 탐색
find . -type f -name "*.swift" | grep -i typography | head -20Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 196
🏁 Script executed:
# ChallengeSelectRoutineView.swift 전체 내용 확인
find . -path "*ChallengeSelectRoutineView.swift" -type fRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 196
🏁 Script executed:
# TypographyText 정의 찾기
rg "struct TypographyText|class TypographyText" -A 10Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 1081
🏁 Script executed:
# adjustedH 정의 찾기
rg "adjustedH" -B 2 -A 2Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 50383
🏁 Script executed:
# adjustedH 확장 함수 정의 찾기
rg "adjustedH" -B 5 -A 2 | grep -A 7 "func adjustedH\|extension.*adjustedH\|var adjustedH"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 2224
🏁 Script executed:
# TypographyText 전체 구현 확인
cat -n Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swift | head -100Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 3963
🏁 Script executed:
# 다이나믹 타입 지원 여부 확인
rg "dynamicTypeSize|preferredContentSizeCategory|@Environment.*dynamicTypeSize" -A 3Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 52
고정 높이로 다중 언어 확대 및 다이나믹 타입에서 텍스트 잘림 위험
.frame(height: 27.adjustedH)는 화면 비율만 조정하고 다이나믹 타입(시스템 폰트 설정)을 고려하지 않습니다. 긴 번역이 필요한 로케일이나 사용자가 텍스트 크기를 확대했을 때 두 줄이 지정된 높이를 초과하여 잘릴 수 있습니다.
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/ChallengeSelectRoutineView.swift`
around lines 21 - 31, The two TypographyText views inside the VStack are forced
to a fixed height via .frame(height: 27.adjustedH) which can cause truncation
for longer translations or Dynamic Type; remove the fixed height or replace it
with a dynamic-friendly approach for the TypographyText components used here
(e.g., allow flexible height, remove .frame(height:), and if necessary add
modifiers like lineLimit(nil) / fixedSize(horizontal: false, vertical: true) or
use .multilineTextAlignment and a minHeight constraint) so the text can grow
with accessibility font sizes and long locales while keeping the existing VStack
and TypographyText usages intact.
| TypographyText("이번엔 어떤 루틴으로 관리할까요?", style: .headline_sb_20, color: .gray1000) | ||
| .frame(height: 30.adjustedH) | ||
| TypographyText("루틴을 지킬수록 체리가 성장해요.", style: .title2_m_16, color: .gray800) | ||
| .frame(height: 24.adjustedH) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
fd "StartChallengeView.swift" --type fRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 160
🏁 Script executed:
find . -name "StartChallengeView.swift" -type fRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 162
🏁 Script executed:
git ls-files | grep -i "startchallenge"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 121
🏁 Script executed:
wc -l "Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 163
🏁 Script executed:
cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 2345
🏁 Script executed:
rg "\.adjustedH" --type swift | head -20Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 2610
🏁 Script executed:
rg "extension.*Int\|extension.*CGFloat" --type swift -A 3 | grep -A 5 "adjustedH"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 52
🏁 Script executed:
fd "TypographyText" --type swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 242
🏁 Script executed:
rg "adjustedH" --type swift -B 2 -A 2 | grep -E "extension|computed|var" | head -20Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 2215
🏁 Script executed:
find . -name "*TypographyText*" -o -name "*typography*" | grep -i swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 52
🏁 Script executed:
rg "struct TypographyText|class TypographyText" --type swiftRepository: TEAM-Cherrish/Cherrish-iOS
Length of output: 167
🏁 Script executed:
cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Adjust+.swift"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 1218
🏁 Script executed:
cat -n "Cherrish-iOS/Cherrish-iOS/Presentation/Global/Extension/Font+.swift"Repository: TEAM-Cherrish/Cherrish-iOS
Length of output: 3963
고정 높이가 텍스트 래핑과 로컬라이제이션 시 텍스트 잘림 위험 가능
텍스트에 고정 height를 지정하면 다중 라인 텍스트나 긴 언어 문자열(한국어 등)에서 높이 초과 시 잘릴 수 있습니다. 특히 30.adjustedH(line 21)와 24.adjustedH(line 23, 38)는 단일 라인 기준으로 설정되었으나, 텍스트가 래핑될 경우 콘텐츠를 담기 부족할 수 있습니다. 필요시 lineLimit(nil) 추가나 동적 높이 조정을 검토해 주세요.
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ChallengeView/View/StartChallengeView.swift`
around lines 20 - 23, The two TypographyText instances (the one with "이번엔 어떤
루틴으로 관리할까요?" using .frame(height: 30.adjustedH) and the one with "루틴을 지킬수록 체리가
성장해요." using .frame(height: 24.adjustedH)) use fixed heights that can truncate
wrapped or localized text; remove the fixed .frame(height: ...) or replace it
with a flexible layout approach and enable multiline by adding lineLimit(nil)
and allowing vertical expansion (e.g., fixedSize(horizontal: false, vertical:
true) or no explicit height constraint) so the text can grow for
wrapping/localization while keeping any intended spacing via surrounding
containers or Spacer.

🔗 연결된 이슈
📄 작업 내용
👀 기타 더 이야기해볼 점