feat(radial): double-tap the closed FAB to jump to a chosen tab
글래스 버블 메뉴가 닫힌 상태에서 FAB를 0.35초 안에 빠르게 두 번 누르면 설정한 탭으로 바로 이동하는 옵션. 첫 탭을 지연시키는 더블탭 제스처 인식은 메뉴 열림 반응성을 해치므로, 첫 탭은 즉시 메뉴를 열고 두 번째 탭에서만 분기한다 — 더블탭 시 버블이 피어나다 FAB로 흡수되며 화면이 바뀌는 연출. - 설정(내비게이션, 버블 모드 전용): '두 번 눌러 바로 이동' 토글 + '이동할 탭' 피커 + 푸터 설명. settings.radialDoubleTapTab (rawValue, 빈 값=꺼짐, 기기 로컬) - 검증용 런치 인자 -radialDoubleTapTest (2초 뒤 더블탭 재현) — 통계 탭 이동 스크린샷으로 확인 - 도움말: 버블 메뉴 항목에 더블탭 문장 추가 + 누락돼 있던 '홈 화면·잠금화면 위젯' 사용법 항목 신설 - l10n 6개 문자열 ko/en/ja, CLAUDE.md §6·§6.8·§14 갱신 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
parent
24c3004ead
commit
973bb50cba
@ -142,7 +142,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}"
|
||||
- **스플래시**: 앱 로고(AppLogo) + 이름 + 멘트, 1.2초 후 페이드아웃 (`ContentView`)
|
||||
- **탭 정의** (`AppTab`): 모음(main) · 행동 · 꼬리표 · 목표 · 기록 · 통계 · 일기(iPad 전용) · 설정
|
||||
- **iPhone 기본**: 하단 탭바에 **노출 탭 1~3개**(기본 모음·행동·기록) + "더보기" 탭(나머지 목록). 설정에서 구성
|
||||
- **iPhone 실험 옵션**: "글래스 버블 메뉴"(`RadialNavigationView`) — 하단 중앙 FAB를 누르면 리퀴드 글라스(`glassEffect(.regular.interactive())`) 유리 구슬 탭 버튼들이 부채꼴로 펼쳐짐. 아이콘+이름이 구슬 안에 함께. 모든 유리 요소는 하나의 `GlassEffectContainer`에서 한 패스로 렌더링(성능)되고 FAB 근처에서 액체처럼 분리·합체 모핑. 2단계 연출: 삽입(FAB에서 모핑) → bloomed(스태거 스프링으로 아치 확산). ⚠️ 컨테이너 안 유리 요소에는 glassEffect 뒤 opacity/scale이 콘텐츠에 온전히 적용되지 않음 — 숨김은 계층 제거(`if`), 이동은 `offset`으로만. 순서는 설정에서 편집(기기 로컬)
|
||||
- **iPhone 실험 옵션**: "글래스 버블 메뉴"(`RadialNavigationView`) — 하단 중앙 FAB를 누르면 리퀴드 글라스(`glassEffect(.regular.interactive())`) 유리 구슬 탭 버튼들이 부채꼴로 펼쳐짐. 아이콘+이름이 구슬 안에 함께. 모든 유리 요소는 하나의 `GlassEffectContainer`에서 한 패스로 렌더링(성능)되고 FAB 근처에서 액체처럼 분리·합체 모핑. 2단계 연출: 삽입(FAB에서 모핑) → bloomed(스태거 스프링으로 아치 확산). ⚠️ 컨테이너 안 유리 요소에는 glassEffect 뒤 opacity/scale이 콘텐츠에 온전히 적용되지 않음 — 숨김은 계층 제거(`if`), 이동은 `offset`으로만. 순서는 설정에서 편집(기기 로컬). **두 번 눌러 바로 이동**(설정 토글+탭 선택, `settings.radialDoubleTapTab` 빈 값=꺼짐): 닫힌 FAB를 0.35초 안에 두 번 누르면 지정 탭으로 즉시 이동 — 첫 탭을 지연시키는 더블탭 제스처 대신 첫 탭은 즉시 열고 두 번째 탭에서 분기(반응성 유지, 버블이 피어나다 흡수되는 연출)
|
||||
- **iPad·Mac**: 항상 `NavigationSplitView` 사이드바 (`SidebarRootView`, `DeviceLayout.isPad`로 판정)
|
||||
- `AppRouter`: 탭 전환 + 탭 간 전달값(모음 탭 롱프레스 → 기록/통계 탭 행동 필터 예약, 더보기 내부 경로 진입 포함)
|
||||
|
||||
@ -195,7 +195,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}"
|
||||
|
||||
### 6.8 설정 탭 (`SettingsView`)
|
||||
- 테마(라이트/다크 — 즉시 적용, App Group 저장으로 위젯 공유) / 언어(재시작 적용, AppleLanguages 오버라이드)
|
||||
- iPhone만: 내비게이션 방식(탭바/버블) + 탭바 구성 or 버블 순서
|
||||
- iPhone만: 내비게이션 방식(탭바/버블) + 탭바 구성 or 버블 순서·두 번 눌러 바로 이동(토글+대상 탭)
|
||||
- 모음 탭 목표 카드 선택(개수 무제한)+표시 방식 / 주 시작 요일 / 하루 시작 시간 / 짧은 기록 무시 / **장시간 측정 알림**(1~12시간, 켜는 순간 알림 권한 요청 — `SessionAlertManager`가 LiveActivityManager.sync 길목에서 진행 세션과 예약을 동기화, 세션 종료·설정 변경 시 예약 제거) / 대표 시간 기준(가장 먼저·나중에 시작 — 기본 latest)
|
||||
- 데이터: **데이터 내보내기** — 행동·시간·횟수·목표·다짐을 CSV 5파일로 (ISO 8601, UTF-8 BOM, 무료 포함)
|
||||
- 프리미엄 화면(§8) / 도움말(`HelpView` — 기기별 주제 분기, DisclosureGroup) / 버전
|
||||
@ -299,7 +299,7 @@ xcrun xcstringstool sync IOS/Localizable.xcstrings --stringsdata "${files[@]}"
|
||||
| 목표 | `-goalShowEditor` `-goalShowFinished` `-goalReorder` `-goalScrollBottom` `-endGoalYesterday "제목"`(종료일을 어제로 — 실행 시점 자동 판정 검증) `-streakDump`(모든 다짐의 연속 계산 결과 → Documents/streak-dump.txt) |
|
||||
| 기록/통계 | `-historyMode timetable` `-historyWeekly` `-excludeActions "이름,이름"` `-historyShowFilter` `-statShowFilter` `-statSpan <day|week|month>` `-statScrollBottom` `-showExport` `-exportDump`(Documents/export-dump.png) |
|
||||
| 설정/기타 | `-settingsScrollGoal` `-settingsScrollPremium` `-premiumPreview` `-helpPreview` `-dataExportPreview`(+`-dataExportRun`이면 CSV 자동 생성 후 Documents 복사) `-widgetPreview YES|lock` `-widgetPreviewScroll <앵커>` `cloudSync`(standard bool로 강제) `-intentSmokeTest`(시리 인텐트 10개 시나리오 실행 → Documents/intent-smoke-test.txt, -seedDemo·-premium과 함께) |
|
||||
| 버블 | `-radialExpanded` |
|
||||
| 버블 | `-radialExpanded` `-radialDoubleTapTest`(2초 뒤 FAB 더블탭 재현 — `-settings.radialDoubleTapTab <탭>`과 함께) |
|
||||
| 일기 | `-diarySeed` `-diaryOpenToday`(**`-startTab diary` 필수**) `-diaryPage <N>` `-diaryShowConfig` `-diaryShowExport`(달력 화면 onAppear — `-diaryOpenToday`와 함께 쓰면 안 뜸) `-diaryExportRun pdf|image`(결과를 Documents로 복사) `-diaryShowCalendarPicker` `-diarySeedEvents` `-diaryHideFirstAction` `-diaryShowActionFilter` / 섹션 강제: `-diary.sectionOrder "timetable,hero,goals"` `-diary.hiddenSections "mood,todos,records,bars"` |
|
||||
| 워치 | `-complicationPreview` `-complicationScroll` `-autoRunFirstAction` |
|
||||
|
||||
|
||||
@ -1267,6 +1267,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"‘글래스 버블 메뉴’를 고르면 하단 탭바 대신 화면 하단 중앙의 버튼을 눌렀을 때 유리 구슬 모양의 탭 버튼들이 부채꼴로 퍼져요. 모든 탭이 엄지 반경 안에 있어 한 손으로 조작하기 편해요. (실험적 기능)\n‘두 번 눌러 바로 이동’을 켜면 메뉴가 닫혀 있을 때 버튼을 빠르게 두 번 눌러 선택한 탭으로 바로 이동해요.": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Choose ‘Glass Bubble Menu’ to replace the bottom tab bar with a single button at the bottom center — tap it and glass-orb tab buttons fan out. Every tab stays within thumb reach for one-handed use. (Experimental)\nTurn on ‘Double-Tap to Jump’ to jump straight to a chosen tab by quickly tapping the button twice while the menu is closed."
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "「ガラスバブルメニュー」を選ぶと、下部タブバーの代わりに画面下中央のボタン1つになり、押すとガラス玉のタブボタンが扇状に広がります。すべてのタブが親指の届く範囲にあり、片手で操作しやすいです。(実験的機能)\n「ダブルタップでジャンプ」をオンにすると、メニューが閉じているときにボタンを素早く2回押して、選んだタブへすぐ移動できます。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"‘오늘 기분’ 영역 표시": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
@ -3582,6 +3598,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"두 번 눌러 바로 이동": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Double-Tap to Jump"
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "ダブルタップでジャンプ"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"드래그해서 순서를 바꾸고, 스위치로 표시 여부를 정할 수 있어요. 모든 날짜의 일기 첫 화면에 함께 적용돼요.": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
@ -5496,6 +5528,7 @@
|
||||
}
|
||||
},
|
||||
"설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요.": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
@ -5511,6 +5544,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요. '두 번 눌러 바로 이동'을 켜면 메뉴가 닫혀 있을 때 버튼을 빠르게 두 번 눌러 정해 둔 탭으로 바로 이동해요.": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Choose \"Glass Bubble Menu\" under Settings → \"Navigation Style\" to open every tab from a single button at the bottom center instead of the tab bar. Tap the button and glass-orb buttons fan out; you can reorder the bubbles in Settings. Turn on \"Double-Tap to Jump\" to jump straight to a tab you set by quickly tapping the button twice while the menu is closed."
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "設定 → 「ナビゲーション方式」で「ガラスバブルメニュー」を選ぶと、タブバーの代わりに画面下中央のボタン1つですべてのタブを開けます。ボタンを押すとガラス玉のボタンが扇状に広がり、バブルの順序も設定で変えられます。「ダブルタップでジャンプ」をオンにすると、メニューが閉じているときにボタンを素早く2回押して、決めておいたタブへすぐ移動できます。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"설정 → '모음 탭 목표 진행 현황'에서 원하는 목표를 선택하면 모음 탭 상단에 진행 현황 카드가 떠요. 여러 개를 선택하면 옆으로 쓸어 넘길 수 있어요.": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
@ -7340,6 +7389,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"이동할 탭": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Jump to Tab"
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "ジャンプ先のタブ"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"이름": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
@ -11059,6 +11124,38 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"홈 화면·잠금화면 위젯 (프리미엄)": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Home Screen & Lock Screen Widgets (Premium)"
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "ホーム画面・ロック画面ウィジェット(プレミアム)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"홈 화면을 길게 눌러 '하루 다님' 위젯을 추가하세요. 행동 실행(눌러서 시작·+1), 목표 진행률, 다짐 진행률(원형 링·누적값), 다짐 현황, 행동 통계 그래프와 잠금화면용 목표 달성률이 있어요. 위젯을 길게 눌러 '위젯 편집'에서 표시할 행동·목표·다짐과 기간, 테마를 고를 수 있어요.": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Touch and hold the Home Screen to add HaruDanim widgets. There are Action Run (tap to start / +1), Goal Progress, Quest Progress (ring with the accumulated amount), Quest Status, Action Stats charts, and a goal gauge for the Lock Screen. Touch and hold a widget and choose \"Edit Widget\" to pick which actions, goals, or quests to show, the period, and the theme."
|
||||
}
|
||||
},
|
||||
"ja": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "ホーム画面を長押しして「ハルタニム」のウィジェットを追加しましょう。アクション実行(押して開始・+1)、目標の進捗、クエストの進捗(リングと累計値)、クエストの状況、アクション統計グラフ、ロック画面用の目標達成率があります。ウィジェットを長押しして「ウィジェットを編集」から、表示するアクション・目標・クエストと期間、テーマを選べます。"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"홈·잠금화면 위젯": {
|
||||
"localizations": {
|
||||
"en": {
|
||||
|
||||
@ -228,7 +228,12 @@ struct HelpView: View {
|
||||
HelpTopic(
|
||||
symbol: "circle.hexagongrid.fill",
|
||||
title: "글래스 버블 메뉴",
|
||||
body: "설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요."
|
||||
body: "설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요. '두 번 눌러 바로 이동'을 켜면 메뉴가 닫혀 있을 때 버튼을 빠르게 두 번 눌러 정해 둔 탭으로 바로 이동해요."
|
||||
),
|
||||
HelpTopic(
|
||||
symbol: "square.grid.2x2.fill",
|
||||
title: "홈 화면·잠금화면 위젯 (프리미엄)",
|
||||
body: "홈 화면을 길게 눌러 '하루 다님' 위젯을 추가하세요. 행동 실행(눌러서 시작·+1), 목표 진행률, 다짐 진행률(원형 링·누적값), 다짐 현황, 행동 통계 그래프와 잠금화면용 목표 달성률이 있어요. 위젯을 길게 눌러 '위젯 편집'에서 표시할 행동·목표·다짐과 기간, 테마를 고를 수 있어요."
|
||||
),
|
||||
HelpTopic(
|
||||
symbol: "bolt.horizontal.circle",
|
||||
|
||||
@ -80,6 +80,16 @@ struct GlassBubbleMenu: View {
|
||||
/// 사용자가 설정에서 지정한 버블 배치 순서 (기기 로컬, 비동기화)
|
||||
@AppStorage(SettingsKeys.radialTabOrder) private var radialOrderRaw = ""
|
||||
|
||||
/// '두 번 눌러 바로 이동' 대상 탭 (rawValue, 빈 값 = 꺼짐 — 기기 로컬, 비동기화)
|
||||
@AppStorage(SettingsKeys.radialDoubleTapTab) private var doubleTapTabRaw = ""
|
||||
|
||||
/// 닫힌 상태에서 FAB를 눌러 메뉴를 연 시각. 이 시각부터 창(doubleTapWindow) 안에
|
||||
/// FAB를 한 번 더 누르면 더블탭으로 판정한다. 첫 탭을 지연시키는 제스처 인식 방식은
|
||||
/// 메뉴 열림 반응성을 해치므로, 첫 탭은 즉시 열고 두 번째 탭에서만 분기한다
|
||||
/// (더블탭 시 버블이 피어나다 FAB로 흡수되며 화면이 바뀌는 연출이 됨).
|
||||
@State private var openTapAt: Date?
|
||||
private let doubleTapWindow: TimeInterval = 0.35
|
||||
|
||||
/// 리퀴드 글라스 모핑 네임스페이스 — FAB와 버블이 같은 유리 덩어리로 이어지게 한다
|
||||
@Namespace private var glassSpace
|
||||
|
||||
@ -141,6 +151,18 @@ struct GlassBubbleMenu: View {
|
||||
.onAppear {
|
||||
// -radialExpanded 등으로 펼쳐진 채 시작하면 버블도 자리 잡은 상태로
|
||||
if expanded { bloomed = true }
|
||||
#if DEBUG
|
||||
// 검증용: -radialDoubleTapTest YES → 2초 뒤 FAB 더블탭을 재현
|
||||
// (설정 키는 -settings.radialDoubleTapTab <탭>으로 주입)
|
||||
if UserDefaults.standard.bool(forKey: "radialDoubleTapTest") {
|
||||
Task { @MainActor in
|
||||
try? await Task.sleep(for: .seconds(2))
|
||||
toggle()
|
||||
try? await Task.sleep(for: .milliseconds(180))
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -255,7 +277,22 @@ struct GlassBubbleMenu: View {
|
||||
// MARK: 동작
|
||||
|
||||
private func toggle() {
|
||||
if expanded { close() } else { open() }
|
||||
if expanded {
|
||||
// 방금(창 안에) 닫힌 상태에서 연 메뉴라면 이 탭은 더블탭 — 바로 이동
|
||||
if let tappedAt = openTapAt,
|
||||
Date.now.timeIntervalSince(tappedAt) < doubleTapWindow,
|
||||
let tab = AppTab(rawValue: doubleTapTabRaw) {
|
||||
openTapAt = nil
|
||||
selection = tab.rawValue
|
||||
close()
|
||||
return
|
||||
}
|
||||
openTapAt = nil
|
||||
close()
|
||||
} else {
|
||||
openTapAt = doubleTapTabRaw.isEmpty ? nil : .now
|
||||
open()
|
||||
}
|
||||
}
|
||||
|
||||
/// 1단계: 버블 삽입 — FAB 유리에서 모핑으로 부풀어 나온다 (offset 0, FAB와 한 덩어리).
|
||||
|
||||
@ -26,6 +26,7 @@ struct SettingsView: View {
|
||||
@AppStorage(SettingsKeys.visibleTabs) private var visibleTabsRaw = TabBarConfig.defaultVisibleTabs
|
||||
// 내비게이션 방식은 이 기기에서만 쓰는 UI 설정 → 동기화하지 않는 standard 저장소 사용
|
||||
@AppStorage(SettingsKeys.navStyle) private var navStyleRaw = NavStyle.tabBar.rawValue
|
||||
@AppStorage(SettingsKeys.radialDoubleTapTab) private var radialDoubleTapTabRaw = ""
|
||||
@AppStorage(SettingsKeys.goalCardStyle) private var goalCardStyle = GoalCardStyle.perQuest.rawValue
|
||||
// 모음 탭 노출 목표는 기기별 로컬 설정 (CloudKit 동기화 제외, LocalPrefs 참고)
|
||||
@AppStorage(LocalPrefsKeys.pinnedGoals, store: AppGroup.defaults) private var pinnedGoalsRaw = ""
|
||||
@ -34,6 +35,14 @@ struct SettingsView: View {
|
||||
AppTab.visibleTabs(from: visibleTabsRaw)
|
||||
}
|
||||
|
||||
/// '두 번 눌러 바로 이동' 켜기/끄기 — 대상 탭 rawValue의 유무가 곧 on/off
|
||||
private var radialDoubleTapBinding: Binding<Bool> {
|
||||
Binding(
|
||||
get: { !radialDoubleTapTabRaw.isEmpty },
|
||||
set: { radialDoubleTapTabRaw = $0 ? AppTab.main.rawValue : "" }
|
||||
)
|
||||
}
|
||||
|
||||
/// 하루 시작 시간을 DatePicker와 연결하기 위한 변환
|
||||
private var dayStartDate: Binding<Date> {
|
||||
Binding {
|
||||
@ -79,11 +88,23 @@ struct SettingsView: View {
|
||||
} label: {
|
||||
Label("버블 메뉴 순서 편집", systemImage: "arrow.up.arrow.down")
|
||||
}
|
||||
Toggle("두 번 눌러 바로 이동", isOn: radialDoubleTapBinding)
|
||||
if !radialDoubleTapTabRaw.isEmpty {
|
||||
Picker("이동할 탭", selection: $radialDoubleTapTabRaw) {
|
||||
ForEach(AppTab.phoneCases) { tab in
|
||||
Text(tab.label).tag(tab.rawValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} header: {
|
||||
Text("내비게이션")
|
||||
} footer: {
|
||||
Text("‘글래스 버블 메뉴’를 고르면 하단 탭바 대신 화면 하단 중앙의 버튼을 눌렀을 때 유리 구슬 모양의 탭 버튼들이 부채꼴로 퍼져요. 모든 탭이 엄지 반경 안에 있어 한 손으로 조작하기 편해요. (실험적 기능)")
|
||||
if navStyleRaw == NavStyle.radial.rawValue {
|
||||
Text("‘글래스 버블 메뉴’를 고르면 하단 탭바 대신 화면 하단 중앙의 버튼을 눌렀을 때 유리 구슬 모양의 탭 버튼들이 부채꼴로 퍼져요. 모든 탭이 엄지 반경 안에 있어 한 손으로 조작하기 편해요. (실험적 기능)\n‘두 번 눌러 바로 이동’을 켜면 메뉴가 닫혀 있을 때 버튼을 빠르게 두 번 눌러 선택한 탭으로 바로 이동해요.")
|
||||
} else {
|
||||
Text("‘글래스 버블 메뉴’를 고르면 하단 탭바 대신 화면 하단 중앙의 버튼을 눌렀을 때 유리 구슬 모양의 탭 버튼들이 부채꼴로 퍼져요. 모든 탭이 엄지 반경 안에 있어 한 손으로 조작하기 편해요. (실험적 기능)")
|
||||
}
|
||||
}
|
||||
// 버블 메뉴는 모든 탭을 항상 노출하므로 노출 탭 선택이 필요 없다
|
||||
if navStyleRaw == NavStyle.tabBar.rawValue {
|
||||
|
||||
@ -33,6 +33,8 @@ enum SettingsKeys {
|
||||
static let navStyle = "settings.navStyle"
|
||||
/// 글래스 버블 메뉴에 펼칠 탭 순서. AppTab rawValue를 쉼표로 연결. 기기 로컬(비동기화)
|
||||
static let radialTabOrder = "settings.radialTabOrder"
|
||||
/// 글래스 버블 FAB '두 번 눌러 바로 이동' 대상 탭. AppTab rawValue, 빈 값 = 꺼짐. 기기 로컬(비동기화)
|
||||
static let radialDoubleTapTab = "settings.radialDoubleTapTab"
|
||||
}
|
||||
|
||||
/// iPhone 전용 내비게이션 방식 (iPad·Mac 사이드바에는 적용되지 않음, 기기 로컬 설정)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user