Skip to content

Comments

Style/#150 홈, 온보딩 뷰 QA 반영#153

Merged
soseoyo12 merged 2 commits intodevelopfrom
style/#150-home,onboardingQA
Jan 22, 2026
Merged

Style/#150 홈, 온보딩 뷰 QA 반영#153
soseoyo12 merged 2 commits intodevelopfrom
style/#150-home,onboardingQA

Conversation

@soseoyo12
Copy link
Contributor

🔗 연결된 이슈

📄 작업 내용

  • 홈, 온보딩 뷰 디자인 QA반영

@soseoyo12 soseoyo12 requested a review from a team January 21, 2026 20:48
@soseoyo12 soseoyo12 self-assigned this Jan 21, 2026
@soseoyo12 soseoyo12 requested review from sum130, wotjs020708 and y-eonee and removed request for a team January 21, 2026 20:48
@soseoyo12 soseoyo12 linked an issue Jan 21, 2026 that may be closed by this pull request
1 task
@coderabbitai
Copy link

coderabbitai bot commented Jan 21, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

홈 및 온보딩 UI의 레이아웃·이미지 스케일 조정, 온보딩 밑줄의 동적 너비 측정(PrefKey 추가), CherrishPicker의 range를 가변화, 그리고 여러 이미지 자산을 SVG에서 PNG(다중 스케일)로 변경했습니다.

Changes

Cohort / File(s) 변경 요약
홈 화면 UI 조정
Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Home/HomeView.swift
헤더 로고 패딩 조정(leading 32→25, top 40→26), 챌린지 카드 이미지에 resizable()·aspectRatio 추가, 빈 상태 타이포 변경(body1_r_14→body1_m_14)
온보딩 UI 및 동적 밑줄
.../Presentation/Feature/Onboarding/InformationView.swift, .../Onboarding/OnboardingContainerView.swift, .../Onboarding/OnboardingPage1.swift, .../Onboarding/OnboardingPage2.swift
InformationView에 .ignoresSafeArea(.keyboard) 추가, OnboardingContainerView 하단 패딩 증대, OnboardingPage1에 PreferenceKey 기반 동적 line1Width 측정 및 밑줄 폭 적용, OnboardingPage2 타이포·패딩·이미지 프레임 조정
PreferenceKey 추가
Cherrish-iOS/Cherrish-iOS/Presentation/Global/Components/PreferenceKey.swift
Line1WidthKey: PreferenceKey 추가(기본값 0, nextValue 대체 방식)
Picker 컴포넌트 수정
Cherrish-iOS/Cherrish-iOS/Presentation/Global/Components/CherrishPicker.swift
let range: ClosedRange<Int>var range: ClosedRange<Int> = 0...30로 변경(가변성·기본값 추가)
홈 아이콘 자산 업데이트
Cherrish-iOS/Cherrish-iOS/Resources/Assets.xcassets/home_icon/cherrish_logo.imageset/Contents.json, .../home_lv.0.imageset/Contents.json, .../home_lv.1.imageset/Contents.json, .../home_lv.2.imageset/Contents.json
cherrish_logo를 SVG에서 PNG(1x/2x/3x)로 교체, home_lv.0 Contents.json 삭제, home_lv.1·home_lv.2의 파일명 참조 갱신
온보딩 자산 업데이트
Cherrish-iOS/Cherrish-iOS/Resources/Assets.xcassets/onboadrding/comment.imageset/Contents.json, .../illustration_onboarding_ch.imageset/Contents.json
comment 이미지 SVG→PNG로 변경(1x/2x/3x), illustration_onboarding_ch에 2x/3x 항목 추가

Sequence Diagram(s)

(생성 조건 미충족 — 생략)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • y-eonee
  • wotjs020708
  • sum130
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 홈 및 온보딩 뷰의 QA 반영이라는 변경사항의 주요 목적을 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명은 연결된 이슈 #150과 작업 내용(홈 및 온보딩 뷰의 디자인 QA 반영)이 변경사항과 관련이 있습니다.
Linked Issues check ✅ Passed 변경사항은 홈 뷰(HomeView.swift, 레이아웃 조정), 온보딩 뷰들(InformationView, ContainerView, Page1, Page2), CherrishPicker, 자산들의 UI/스타일 조정을 포함하며 이슈 #150의 QA 반영 목표와 일치합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 홈 및 온보딩 뷰 UI/스타일 조정과 자산 업데이트로 이슈 #150의 범위 내에 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch style/#150-home,onboardingQA

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift`:
- Around line 65-74: The hidden measurement view using TypographyText within the
background (GeometryReader setting Line1WidthKey) currently uses .opacity(0)
which leaves it in the accessibility tree and will be read by VoiceOver; update
the background measurement view (the VStack containing TypographyText and
GeometryReader that writes Line1WidthKey) to also call
.accessibilityHidden(true) so the measurement text is excluded from
accessibility without changing layout.

In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Global/Components/CherrishPicker.swift`:
- Line 13: selection이 range 밖으로 설정되면 makeUIView 및 updateUIView에서 selectRow에 전달되는
row가 음수거나 범위를 초과해 크래시가 발생할 수 있으니, makeUIView(...)와 updateUIView(...)에서
selectRow를 호출하기 전에 selection을 range 내로 클램프하거나 검증하여 유효한 Int 인덱스로 변환하세요 (예: let
safeRow = min(max(selection, range.lowerBound), range.upperBound) 형태로),
scrollViewDidScroll과 동일한 검증 로직을 재사용하거나 별도 유틸(예: clampedSelection)으로 추출해 중복 제거하고
selectRow 호출 시 safeRow를 사용하도록 수정하세요.

In
`@Cherrish-iOS/Cherrish-iOS/Resources/Assets.xcassets/home_icon/home_lv.2.imageset/Contents.json`:
- Around line 4-14: The imageset folder is named home_lv.2.imageset but the
image files it contains are named home_lv.1.png, home_lv.1@2x.png, and
home_lv.1@3x.png, creating a naming mismatch. To resolve this, choose one
approach: either rename all three image files to home_lv.2.png,
home_lv.2@2x.png, and home_lv.2@3x.png to match the folder name and update their
references in Contents.json accordingly, or rename the imageset folder to
home_lv.1.imageset to match the actual file names.

Comment on lines +65 to +74
.background(
VStack(alignment: .leading, spacing: 0) {
TypographyText("시술 후 불편감이 남을 수 있는 기간", style: .title1_sb_18, color: .clear)
.background(
GeometryReader { geometry in
Color.clear.preference(key: Line1WidthKey.self, value: geometry.size.width)
}
)
}
.opacity(0)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find the OnboardingPage1.swift file
find . -name "OnboardingPage1.swift" -type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 151


🏁 Script executed:

#!/bin/bash
# Read the OnboardingPage1.swift file to see the code context around lines 65-74
sed -n '55,85p' "./Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift" | cat -n

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 1567


🏁 Script executed:

#!/bin/bash
# Check the full file to see if there are any other accessibility configurations
grep -n "accessibilityHidden\|isHidden\|accessibility" "./Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 52


🌐 Web query:

SwiftUI opacity accessibility hidden VoiceOver separate from visual rendering

💡 Result:

Short answer: setting .opacity(0) only changes visual rendering — it does not reliably remove a SwiftUI view from the accessibility tree or stop it receiving hits. To keep a view visually present/transparent but hide it from VoiceOver and user interaction, combine accessibility and interaction modifiers (or remove the view from the tree). Example:

  • Hide from VoiceOver: .accessibilityHidden(true) or wrap in a container and use .accessibilityElement(children: .ignore/.combine) as appropriate. [1][2]
  • Prevent taps/gestures: .allowsHitTesting(false) or .disabled(true). [3]
  • If you need the view completely gone (no layout space), conditionally remove it with if/else rather than using opacity. [4]

Example:

MyView()
  .opacity(0)                 // visual transparency
  .accessibilityHidden(true)  // hide from VoiceOver
  .allowsHitTesting(false)    // disable interaction

References:
[1] SwiftUI accessibility modifiers (accessibilityHidden / accessibilityElement).
[2] Guide/discussion on hiding elements for VoiceOver and using .accessibilityElement(children: .ignore/.combine).
[3] Practical advice to combine .opacity(0) with .disabled / .allowsHitTesting to stop interaction (StackOverflow).
[4] Notes on .hidden()/.opacity vs removing view (layout and accessibility differences).


🏁 Script executed:

#!/bin/bash
# Verify the exact line numbers by checking the file again more precisely
wc -l "./Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 154


🏁 Script executed:

#!/bin/bash
# Get the exact lines 65-74 to verify the line numbers in the review comment
sed -n '65,74p' "./Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift" | cat -n

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 662


숨겨진 측정 텍스트가 VoiceOver에 노출됩니다.

opacity(0)은 시각적 렌더링만 변경하며 접근성 트리에서 제거되지 않아 VoiceOver 사용자에게 보이지 않는 텍스트가 읽혀집니다. 측정용 뷰를 접근성에서 숨기기 위해 .accessibilityHidden(true)을 추가해주세요.

제안 수정
                    }
                    .opacity(0)
+                   .accessibilityHidden(true)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.background(
VStack(alignment: .leading, spacing: 0) {
TypographyText("시술 후 불편감이 남을 수 있는 기간", style: .title1_sb_18, color: .clear)
.background(
GeometryReader { geometry in
Color.clear.preference(key: Line1WidthKey.self, value: geometry.size.width)
}
)
}
.opacity(0)
.background(
VStack(alignment: .leading, spacing: 0) {
TypographyText("시술 후 불편감이 남을 수 있는 기간", style: .title1_sb_18, color: .clear)
.background(
GeometryReader { geometry in
Color.clear.preference(key: Line1WidthKey.self, value: geometry.size.width)
}
)
}
.opacity(0)
.accessibilityHidden(true)
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Feature/Onboarding/OnboardingPage1.swift`
around lines 65 - 74, The hidden measurement view using TypographyText within
the background (GeometryReader setting Line1WidthKey) currently uses .opacity(0)
which leaves it in the accessibility tree and will be read by VoiceOver; update
the background measurement view (the VStack containing TypographyText and
GeometryReader that writes Line1WidthKey) to also call
.accessibilityHidden(true) so the measurement text is excluded from
accessibility without changing layout.

struct CherrishPicker: View {
@Binding var selection: Int
let range: ClosedRange<Int>
var range: ClosedRange<Int> = 0...30
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find . -name "CherrishPicker.swift" -type f

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 149


🏁 Script executed:

cat -n ./Cherrish-iOS/Cherrish-iOS/Presentation/Global/Components/CherrishPicker.swift

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 7294


프로그래매틱 업데이트 시 range 범위 검증 누락으로 크래시 위험

selectionrange 범위 밖으로 설정될 때, makeUIView(라인 43)와 updateUIView(라인 66)에서 selectRow에 전달하는 row 값이 음수이거나 범위를 초과할 수 있습니다. scrollViewDidScroll(라인 152)에서는 이미 clamping으로 범위를 검증하고 있으나, 프로그래매틱 업데이트 경로에서 이 검증이 누락되어 런타임 오류가 발생할 수 있습니다.

🔧 제안 수정
 func makeUIView(context: Context) -> UIPickerView {
     let picker = UIPickerView()
     picker.delegate = context.coordinator
     picker.dataSource = context.coordinator
     
     picker.subviews.forEach { subview in
         subview.backgroundColor = .clear
     }
     
-    let row = selection - range.lowerBound
+    let rawRow = selection - range.lowerBound
+    let row = max(0, min(rawRow, range.count - 1))
+    if rawRow != row {
+        selection = range.lowerBound + row
+    }
     picker.selectRow(row, inComponent: 0, animated: false)
 func updateUIView(_ uiView: UIPickerView, context: Context) {
     guard !context.coordinator.isScrolling else { return }
     
-    let row = selection - range.lowerBound
+    let rawRow = selection - range.lowerBound
+    let row = max(0, min(rawRow, range.count - 1))
+    if rawRow != row {
+        selection = range.lowerBound + row
+    }
     if uiView.selectedRow(inComponent: 0) != row {
         uiView.selectRow(row, inComponent: 0, animated: true)
     }
 }
🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Presentation/Global/Components/CherrishPicker.swift`
at line 13, selection이 range 밖으로 설정되면 makeUIView 및 updateUIView에서 selectRow에
전달되는 row가 음수거나 범위를 초과해 크래시가 발생할 수 있으니, makeUIView(...)와 updateUIView(...)에서
selectRow를 호출하기 전에 selection을 range 내로 클램프하거나 검증하여 유효한 Int 인덱스로 변환하세요 (예: let
safeRow = min(max(selection, range.lowerBound), range.upperBound) 형태로),
scrollViewDidScroll과 동일한 검증 로직을 재사용하거나 별도 유틸(예: clampedSelection)으로 추출해 중복 제거하고
selectRow 호출 시 safeRow를 사용하도록 수정하세요.

Comment on lines +4 to +14
"filename" : "home_lv.1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "home_lv.2@2x.png",
"filename" : "home_lv.1@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "home_lv.2@3x.png",
"filename" : "home_lv.1@3x.png",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify home_lv.2.imageset folder contents and file naming

echo "=== Contents of home_lv.2.imageset folder ==="
find . -path "*home_lv.2.imageset*" -type f

echo ""
echo "=== All home_lv related PNG files ==="
find . -name "home_lv*.png" -type f | sort

echo ""
echo "=== home_lv.2.imageset/Contents.json ==="
find . -path "*home_lv.2.imageset/Contents.json" -type f -exec cat {} \;

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 2163


🏁 Script executed:

#!/bin/bash
# Verify Contents.json matches actual files in home_lv.2.imageset

echo "=== Checking if all referenced files in Contents.json exist ==="
IMAGESET_PATH="./Cherrish-iOS/Cherrish-iOS/Resources/Assets.xcassets/home_icon/home_lv.2.imageset"

cd "$IMAGESET_PATH" 2>/dev/null && {
  echo "Referenced files in Contents.json:"
  grep '"filename"' Contents.json | grep -o '"[^"]*\.png"'
  
  echo ""
  echo "Actual PNG files in folder:"
  ls -1 *.png 2>/dev/null
  
  echo ""
  echo "Verification: All referenced files exist?"
  for file in home_lv.1.png home_lv.1@2x.png home_lv.1@3x.png; do
    if [ -f "$file" ]; then
      echo "$file exists"
    else
      echo "$file missing"
    fi
  done
} || echo "Could not access imageset folder"

Repository: TEAM-Cherrish/Cherrish-iOS

Length of output: 417


명명 규칙 일관성 개선 권장

home_lv.2.imageset 폴더의 파일들이 실제로 home_lv.1.*로 명명되어 있으며, Contents.json에서 정확히 이 파일들을 참조하고 있습니다. 파일이 올바르게 존재하고 참조되므로 이미지 로드에는 문제가 없습니다.

다만 imageset 폴더명과 파일명의 불일치는 유지보수성을 떨어뜨리므로, 일관된 명명 규칙으로 통일하는 것이 권장됩니다. (예: 폴더 내 파일을 home_lv.2.*로 명명하거나 폴더명을 home_lv.1.imageset으로 조정)

🤖 Prompt for AI Agents
In
`@Cherrish-iOS/Cherrish-iOS/Resources/Assets.xcassets/home_icon/home_lv.2.imageset/Contents.json`
around lines 4 - 14, The imageset folder is named home_lv.2.imageset but the
image files it contains are named home_lv.1.png, home_lv.1@2x.png, and
home_lv.1@3x.png, creating a naming mismatch. To resolve this, choose one
approach: either rename all three image files to home_lv.2.png,
home_lv.2@2x.png, and home_lv.2@3x.png to match the folder name and update their
references in Contents.json accordingly, or rename the imageset folder to
home_lv.1.imageset to match the actual file names.

Copy link
Contributor

@y-eonee y-eonee left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굿 수고했습니당
IMG_5778

Comment on lines 10 to 14
private struct Line1WidthKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = nextValue()
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 제가 PreferenceKey 만들어둔 파일 있는데 거기다가 옮겨주세여

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 써서 높이 구하는 거죠?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

가로 길이 구하는거에여

Copy link
Contributor

@sum130 sum130 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

늦게까지 수고했어요~~ 어푸푸!

@soseoyo12 soseoyo12 merged commit 3735305 into develop Jan 22, 2026
1 check was pending
@soseoyo12 soseoyo12 deleted the style/#150-home,onboardingQA branch January 22, 2026 08:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Style] QA 반영

4 participants