온보딩 UX 리펙토링 합니다.#276
Conversation
- whiper는 추천 모델을 통해 ModelVariant를 받을 수 있으므로 repository에서 String으로 변환하여 뷰모델로 전달합니다. - mlx는 하드코딩 (3.59GB) - downloadModelCard 컴포넌트에 용량 크기를 적용합니다.
- iPad의 경우 sheet가 medium일 경우 레이아웃이 깨지는 현상 발생으로 인해 사용자의 Device를 가져와 iPad인 경우 .large()로 sheet를 활성화합니다.
- 구현체에 mlx는 하드코딩 및 whiper는 추천 모델로 분기하였습니다.
- modelSize를 추가하였습니다.
- 이제 이미지로 인해 내부 headline, body가 찌그러지지않습니다.
- TimelineGuideLabel의 layoutSubviews를 개선하여 iPad 등 넓은 화면에서 여러 줄 가이드 문구가 잘리지 않고 올바른 높이로 렌더링되도록 수정 - 가이드 라벨 전환 효과를 CATransition 대신 부드러운 위방향 Slide & Fade 효과(UIView.animate)로 리팩토링 - OnBoardingDownloadView의 spacerView 여백 제약을 정밀 조율하여 좁은 수직 공간에서도 라벨 영역을 침범하지 않도록 개선 - DownloadOnDeviceViewController의 Wi-Fi 권장 문구 위치를 다운로드 버튼 기준 상단 12pt 고정 및 충돌 방지 제약조건 추가
There was a problem hiding this comment.
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.
🛠️ Tuist Run Report 🛠️Tests 🧪
Builds 🔨
|
✨ 작업 요약
TimelineGuideLabel)이 한 줄로 잘리는 오토 레이아웃 버그를 해결했습니다.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:subTitle2Label)의 top 제약조건을 제거하고, 하단 버튼 영역(bottomArea.topAnchor) 위12pt에 위치하도록 bottom 제약조건으로 변경infoBox,downloadModelCard)와 겹치는 현상을 방지하고자greaterThanOrEqualTo안전 마진 제약조건(12pt) 추가Presentation모듈 (온보딩 다운로드 뷰, 온디바이스 다운로드 바텀 시트)🔗 연관 이슈
🧩 설계·구현 노트
preferredMaxLayoutWidth설정: 스크롤 뷰나 가로 스택 뷰 내부에 멀티라인 라벨이 들어갈 때 오토레이아웃 엔진이 잘못된 크기(1줄 크기)로 높이를 캐싱하는 문제를 해결하는 검증된 iOS 표준 방식을 사용했습니다.UIView.animate체이닝:CATransition은 투명도 조절과 곡선 커스텀이 까다롭기 때문에, 0.25초 단위의 두 단계 페이드 인/아웃 방식 UIKit 애니메이션을 활용해 사용자에게 한층 더 부드럽고 완성도 높은 모션을 제공하도록 설계했습니다.CATransition에 불투명도 속성 추가 시도: CoreAnimation 트랜지션의 특성상 텍스트 속성 업데이트 시점과 정확한 애니메이션 타이밍 동기화가 어려워 순수 UIKit 애니메이션 방식으로 선회했습니다.✅ 확인 사항
👀 리뷰 포인트
특히 봐줬으면 하는 부분
TimelineGuideLabel의 애니메이션 전환 딜레이(0.25초 + 0.25초)가 자연스럽게 동작하는지 확인해 주세요.📚 참고