Skip to content

온보딩 UX 리펙토링 합니다.#276

Merged
Kimyonhae merged 9 commits into
devfrom
refactor/275-ux-fix
Jun 11, 2026
Merged

온보딩 UX 리펙토링 합니다.#276
Kimyonhae merged 9 commits into
devfrom
refactor/275-ux-fix

Conversation

@Kimyonhae

Copy link
Copy Markdown
Collaborator

✨ 작업 요약

iPad 다운로드 가이드 라벨 잘림 현상 수정, 툴팁 슬라이드&페이드 애니메이션 전환 구현 및 다운로드 시트 가이드 라벨 레이아웃 보강

  • iPad 환경 및 기기 가로 규격에서 가이드 라벨(TimelineGuideLabel)이 한 줄로 잘리는 오토 레이아웃 버그를 해결했습니다.
  • 툴팁 변경 시 자연스럽게 위로 사라지며 투명해졌다가 아래서 올라오는 Slide & Fade 애니메이션을 적용했습니다.
  • 온디바이스 다운로드 시트(DownloadOnDeviceViewController) 내 Wi-Fi 권장 라벨을 하단 버튼 바로 위(12pt)에 일관되게 고정되도록 제약조건을 수정했습니다.

📋 구체적인 내용

  • 추가/변경된 동작:
    • TimelineGuideLabel.swift:
      • layoutSubviews 내에서 bounds 너비에 맞게 preferredMaxLayoutWidth를 동적으로 갱신하고 invalidateIntrinsicContentSize()를 호출하여 여러 줄 텍스트가 항상 정확한 세로 높이를 가지도록 개선
      • 기존 CATransition 밀어내기 효과 대신, UIView.animate 기반의 Slide & Fade 애니메이션(위로 올라가며 투명해진 뒤, 아래에서 불투명하게 올라옴)으로 전환 효과 리팩토링
      • 타이머 중지(stopTimer) 시점에 alpha와 transform 상태를 원상태(.identity, 1)로 안전하게 리셋하는 로직 추가
    • OnBoardingDownloadView.swift:
      • 스택 뷰 구조 내 spacerView 전후의 custom spacing을 0으로 명시하고 content hugging 및 compression resistance 우선순위를 .defaultLow로 지정하여, 공간 부족 시 가이드 라벨 영역을 침범하거나 불필요한 기본 간격(32pt)을 남기지 않고 완벽히 0으로 수축되도록 보강
    • DownloadOnDeviceViewController.swift:
      • Wi-Fi 권장 라벨(subTitle2Label)의 top 제약조건을 제거하고, 하단 버튼 영역(bottomArea.topAnchor) 위 12pt에 위치하도록 bottom 제약조건으로 변경
      • 화면 크기가 극히 좁을 때 상단 카드 컴포넌트(infoBox, downloadModelCard)와 겹치는 현상을 방지하고자 greaterThanOrEqualTo 안전 마진 제약조건(12pt) 추가
  • 영향 받는 화면/모듈:
    • Presentation 모듈 (온보딩 다운로드 뷰, 온디바이스 다운로드 바텀 시트)

🔗 연관 이슈

  • closed #

🧩 설계·구현 노트

왜 이렇게 구현했는지, 대안과 비교한 점 (선택)

  • 선택한 방식
    • preferredMaxLayoutWidth 설정: 스크롤 뷰나 가로 스택 뷰 내부에 멀티라인 라벨이 들어갈 때 오토레이아웃 엔진이 잘못된 크기(1줄 크기)로 높이를 캐싱하는 문제를 해결하는 검증된 iOS 표준 방식을 사용했습니다.
    • UIView.animate 체이닝: CATransition은 투명도 조절과 곡선 커스텀이 까다롭기 때문에, 0.25초 단위의 두 단계 페이드 인/아웃 방식 UIKit 애니메이션을 활용해 사용자에게 한층 더 부드럽고 완성도 높은 모션을 제공하도록 설계했습니다.
    • Spacer Spacing 수축: stack view 내부에서 spacer가 줄어들어도 spacing(32pt)이 낭비되는 문제를 custom spacing을 0으로 명시적으로 차단하여 고쳤습니다.
  • 고려했다가 제외한 방식
    • 고정 높이(Constraint Height) 부여: 라벨의 다국어 대응이나 텍스트 길이에 따라 유동적인 변경이 불가능하여 제외했습니다.
    • CATransition에 불투명도 속성 추가 시도: CoreAnimation 트랜지션의 특성상 텍스트 속성 업데이트 시점과 정확한 애니메이션 타이밍 동기화가 어려워 순수 UIKit 애니메이션 방식으로 선회했습니다.

✅ 확인 사항

PR 전 직접 확인한 것

  • 정상 플로우 동작 확인
  • 엣지 케이스 / 빈 값·에러 처리 확인
  • (UI 변경 시) 스크린샷 또는 GIF 첨부
  • (로직 추가 시) 테스트 추가 여부

👀 리뷰 포인트

  • 설계·구조 적절성
  • 로직·엣지 케이스
  • 예외/에러 핸들링
  • UI/UX (해당 시)
  • 성능·의존성 (해당 시)

특히 봐줬으면 하는 부분

  • TimelineGuideLabel의 애니메이션 전환 딜레이(0.25초 + 0.25초)가 자연스럽게 동작하는지 확인해 주세요.
  • 온바인딩 다운로드 뷰와 바텀 시트 뷰에서 iPad 및 소형 iPhone 기기 레이아웃이 찌그러지거나 잘리지 않는지 확인 바랍니다.

📚 참고

  • 2.1.0 Performance: App Completeness
  • 4.0.0 Design: Preamble
  • 4.2.3 Design: Minimum Functionality

- whiper는 추천 모델을 통해 ModelVariant를 받을 수 있으므로 repository에서 String으로 변환하여 뷰모델로 전달합니다.
- mlx는 하드코딩 (3.59GB)
- downloadModelCard 컴포넌트에 용량 크기를 적용합니다.
- iPad의 경우 sheet가 medium일 경우 레이아웃이 깨지는 현상 발생으로 인해 사용자의 Device를 가져와 iPad인 경우 .large()로 sheet를 활성화합니다.
- 구현체에 mlx는 하드코딩 및 whiper는 추천 모델로 분기하였습니다.
- 이제 이미지로 인해 내부 headline, body가 찌그러지지않습니다.
- TimelineGuideLabel의 layoutSubviews를 개선하여 iPad 등 넓은 화면에서 여러 줄 가이드 문구가 잘리지 않고 올바른 높이로 렌더링되도록 수정
- 가이드 라벨 전환 효과를 CATransition 대신 부드러운 위방향 Slide & Fade 효과(UIView.animate)로 리팩토링
- OnBoardingDownloadView의 spacerView 여백 제약을 정밀 조율하여 좁은 수직 공간에서도 라벨 영역을 침범하지 않도록 개선
- DownloadOnDeviceViewController의 Wi-Fi 권장 문구 위치를 다운로드 버튼 기준 상단 12pt 고정 및 충돌 방지 제약조건 추가
@Kimyonhae Kimyonhae self-assigned this Jun 11, 2026
@Kimyonhae Kimyonhae added the 🚀 Enhancement 기존 기능 개선, UX/옵션 추가 등 label Jun 11, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces model size tracking and display for on-device AI models, adds a rolling tooltip guide (TimelineGuideLabel) during onboarding downloads, and improves layout robustness on iPad and smaller screens by adjusting compression resistance and hugging priorities. The code review feedback highlights a critical issue where debug error simulation code is left active, which would cause downloads to fail in debug builds. Additionally, the feedback points out a potential memory leak due to a missing timer invalidation in deinit, redundant main-thread dispatching, and opportunities to improve layout behavior and code simplicity by using stack views and cleaner iPad detection.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread Data/Sources/Infrastructure/OnDevice/Whisper/WhisperKitProvider.swift Outdated
Comment thread Presentation/Sources/Component/OnBoarding/TimelineGuideLabel.swift
Comment thread Presentation/Sources/Component/OnBoarding/TimelineGuideLabel.swift
Comment thread Presentation/Sources/Component/OnBoarding/TimelineGuideLabel.swift
Comment thread Presentation/Sources/View/OnBoarding/OnBoardingViewController.swift
Comment thread App/Sources/Coordinator/MainCoordinator.swift
Comment thread Presentation/Sources/View/OnBoarding/OnBoardingViewController.swift
Comment thread Presentation/Sources/ViewModel/OnBoarding/OnBoardingStep.swift
@tuist

tuist Bot commented Jun 11, 2026

Copy link
Copy Markdown

🛠️ Tuist Run Report 🛠️

Tests 🧪

Scheme Status Cache hit rate Tests Skipped Ran Commit
ChaGok-Workspace 0 % 1 0 1 7ef63f996

Builds 🔨

Scheme Status Duration Commit
ChaGok-Workspace 4m 38s 7ef63f996

@Kimyonhae Kimyonhae merged commit e9e5908 into dev Jun 11, 2026
2 checks passed
@Kimyonhae Kimyonhae deleted the refactor/275-ux-fix branch June 11, 2026 15:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚀 Enhancement 기존 기능 개선, UX/옵션 추가 등

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant