├── .github ├── FUNDING.yml └── workflows │ └── hugo.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── archetypes ├── chapter.md └── default.md ├── config.toml ├── deploy ├── docs ├── _index.md ├── about.md ├── combine │ └── _index.md ├── dp │ ├── _index.md │ └── note.md ├── swift │ └── _index.md ├── swiftpm │ ├── _index.md │ ├── spm_in_cli.md │ ├── spm_in_xcode.md │ └── swiftpm_plugin.md ├── swiftui │ ├── _index.md │ ├── app_design_and_layout │ │ ├── _index.md │ │ ├── composing_complex_interfaces.files │ │ │ ├── ComposingComplexInterfaces.zip │ │ │ ├── add-rows-landmarks.gif │ │ │ ├── swiftui-app-design-layout-section5-step1.gif │ │ │ ├── swiftui-app-design-layout-section5-step4.gif │ │ │ └── swiftui-app-design-layout-section5-step5.gif │ │ ├── composing_complex_interfaces.md │ │ ├── images │ │ │ ├── app_design_and_layout.png │ │ │ ├── swiftui-app-design-layout-section1-step1.png │ │ │ ├── swiftui-app-design-layout-section1-step2.png │ │ │ ├── swiftui-app-design-layout-section1-step3.png │ │ │ ├── swiftui-app-design-layout-section1-step4.png │ │ │ ├── swiftui-app-design-layout-section1.png │ │ │ ├── swiftui-app-design-layout-section2-step1.png │ │ │ ├── swiftui-app-design-layout-section2-step2.png │ │ │ ├── swiftui-app-design-layout-section2.png │ │ │ ├── swiftui-app-design-layout-section3-step1.png │ │ │ ├── swiftui-app-design-layout-section3-step2.png │ │ │ ├── swiftui-app-design-layout-section3-step3.png │ │ │ ├── swiftui-app-design-layout-section3-step4.png │ │ │ ├── swiftui-app-design-layout-section4-step1.png │ │ │ ├── swiftui-app-design-layout-section4-step2.png │ │ │ ├── swiftui-app-design-layout-section4-step3.png │ │ │ ├── swiftui-app-design-layout-section4.png │ │ │ ├── swiftui-app-design-layout-section5-step1.png │ │ │ ├── swiftui-app-design-layout-section5-step2.png │ │ │ ├── swiftui-app-design-layout-section5-step3.png │ │ │ ├── swiftui-app-design-layout-section5-step4.png │ │ │ ├── swiftui-app-design-layout-section5-step5.png │ │ │ ├── swiftui-app-design-layout-section5-step6.png │ │ │ ├── swiftui-app-design-layout-section5.png │ │ │ ├── swiftui-drawing-animation-problem3-answer1.png │ │ │ ├── swiftui-drawing-animation-problem3-answer2.png │ │ │ ├── swiftui-drawing-animation-problem3-answer3.png │ │ │ ├── working-with-ui-controls-problem1-answer1.png │ │ │ ├── working-with-ui-controls-problem1-answer2.png │ │ │ ├── working-with-ui-controls-problem1-answer3.png │ │ │ ├── working-with-ui-controls-section1-step1.png │ │ │ ├── working-with-ui-controls-section1-step2.png │ │ │ ├── working-with-ui-controls-section1-step3.png │ │ │ ├── working-with-ui-controls-section1-step4.png │ │ │ ├── working-with-ui-controls-section1-step5.png │ │ │ ├── working-with-ui-controls-section1-step6.png │ │ │ ├── working-with-ui-controls-section1-step7.png │ │ │ ├── working-with-ui-controls-section1.png │ │ │ ├── working-with-ui-controls-section2-step1.png │ │ │ ├── working-with-ui-controls-section2-step2.png │ │ │ ├── working-with-ui-controls-section2-step3.png │ │ │ ├── working-with-ui-controls-section2-step4.png │ │ │ ├── working-with-ui-controls-section2-step5.png │ │ │ ├── working-with-ui-controls-section2.png │ │ │ ├── working-with-ui-controls-section3-step1.png │ │ │ ├── working-with-ui-controls-section3-step2.png │ │ │ ├── working-with-ui-controls-section3-step3.png │ │ │ ├── working-with-ui-controls-section3-step4.png │ │ │ ├── working-with-ui-controls-section3-step5.png │ │ │ ├── working-with-ui-controls-section4-step1.png │ │ │ ├── working-with-ui-controls-section4-step2.png │ │ │ └── working-with-ui-controls-section4.png │ │ ├── working_with_ui_controls.files │ │ │ └── WorkingWithUIControls.zip │ │ └── working_with_ui_controls.md │ ├── drawing_and_animation │ │ ├── _index.md │ │ ├── animating_views_and_transitions.files │ │ │ ├── AnimatingViewsAndTransitions.zip │ │ │ ├── custom-move-and-fade-slide-scale.gif │ │ │ ├── custom-move-and-fade.gif │ │ │ ├── customize-view-transitions.gif │ │ │ ├── hike-graph-transition-spring-animation.gif │ │ │ ├── live-preview-animations.gif │ │ │ ├── rotate-button-aniamtion.gif │ │ │ ├── rotate-button-animation-scale.gif │ │ │ ├── spring-animation-delay-index-based.gif │ │ │ ├── spring-animation-speed.gif │ │ │ ├── transition-slide.gif │ │ │ ├── with-animation-block.gif │ │ │ ├── with-animation-duration.gif │ │ │ └── with-animation-interrupt.gif │ │ ├── animating_views_and_transitions.md │ │ ├── drawing_paths_and_shapes.files │ │ │ └── DrawingPathsAndShapes.zip │ │ ├── drawing_paths_and_shapes.md │ │ └── images │ │ │ ├── drawing_and_animation.png │ │ │ ├── swiftui-animation-transition-combine-animation.png │ │ │ ├── swiftui-animation-transition-custom-transition.png │ │ │ ├── swiftui-animation-transition-hike-graph-ripple.png │ │ │ ├── swiftui-animation-transition-pin-canvas.png │ │ │ ├── swiftui-animation-transition-problem1-1.png │ │ │ ├── swiftui-animation-transition-problem1-2.png │ │ │ ├── swiftui-animation-transition-problem1-3.png │ │ │ ├── swiftui-animation-transition-problem1.png │ │ │ ├── swiftui-animation-transition-rotate-button-animation.png │ │ │ ├── swiftui-animation-transition-rotate-button-no-rotate.png │ │ │ ├── swiftui-animation-transition-rotate-button-resume.png │ │ │ ├── swiftui-animation-transition-rotate-button-scale.png │ │ │ ├── swiftui-animation-transtion-rotate-button-spring.png │ │ │ ├── swiftui-animation-transtion-state-change.png │ │ │ ├── swiftui-drawing-animation-badge-background.png │ │ │ ├── swiftui-drawing-animation-badge-center.png │ │ │ ├── swiftui-drawing-animation-badge-combine.png │ │ │ ├── swiftui-drawing-animation-badge-geometry-reader.png │ │ │ ├── swiftui-drawing-animation-badge-geometry-scale.png │ │ │ ├── swiftui-drawing-animation-badge-gradient.png │ │ │ ├── swiftui-drawing-animation-badge-hexagonal.png │ │ │ ├── swiftui-drawing-animation-badge-path-fill.png │ │ │ ├── swiftui-drawing-animation-badge-refactor-background.png │ │ │ ├── swiftui-drawing-animation-badge-square.png │ │ │ ├── swiftui-drawing-animation-badge-symbol-bottom.png │ │ │ ├── swiftui-drawing-animation-badge-symbol-completed.png │ │ │ ├── swiftui-drawing-animation-badge-symbol-create.png │ │ │ ├── swiftui-drawing-animation-badge-symbol-fill.png │ │ │ ├── swiftui-drawing-animation-badge-symbol-top.png │ │ │ ├── swiftui-drawing-animation-badge-symbol.png │ │ │ ├── swiftui-drawing-animation-badge-symbols.png │ │ │ ├── swiftui-drawing-animation-badge-text.png │ │ │ ├── swiftui-drawing-animation-badge.png │ │ │ ├── swiftui-drawing-animation-badgebackground.png │ │ │ ├── swiftui-drawing-animation-create-file.png │ │ │ ├── swiftui-drawing-animation-hexagonal-data.png │ │ │ ├── swiftui-drawing-animation-name-file.png │ │ │ ├── swiftui-drawing-animation-path-start-point.png │ │ │ ├── swiftui-drawing-animation-path.png │ │ │ ├── swiftui-drawing-animation-problem2-answer1.png │ │ │ ├── swiftui-drawing-animation-problem2-answer2.png │ │ │ ├── swiftui-drawing-animation-problem2-answer3.png │ │ │ ├── swiftui-drawing-animation-problem2.png │ │ │ ├── swiftui-drawing-animation-problem3-answer1.png │ │ │ ├── swiftui-drawing-animation-problem3-answer2.png │ │ │ ├── swiftui-drawing-animation-problem3-answer3.png │ │ │ ├── swiftui-drawing-animation-problem3.png │ │ │ ├── swiftui-drawing-animation-rotate-badge-5.png │ │ │ └── swiftui-drawing-path-and-shape-animate-button.png │ ├── framework_integration │ │ ├── _index.md │ │ ├── creating_a_macOS_App.files │ │ │ ├── CreatingAmacOSApp.zip │ │ │ └── macos-landmark.gif │ │ ├── creating_a_macOS_App.md │ │ ├── creating_a_watchOS_App.files │ │ │ ├── CreatingAwatchOSApp.zip │ │ │ └── watch_landmark_app_test.gif │ │ ├── creating_a_watchOS_App.md │ │ ├── images │ │ │ ├── create_a_watchOS_app_problem1.png │ │ │ ├── create_a_watchOS_app_problem5.png │ │ │ ├── create_a_watchOS_app_section1.png │ │ │ ├── create_a_watchOS_app_section1_step1_1.png │ │ │ ├── create_a_watchOS_app_section1_step1_2.png │ │ │ ├── create_a_watchOS_app_section1_step2_1.png │ │ │ ├── create_a_watchOS_app_section1_step2_2.png │ │ │ ├── create_a_watchOS_app_section1_step4.png │ │ │ ├── create_a_watchOS_app_section2.png │ │ │ ├── create_a_watchOS_app_section2_step1.png │ │ │ ├── create_a_watchOS_app_section2_step2.png │ │ │ ├── create_a_watchOS_app_section2_step3.png │ │ │ ├── create_a_watchOS_app_section2_step4.png │ │ │ ├── create_a_watchOS_app_section3.png │ │ │ ├── create_a_watchOS_app_section3_step1.png │ │ │ ├── create_a_watchOS_app_section3_step10.png │ │ │ ├── create_a_watchOS_app_section3_step2.png │ │ │ ├── create_a_watchOS_app_section3_step3.png │ │ │ ├── create_a_watchOS_app_section3_step4.png │ │ │ ├── create_a_watchOS_app_section3_step5.png │ │ │ ├── create_a_watchOS_app_section3_step6.png │ │ │ ├── create_a_watchOS_app_section3_step7.png │ │ │ ├── create_a_watchOS_app_section3_step8.png │ │ │ ├── create_a_watchOS_app_section3_step9.png │ │ │ ├── create_a_watchOS_app_section4.png │ │ │ ├── create_a_watchOS_app_section4_step1.png │ │ │ ├── create_a_watchOS_app_section4_step2.png │ │ │ ├── create_a_watchOS_app_section4_step3.png │ │ │ ├── create_a_watchOS_app_section4_step4.png │ │ │ ├── create_a_watchOS_app_section4_step5.png │ │ │ ├── create_a_watchOS_app_section4_step6.png │ │ │ ├── create_a_watchOS_app_section5.png │ │ │ ├── create_a_watchOS_app_section5_step1.png │ │ │ ├── create_a_watchOS_app_section5_step2.png │ │ │ ├── create_a_watchOS_app_section5_step3.png │ │ │ ├── create_a_watchOS_app_section5_step4.png │ │ │ ├── create_a_watchOS_app_section5_step5.png │ │ │ ├── create_a_watchOS_app_section5_step6.png │ │ │ ├── create_a_watchOS_app_section6.png │ │ │ ├── create_a_watchOS_app_section6_step1.png │ │ │ ├── create_a_watchOS_app_section6_step2.png │ │ │ ├── create_a_watchOS_app_section6_step3.png │ │ │ ├── create_a_watchOS_app_section6_step4.png │ │ │ ├── create_a_watchOS_app_section7.png │ │ │ ├── create_a_watchOS_app_section7_step1.png │ │ │ ├── create_a_watchOS_app_section7_step2.png │ │ │ ├── create_a_watchOS_app_section7_step3.png │ │ │ ├── create_a_watchOS_app_section7_step4.png │ │ │ ├── create_a_watchOS_app_section7_step5.png │ │ │ ├── create_a_watchOS_app_section7_step6.png │ │ │ ├── create_a_watchOS_app_section7_step7.png │ │ │ ├── create_a_watchOS_app_section7_step8.png │ │ │ ├── create_a_watchOS_app_section7_step9_1.png │ │ │ ├── create_a_watchOS_app_section7_step9_2.png │ │ │ ├── creating_a_macOS_App_problem1_answer1.png │ │ │ ├── creating_a_macOS_App_problem1_answer2.png │ │ │ ├── creating_a_macOS_App_problem1_answer3.png │ │ │ ├── creating_a_macOS_App_problem3_answer1.png │ │ │ ├── creating_a_macOS_App_problem3_answer2.png │ │ │ ├── creating_a_macOS_App_problem3_answer3.png │ │ │ ├── creating_a_macOS_App_problem4.png │ │ │ ├── creating_a_macOS_App_seciont1.png │ │ │ ├── creating_a_macOS_App_seciont10.png │ │ │ ├── creating_a_macOS_App_seciont10_step3.png │ │ │ ├── creating_a_macOS_App_seciont10_step4.png │ │ │ ├── creating_a_macOS_App_seciont10_step5.png │ │ │ ├── creating_a_macOS_App_seciont10_step6.png │ │ │ ├── creating_a_macOS_App_seciont10_step7.png │ │ │ ├── creating_a_macOS_App_seciont1_step1.png │ │ │ ├── creating_a_macOS_App_seciont1_step2.png │ │ │ ├── creating_a_macOS_App_seciont1_step3.png │ │ │ ├── creating_a_macOS_App_seciont1_step4.png │ │ │ ├── creating_a_macOS_App_seciont1_step5.png │ │ │ ├── creating_a_macOS_App_seciont2.png │ │ │ ├── creating_a_macOS_App_seciont2_step1.png │ │ │ ├── creating_a_macOS_App_seciont2_step2.png │ │ │ ├── creating_a_macOS_App_seciont2_step3.png │ │ │ ├── creating_a_macOS_App_seciont3.png │ │ │ ├── creating_a_macOS_App_seciont3_step1.png │ │ │ ├── creating_a_macOS_App_seciont3_step2.png │ │ │ ├── creating_a_macOS_App_seciont3_step3.png │ │ │ ├── creating_a_macOS_App_seciont3_step4.png │ │ │ ├── creating_a_macOS_App_seciont3_step5.png │ │ │ ├── creating_a_macOS_App_seciont3_step6.png │ │ │ ├── creating_a_macOS_App_seciont3_step7.png │ │ │ ├── creating_a_macOS_App_seciont4.png │ │ │ ├── creating_a_macOS_App_seciont4_step1.png │ │ │ ├── creating_a_macOS_App_seciont4_step2.png │ │ │ ├── creating_a_macOS_App_seciont4_step3.png │ │ │ ├── creating_a_macOS_App_seciont4_step4.png │ │ │ ├── creating_a_macOS_App_seciont4_step5.png │ │ │ ├── creating_a_macOS_App_seciont5.png │ │ │ ├── creating_a_macOS_App_seciont5_step10.png │ │ │ ├── creating_a_macOS_App_seciont5_step3.png │ │ │ ├── creating_a_macOS_App_seciont5_step4.png │ │ │ ├── creating_a_macOS_App_seciont5_step5.png │ │ │ ├── creating_a_macOS_App_seciont5_step6.png │ │ │ ├── creating_a_macOS_App_seciont5_step7.png │ │ │ ├── creating_a_macOS_App_seciont5_step8.png │ │ │ ├── creating_a_macOS_App_seciont6.png │ │ │ ├── creating_a_macOS_App_seciont6_step2.png │ │ │ ├── creating_a_macOS_App_seciont6_step3.png │ │ │ ├── creating_a_macOS_App_seciont6_step4.png │ │ │ ├── creating_a_macOS_App_seciont6_step6.png │ │ │ ├── creating_a_macOS_App_seciont6_step7.png │ │ │ ├── creating_a_macOS_App_seciont7.png │ │ │ ├── creating_a_macOS_App_seciont7_step1.png │ │ │ ├── creating_a_macOS_App_seciont7_step2.png │ │ │ ├── creating_a_macOS_App_seciont7_step3.png │ │ │ ├── creating_a_macOS_App_seciont8.png │ │ │ ├── creating_a_macOS_App_seciont8_step2.png │ │ │ ├── creating_a_macOS_App_seciont8_step5.png │ │ │ ├── creating_a_macOS_App_seciont9.png │ │ │ ├── creating_a_macOS_App_seciont9_step10.png │ │ │ ├── creating_a_macOS_App_seciont9_step2.png │ │ │ ├── creating_a_macOS_App_seciont9_step3.png │ │ │ ├── creating_a_macOS_App_seciont9_step4.png │ │ │ ├── creating_a_macOS_App_seciont9_step5.png │ │ │ ├── creating_a_macOS_App_seciont9_step6.png │ │ │ ├── creating_a_macOS_App_seciont9_step7.png │ │ │ ├── creating_a_macOS_App_seciont9_step8.png │ │ │ ├── creating_a_macOS_App_seciont9_step9.png │ │ │ ├── framework_integeration.png │ │ │ ├── interfacing_with_uikit_section1.png │ │ │ ├── interfacing_with_uikit_section1_step1.png │ │ │ ├── interfacing_with_uikit_section1_step2.png │ │ │ ├── interfacing_with_uikit_section1_step3.png │ │ │ ├── interfacing_with_uikit_section1_step4.png │ │ │ ├── interfacing_with_uikit_section1_step5.png │ │ │ ├── interfacing_with_uikit_section1_step6.png │ │ │ ├── interfacing_with_uikit_section2.png │ │ │ ├── interfacing_with_uikit_section2_step1.png │ │ │ ├── interfacing_with_uikit_section2_step2.png │ │ │ ├── interfacing_with_uikit_section2_step3.png │ │ │ ├── interfacing_with_uikit_section2_step4.png │ │ │ ├── interfacing_with_uikit_section3.png │ │ │ ├── interfacing_with_uikit_section3_step1.png │ │ │ ├── interfacing_with_uikit_section3_step2.png │ │ │ ├── interfacing_with_uikit_section3_step3.png │ │ │ ├── interfacing_with_uikit_section3_step4.png │ │ │ ├── interfacing_with_uikit_section3_step5.png │ │ │ ├── interfacing_with_uikit_section3_step6.png │ │ │ ├── interfacing_with_uikit_section4.png │ │ │ ├── interfacing_with_uikit_section4_step1.png │ │ │ ├── interfacing_with_uikit_section4_step2.png │ │ │ ├── interfacing_with_uikit_section4_step3.png │ │ │ └── interfacing_with_uikit_section4_step4.png │ │ ├── interfaceing_with_uikit.files │ │ │ ├── InterfacingWithUIKit.zip │ │ │ ├── page-control.gif │ │ │ ├── swipe-binding-text.gif │ │ │ └── swipe-landmarks.gif │ │ └── interfaceing_with_uikit.md │ ├── images │ │ ├── swiftui-96x96_2x.png │ │ ├── swiftui-all-platforms.png │ │ ├── swiftui-animation-preview.png │ │ ├── swiftui-animation.png │ │ ├── swiftui-code-list-preview.png │ │ ├── swiftui-code-list.png │ │ ├── swiftui-design-tools.png │ │ ├── swiftui-feature-card-preview.png │ │ ├── swiftui-feature-card.png │ │ ├── swiftui-introduction.png │ │ ├── swiftui-lesscode-betterapp.png │ │ └── swiftui-xcode-live-preview.png │ └── swiftui_essentials │ │ ├── _index.md │ │ ├── building_lists_and_navigation.files │ │ ├── BuildingListsAndNavigation.zip │ │ ├── swiftui-building-list-landmark-list-preview.gif │ │ └── swifui-building-list-navigation.gif │ │ ├── building_lists_and_navigation.md │ │ ├── creating_and_combining_views.files │ │ ├── CreatingAndCombiningViews.zip │ │ ├── create-new-project.gif │ │ ├── customize-text-view.gif │ │ ├── swiftui-embed-in-hstack.gif │ │ ├── swiftui-inspector-add-text-view.gif │ │ └── xcode-live-preview.gif │ │ ├── creating_and_combining_views.md │ │ ├── handling_user_input.files │ │ ├── HandlingUserInput.zip │ │ ├── landmarklist-environment.gif │ │ ├── swiftui-handle-user-input-start-completed.gif │ │ └── toggle-state-live-preview.gif │ │ ├── handling_user_input.md │ │ └── images │ │ ├── create-new-project-app-template.png │ │ ├── create-new-project-completed.png │ │ ├── create-new-project-info.png │ │ ├── create-new-project-xcode-menu.png │ │ ├── create-new-project-xcode.png │ │ ├── swfitui-xcode-resume.png │ │ ├── swiftui-assets-catalog-editor.png │ │ ├── swiftui-buidling-list-sencedelegate-rootview.png │ │ ├── swiftui-building-list-circle-image-data.png │ │ ├── swiftui-building-list-circle-image-preview.png │ │ ├── swiftui-building-list-landmark-data-identifiable.png │ │ ├── swiftui-building-list-landmark-detail-preview.png │ │ ├── swiftui-building-list-landmark-detail.png │ │ ├── swiftui-building-list-landmark-list-data.png │ │ ├── swiftui-building-list-landmark-list-dynamic.png │ │ ├── swiftui-building-list-landmark-list-file.png │ │ ├── swiftui-building-list-landmark-list-identifiable-data.png │ │ ├── swiftui-building-list-landmark-list-keypath-data.png │ │ ├── swiftui-building-list-landmark-list-to-detail.png │ │ ├── swiftui-building-list-landmark-list-two-rows.png │ │ ├── swiftui-building-list-landmark-list.png │ │ ├── swiftui-building-list-landmark-model.png │ │ ├── swiftui-building-list-landmark-row-create.png │ │ ├── swiftui-building-list-landmark-row-layout-1.png │ │ ├── swiftui-building-list-landmark-row-layout.png │ │ ├── swiftui-building-list-landmark-row.png │ │ ├── swiftui-building-list-map-view-data.png │ │ ├── swiftui-building-list-map-view-preview.png │ │ ├── swiftui-building-list-navigation-view-title.png │ │ ├── swiftui-building-list-navigationlink.png │ │ ├── swiftui-building-list-pass-data.png │ │ ├── swiftui-building-list-preivew-group.png │ │ ├── swiftui-building-list-preivew-layout-size.png │ │ ├── swiftui-building-list-preivew-multiple-device.png │ │ ├── swiftui-building-list-preview-dynamic.png │ │ ├── swiftui-building-list-preview-layout-group-configuration.png │ │ ├── swiftui-building-list-preview-muldevices.png │ │ ├── swiftui-building-list-preview-row-2.png │ │ ├── swiftui-building-list-row-preview.png │ │ ├── swiftui-building-list-sampe-data.png │ │ ├── swiftui-building-list.png │ │ ├── swiftui-circle-image-completed.png │ │ ├── swiftui-code-chage-foreground-color.png │ │ ├── swiftui-code-inspector-resume-font.png │ │ ├── swiftui-combine-view-begin.png │ │ ├── swiftui-combine-view-completed.png │ │ ├── swiftui-combine-view-problem2-1.png │ │ ├── swiftui-combine-view-problem2-2.png │ │ ├── swiftui-combine-view-problem2-3.png │ │ ├── swiftui-combine-view-problem2.png │ │ ├── swiftui-combine-view-problem3-1.png │ │ ├── swiftui-combine-view-problem3-2.png │ │ ├── swiftui-combine-view-problem3-3.png │ │ ├── swiftui-combine-view-problem4-1.png │ │ ├── swiftui-combine-view-problem4-2.png │ │ ├── swiftui-combine-view-problem4-3.png │ │ ├── swiftui-create-swiftui-file.png │ │ ├── swiftui-essentials.png │ │ ├── swiftui-handle-user-input-combine.png │ │ ├── swiftui-handle-user-input-favorite-button.png │ │ ├── swiftui-handle-user-input-favorite-star-button.png │ │ ├── swiftui-handle-user-input-landmark-detail-environment.png │ │ ├── swiftui-handle-user-input-list-environment.png │ │ ├── swiftui-handle-user-input-mark-favorite.png │ │ ├── swiftui-handle-user-input-model.png │ │ ├── swiftui-handle-user-input-observable.png │ │ ├── swiftui-handle-user-input-scene-delegate-environment.png │ │ ├── swiftui-handle-user-input-star.png │ │ ├── swiftui-handle-user-input-state-favorite.png │ │ ├── swiftui-handle-user-input-state.png │ │ ├── swiftui-handle-user-input-toggle-binding.png │ │ ├── swiftui-handle-user-input-toggle-state.png │ │ ├── swiftui-layout-stack.png │ │ ├── swiftui-mapview-mkmapview-wrapper.png │ │ ├── swiftui-mkmapview-live-preview.png │ │ ├── swiftui-preview-inspector-change-font.png │ │ ├── swiftui-preview-inspector-change-text.png │ │ ├── swiftui-preview-inspector.png │ │ ├── swiftui-uikit-swiftui-combine.png │ │ ├── swiftui-view-embed-in-vertical-stack.png │ │ ├── swiftui-vstack-leading-alignment.png │ │ ├── swiftui_building-list-landmark-detail-data.png │ │ ├── swifui-building-list-embed-in-navigation-view.png │ │ ├── swifui-building-list-preview-on-iphonese.png │ │ ├── swifui-create-circle-image.png │ │ └── swifui-turtlerock-overlay.png └── tdd │ ├── _index.md │ └── tdd_cycle.md ├── layouts ├── partials │ ├── footer.html │ ├── logo.html │ └── menu-footer.html └── shortcodes │ └── attachments.html ├── new_chapter ├── new_page ├── preview └── static ├── css └── theme-mine.css └── images └── favicon.png /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/hugo.yml: -------------------------------------------------------------------------------- 1 | name: 部署到GitPages 2 | run-name: ${{ github.actor }} 触发 3 | on: 4 | push: 5 | branches: 6 | - "master" 7 | paths: 8 | - "docs/**" 9 | - "layouts/**" 10 | - "static/**" 11 | - "config.toml" 12 | 13 | workflow_dispatch: 14 | 15 | jobs: 16 | publish: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: 安装Hugo 20 | uses: peaceiris/actions-hugo@v2 21 | with: 22 | hugo-version: '0.108.0' 23 | extended: true 24 | - name: 拉取仓库代码 25 | uses: actions/checkout@v3 26 | with: 27 | submodules: recursive 28 | - name: 运行部署脚本 29 | run: | 30 | git config user.name github-actions 31 | git config user.email github-actions@github.com 32 | ./deploy 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *webarchive 3 | site/ 4 | public/ 5 | resources/ 6 | .hugo_build.lock 7 | 8 | # Xcode 9 | # 10 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 11 | 12 | ## User settings 13 | xcuserdata/ 14 | 15 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 16 | *.xcscmblueprint 17 | *.xccheckout 18 | 19 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 20 | build/ 21 | DerivedData/ 22 | *.moved-aside 23 | *.pbxuser 24 | !default.pbxuser 25 | *.mode1v3 26 | !default.mode1v3 27 | *.mode2v3 28 | !default.mode2v3 29 | *.perspectivev3 30 | !default.perspectivev3 31 | 32 | ## Obj-C/Swift specific 33 | *.hmap 34 | 35 | ## App packaging 36 | *.ipa 37 | *.dSYM.zip 38 | *.dSYM 39 | 40 | ## Playgrounds 41 | timeline.xctimeline 42 | playground.xcworkspace 43 | 44 | # Swift Package Manager 45 | # 46 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 47 | # Packages/ 48 | # Package.pins 49 | # Package.resolved 50 | # *.xcodeproj 51 | # 52 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 53 | # hence it is not needed unless you have added a package configuration file to your project 54 | # .swiftpm 55 | 56 | .build/ 57 | 58 | # CocoaPods 59 | # 60 | # We recommend against adding the Pods directory to your .gitignore. However 61 | # you should judge for yourself, the pros and cons are mentioned at: 62 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 63 | # 64 | # Pods/ 65 | # 66 | # Add this line if you want to avoid checking in source code from the Xcode workspace 67 | # *.xcworkspace 68 | 69 | # Carthage 70 | # 71 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 72 | # Carthage/Checkouts 73 | 74 | Carthage/Build/ 75 | 76 | # Accio dependency management 77 | Dependencies/ 78 | .accio/ 79 | 80 | # fastlane 81 | # 82 | # It is recommended to not store the screenshots in the git repo. 83 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 84 | # For more information about the recommended setup visit: 85 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 86 | 87 | fastlane/report.xml 88 | fastlane/Preview.html 89 | fastlane/screenshots/**/*.png 90 | fastlane/test_output 91 | 92 | # Code Injection 93 | # 94 | # After new code Injection tools there's a generated folder /iOSInjectionProject 95 | # https://github.com/johnno1962/injectionforxcode 96 | 97 | iOSInjectionProject/ 98 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | 2 | [submodule "themes/hugo-theme-learn"] 3 | path = themes/hugo-theme-learn 4 | url = https://github.com/matcornic/hugo-theme-learn.git 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Joker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learn Swift 👉 [主页](https://swift.jokerhub.cn) 2 | 3 | 页面图片较多,建议拉取本地进行查看。 4 | 5 | 1. [安装Homebrew](https://brew.sh) 6 | 7 | 2. [安装Hugo](https://gohugo.io/getting-started/installing/) 8 | 9 | 3. 拉取仓库到本地,仓库包含子仓库,克隆使用下面命令 10 | 11 | ## 拉取仓库并预览 12 | 13 | ```bash 14 | git clone --recurse-submodules https://github.com/wangzhizhou/LearnSwift.git && \ 15 | cd LearnSwift/ && \ 16 | ./preview 17 | ``` 18 | -------------------------------------------------------------------------------- /archetypes/chapter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | weight: 1 5 | chapter: true 6 | pre: "X. " 7 | --- 8 | 9 | ### Chapter X 10 | 11 | # Some Chapter title 12 | 13 | Lorem Ipsum. -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | --- 5 | 6 | ### 第一节 7 | 8 | **步骤1** 9 | **步骤2** 10 | **步骤3** 11 | **步骤4** 12 | 13 | ### 第二节 14 | 15 | **步骤1** 16 | **步骤2** 17 | **步骤3** 18 | **步骤4** 19 | 20 | ### 第三节 21 | 22 | **步骤1** 23 | **步骤2** 24 | **步骤3** 25 | **步骤4** 26 | 27 | ### 第四节 28 | 29 | **步骤1** 30 | **步骤2** 31 | **步骤3** 32 | **步骤4** 33 | 34 | ### 检查是否理解 35 | 36 | **问题1** 37 | **问题2** 38 | **问题3** 39 | **问题4** -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | baseURL = "https://swift.jokerhub.cn" 2 | languageCode = "zh-cn" 3 | defaultContentLanguage = "zh-cn" 4 | theme = "hugo-theme-learn" 5 | 6 | title = "Learn Swift" 7 | metaDataFormat = "yaml" 8 | defaultContentLanguageInSubdir= false 9 | 10 | [params] 11 | editURL = "https://github.com/wangzhizhou/LearnSwift/edit/master/docs/" 12 | description = "Swift学习" 13 | author = "王志舟" 14 | showVisitedLinks = false 15 | disableSearch = false 16 | disableNextPrev = false 17 | disableAssetsBusting = false 18 | disableInlineCopyToClipBoard = true 19 | disableShortcutsTitle = true 20 | disableLandingPageButton = true 21 | disableLanguageSwitchingButton = true 22 | disableMermaid = false 23 | customMermaidURL = "https://unpkg.com/mermaid@8.8.0/dist/mermaid.min.js" 24 | ordersectionsby = "weight" 25 | themeVariant = "mine" 26 | custom_css = [] 27 | titleSeparator = "-" 28 | 29 | # 自定义参数 30 | disableMathJax = false 31 | contentDirName = "docs" 32 | 33 | [outputs] 34 | home = [ "HTML", "RSS", "JSON"] 35 | 36 | [[Languages.zh-cn.menu.shortcuts]] 37 | name = " GitHub 仓库" 38 | identifier = "ds" 39 | url = "https://github.com/wangzhizhou/LearnSwift.git" 40 | weight = 1 41 | 42 | [[Languages.zh-cn.menu.shortcuts]] 43 | name = " SwiftUI 视频" 44 | url = "https://developer.apple.com/videos/all-videos/?q=swiftui" 45 | weight = 2 46 | 47 | [[Languages.zh-cn.menu.shortcuts]] 48 | name = " SwiftUI 文档" 49 | url = "https://developer.apple.com/documentation/swiftui/" 50 | weight = 3 51 | 52 | [[Languages.zh-cn.menu.shortcuts]] 53 | name = " Learn 主题" 54 | identifier = "learndoc" 55 | url = "https://learn.netlify.app/en/" 56 | weight = 4 57 | 58 | [[Languages.zh-cn.menu.shortcuts]] 59 | name = " Tags 标签" 60 | url = "/tags" 61 | weight = 5 62 | 63 | [[Languages.zh-cn.menu.shortcuts]] 64 | name = " SwiftUI 官方教程(英文)" 65 | identifier = "swiftUI tutorials" 66 | url = "https://developer.apple.com/tutorials/swiftui/tutorials/" 67 | weight = 6 68 | 69 | [[Languages.zh-cn.menu.shortcuts]] 70 | name = " Font Awesome" 71 | identifier = "fontawesome" 72 | url = "https://fontawesome.com/icons?d=gallery&m=free" 73 | weight = 7 74 | 75 | [[Languages.zh-cn.menu.shortcuts]] 76 | name = " Swift 官网" 77 | identifier = "swift" 78 | url = "https://swift.org" 79 | weight = 8 80 | 81 | [[Languages.zh-cn.menu.shortcuts]] 82 | name = " Apple 官方论坛" 83 | identifier = "forums" 84 | url = "https://developer.apple.com/forums/" 85 | weight = 9 86 | 87 | [[Languages.zh-cn.menu.shortcuts]] 88 | name = " Apple 示例代码" 89 | identifier = "example code" 90 | url = "https://developer.apple.com/sample-code" 91 | weight = 10 92 | 93 | [[Languages.zh-cn.menu.shortcuts]] 94 | name = " Apple 官方文档" 95 | identifier = "documentation" 96 | url = "https://developer.apple.com/documentation/" 97 | weight = 11 98 | 99 | [[Languages.zh-cn.menu.shortcuts]] 100 | name = " flaticon" 101 | identifier = "flaticon" 102 | url = "https://www.flaticon.com/" 103 | weight = 12 104 | 105 | [[Languages.zh-cn.menu.shortcuts]] 106 | name = " SPM 查询" 107 | identifier = "SPM Index" 108 | url = "https://swiftpackageindex.com/" 109 | weight = 13 110 | 111 | [[Languages.zh-cn.menu.shortcuts]] 112 | name = " TOML 语法" 113 | identifier = "TOML" 114 | url = "https://toml.io" 115 | weight = 14 116 | 117 | [[Languages.zh-cn.menu.shortcuts]] 118 | name = " SaltTiger 书籍下载" 119 | identifier = "salttiger" 120 | url= "https://salttiger.com" 121 | weight = 15 122 | 123 | [[Languages.zh-cn.menu.shortcuts]] 124 | name = " visionOS" 125 | identifier = 'visionOS' 126 | url = "https://developer.apple.com/documentation/visionos" 127 | weight = 16 128 | -------------------------------------------------------------------------------- /deploy: -------------------------------------------------------------------------------- 1 | # !/usr/bin/env bash 2 | # -*- coding: utf-8 -*- 3 | 4 | if [ "`git status -s`" ] 5 | then 6 | echo "The working directory is dirty. Please commit any pending changes." 7 | exit 1; 8 | fi 9 | 10 | SITE_ROOT="." 11 | SITE_PUB_DIR="site" 12 | SITE_CONTENT_DIR="docs" 13 | SITE_THEME_DIR="themes" 14 | SITE_LAYOUT_DIR="layouts" 15 | SITE_CONFIG_FILE="config.toml" 16 | 17 | echo "Deleting old publication" 18 | rm -rf ${SITE_PUB_DIR} 19 | git fetch 20 | git worktree prune 21 | rm -rf .git/worktrees/${SITE_PUB_DIR} 22 | 23 | echo "Checking out gh-pages branch into public" 24 | git worktree add ${SITE_PUB_DIR} -B gh-pages 25 | 26 | echo "Removing existing files" 27 | rm -rf ${SITE_PUB_DIR}/* 28 | 29 | echo "swift.jokerhub.cn" > ${SITE_PUB_DIR}/CNAME 30 | 31 | echo "Generating site" 32 | hugo -s "${SITE_ROOT}" \ 33 | -e production \ 34 | --contentDir="${SITE_CONTENT_DIR}" \ 35 | --themesDir="${SITE_THEME_DIR}" \ 36 | --layoutDir="${SITE_LAYOUT_DIR}" \ 37 | --config="${SITE_CONFIG_FILE}" \ 38 | --destination="${SITE_PUB_DIR}" \ 39 | --ignoreCache=true \ 40 | 41 | echo "Updating gh-pages branch" 42 | cd ${SITE_PUB_DIR} && git add --all && git commit -m "Publishing to gh-pages" 43 | 44 | echo "Pushing to github" 45 | cd - 46 | 47 | git push -uf --all 48 | -------------------------------------------------------------------------------- /docs/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Learn Swift" 3 | date: 2020-04-27T22:14:13+08:00 4 | --- 5 | 6 | 站点主要记录我学习Swift及相关知识的过程,做为一个iOS开发者自我提升过程中的各种积累和沉淀。 -------------------------------------------------------------------------------- /docs/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "About" 3 | --- -------------------------------------------------------------------------------- /docs/combine/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Combine" 3 | date: 2020-07-25T20:05:58+08:00 4 | chapter: true 5 | weight: 4 6 | pre: "4. " 7 | --- 8 | 9 | # Combine 10 | 11 | 运用各种事件处理算子处理异步事件 12 | 13 | **系统版本要求** 14 | - `OS 13.0+` 15 | - `macOS 10.15+` 16 | - `Mac Catalyst 13.0+` 17 | - `tvOS 13.0+` 18 | - `watchOS 6.0+` 19 | 20 | ## 概述 21 | 22 | `Combine`框架提供声明式的`Swift API`来处理随时间变化的值。这些随时间变化的值可以代表异步事件流。 23 | 24 | `Combine`通过声明`publisher(发布器)`来传递随时间变化的值,供`subscriber(订阅器)`来接收处理。 25 | 26 | `Publisher`协议声明一个可以传递随时间变化的值的类型,并且定义了一些算子可以处理从上一个发布器接收的值,并将处理后的值传递给后面的接收器。 27 | 28 | 在发布器链路的末端,接收器处理接收到的每一个值。需要接收器主动请求,发布器才会吐出对应的值对接收器,这样可以在接收器侧通过代码控制获取值的速率。 29 | 30 | -------------------------------------------------------------------------------- /docs/dp/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Design Pattern" 3 | date: 2023-02-23T23:54:53+08:00 4 | weight: 6 5 | chapter: true 6 | pre: "6. " 7 | --- 8 | 9 | ### 设计模式 10 | 11 | # 如何成为一个真正的高级开发者 12 | 13 | 事实上,许多高级开发者仅仅只是拥有一个头衔,并不是真正具有高级开发者的实力。 14 | 15 | 那么,应该如何识别一个真正的高级开发者呢? 16 | 17 | 高级开发者应该具备哪些素质和能力? 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/dp/note.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "高级开发者学习笔记" 3 | date: 2023-02-24T00:01:05+08:00 4 | --- 5 | 6 | ### 单例和全局可变状态 7 | 8 | - Singleton: 完整的单例,一个类型只有一个实例 9 | - singleton: 不完整单例,一个类型有一个公用实例,但也可以根据需求创建其它实例 10 | - global mutable state: 全局可变状态会对单元测试造成阻碍,应该尽量避免 11 | 12 | ### 依赖反转(倒置) 13 | 14 | ### 注入方法 15 | 16 | - 通过闭包:单个的闭包可以看作是只有一个接口声明的协议,它们可以相互转换 17 | - 通过协议:是一组接口的包装 18 | 19 | ### 注入方式 20 | 21 | - 初始化构造器注入 22 | - 属性成员注入 23 | - 方法注入 24 | 25 | ### 依赖图 26 | 27 | 依赖图是一种交流工具,设计工具 28 | 29 | - 实线空箭头: 表示类继承关系 30 | - 实线实箭头: 表示成员强依赖关系 31 | - 虚线空箭头: 表示协议遵循关系 32 | - 虚线实箭头: 表示成员弱依赖关系 33 | - 方框加类名表示类型 34 | - 方框类名尖括号包裹表示协议类型,即接口。 35 | 36 | ### 类型组合 37 | 38 | 可以把不同的类型组合成一个新的类型 39 | 40 | ### 开闭原则+依赖倒置 41 | 42 | ### 模块化设计 43 | 44 | 模块化设计后,一些和特定平台无关的模块,可以单独进行测试,平台解藕也可以实现。 45 | 例如:原来在iOS模拟器跑的模块测试可以转移到Mac设备上进行,从而提升效率 46 | 47 | 模块化设计后,不同的模块开发工作可以合理的并行开发,节省时间成本,提高开发效率 48 | 49 | 所有的架构都是好的,区别只在于需要解决问题时的具体选择。选择最合适的架构优雅的解决问题才是目的 50 | 51 | 好的架构是由良好的沟通中产生的 52 | 53 | 建立良好的需求开发流程 54 | 55 | BDD->TDD->UserCases->Architecture->ModularDesign 56 | 57 | 沟通是关键,明确需求,细化实现,降低风险 58 | 59 | 尽量少用单例模式,通常单例模式是反模式的,不利于维护,我们使用单例大部分场景,只是为了更方便的调用,仅此而已,但这不利于代码的模块化设计,因为会造成很多耦合点 60 | 61 | 62 | ### 写单元测试 63 | 64 | - SUT(System Under Test) 65 | - 测试方法命名:test_method_expectation 66 | 67 | 单元测试涉及的四个术语: 68 | - Stubbing 69 | - Spying 70 | - Mock 71 | - dummy 72 | 73 | 善用Result类型,可以简化分支数量 74 | 75 | ### 测试网络请求的方法 76 | 77 | - 端到端:通过检查客户端-服务端之间真实的请求进行,由于依赖真实的网络请求,所以效率比较低,无法单独进行测试。 78 | - 子类Mock:不适合对我们不清楚的类进行子类化 79 | - 协议Mock:UR Loading System 80 | - 请求拦截:URLProtocol/registerClass(AnyClass)/unregisterClass(AnyClass) 81 | -------------------------------------------------------------------------------- /docs/swift/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Swift" 3 | date: 2023-02-18T10:51:33+08:00 4 | weight: 1 5 | chapter: true 6 | pre: "1. " 7 | --- 8 | 9 | # [Swift编程语言](https://swift.org) 10 | 11 | Swift 是编写软件的绝佳方式,无论是用于手机、台式机、服务器还是任何其他运行代码的软件。 12 | 13 | 它是一种安全、快速和交互式的编程语言,结合了现代语言思维的精华、Apple工程文化以及来自开源社区的各种贡献。 14 | 15 | Swift 编译器针​​对性能进行了优化,Swift 语言针对开发进行了优化,两者都没有妥协。 16 | 17 | Swift 对新手程序员很友好。它是一种工业级编程语言,与脚本语言一样富有表现力和乐趣。在 playground 中编写 Swift 代码可让您试验代码并立即查看结果。 18 | 19 | 代码经过编译和优化,充分利用现代硬件。强大的类型推断和模式匹配与现代、轻量级的语法相结合,使复杂的想法能够以清晰简洁的方式表达。因此,代码不仅更易于编写,而且更易于阅读和维护。 20 | 21 | --- 22 | 23 | **简单入门Swift基础语法,可以学习 👉 [**A Swift Tour**](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour),强烈建议硬刚英文,因为技术性英文只需要坚持一段时间,就可以适应,并不很难,尤其现在又有很多翻译工具可以辅助。** 24 | 25 | --- 26 | 27 | Swift官方已经整理了相当全面的文档资料,并且很容易进行访问和学习,更新也很及时,下面直接罗列一下官方文档链接: 28 | 29 | [**Introduction**](https://docs.swift.org/swift-book/documentation/the-swift-programming-language#welcome-to-swift) - [**Guide**](https://docs.swift.org/swift-book/documentation/the-swift-programming-language#language-guide) - [**Reference**](https://docs.swift.org/swift-book/documentation/the-swift-programming-language#language-reference) - [**Revision History**](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/revisionhistory) 30 | 31 | 因为官方文档是英文的,有英文阅读能力的建议直接学习官方文档,不太擅长英文的也建议硬刚,对于一些官方文档中需要深入学习的部分,再单独写文章进行挖掘。 32 | 33 | {{}} 34 | {{% tab name="MacOS" %}} 35 | 按下**Command**键同时再去点击链接,可以在新的浏览器窗口打开页面 36 | {{% /tab %}} 37 | {{% tab name="Windows" %}} 38 | 按下**Ctrl**键同时再去点击链接,可以在新的浏览器窗口打开页面 39 | {{% /tab %}} 40 | {{}} 41 | 42 | {{% notice note %}} 43 | 当然也有对应的 [**Swift语言中文翻译**](https://swiftgg.gitbook.io/swift),由于相对于英文版时效性比较差,并不能保持和Swift当前版本一样的更新进度,优先推荐学习官方英文版。 44 | {{% /notice %}} 45 | 46 | 如果你已经学习完基础的Swift语法,接触过一些Apple平台的项目,同时对视频学习也比较接受,也可以直接学习 **[WWDC]** 历年的视频集合,不过由于视频太多,全部学习不太现实,可以找自己比较侧重和关心的部分重点学习,这里苹果也提供了一个针对开发者的App,可以直接在应用内访问相关的学习资源:**[Developer]** 47 | 48 | 49 | [WWDC]: https://developer.apple.com/wwdc/ 50 | [Developer]: https://apps.apple.com/cn/app/apple-developer/id640199958 -------------------------------------------------------------------------------- /docs/swiftpm/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "SwiftPM" 3 | date: 2020-07-25T20:05:58+08:00 4 | chapter: true 5 | weight: 3 6 | pre: "3. " 7 | --- 8 | 9 | # SwiftPM 10 | 11 | `Swift Package Manager`简称`SwiftPM`或`SPM`,是用来管理Swift代码分发的工具,它与Swift构建系统集成在一起,可以自动处理代码的下载、编译和依赖链接。`Swift 3.0`及之后的版本中默认包含`Swift Package Manager`。 12 | 13 | --- 14 | 15 | Swift通过模块来组织代码,每一个模块都有一个对应的命名空间,模块中包含的代码会指定哪些部分可以被外部访问,哪些代码只能在模块内部使用。对于一个程序,可能所有的代码都写在一个模块中,也可能这个程序依赖了其它人写的模块。除了系统提供的模块可以被程序依赖以外,大部分情况下,我们写程序所依赖的其它模块都需要被先下载到本地,然后按指定顺序进行编译。 16 | 17 | 假设为了解决一个特定的问题我们写了一个模块,如果其它场景或其它人也要解决同样的问题,就可以把这个已经写好的模块直接拿过来使用,不需要重新再写一遍,这就是使用模块的好处。模块可以被复用,来提高生产效率。 18 | 19 | --- 20 | 21 | 在`Swift Package Manager`中,有几个概念需要先明确一下: 22 | - **包(Package)**: 一个包具体由Swift源码文件、清单文件(manifest)及资源文件(图片、视频、音频、文本等)组成。清单文件命名为`Package.swift`,使用`PackageDescription`模块定义了这个包的名称及包中包含的具体内容。从概念上来看,一个包中可能包含一个或多个编译目标(Target), 每一个编译目标会依赖一些其它的模块,一个编译目标经过编译器处理后会生成一个产物(Product)。 23 | - **产物(Product)**: 一个编译目标(Target)经过编译器处理后生成的产物可以分为两类:`库(library)`和`可执行文件(executable)`。`库(library)`中可以包含多个模块,`可执行文件(executable)`可以被操作系统调起运行。 24 | - **依赖(Dependency)**: 一个编译目标(Target)可能需要依赖其它模块才能被编译器成功编译生成产物,而依赖的模块可能存在于其它的包中。我们描述依赖的时候通常会使用一个URL及对应的版本号来指定,`Swift Package Manage`的作用就是自动的处理一个项目所依赖的所有包的下载工作并调用Swift工具链进行编译。一个包内部还会依赖其它包,这是一个递归的过程,可以用一棵依赖树来表示,`Swift Package Manager`就是解析这棵依赖树,下载所有的包并执行编译任务生成对应产物。 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/swiftpm/spm_in_cli.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "命令行下的SPM" 3 | date: 2020-11-24T02:22:36+08:00 4 | weight: 1 5 | --- 6 | 7 | ## 查看命令行帮助信息 8 | 9 | Swift工具链安装完成后,可以在控制台下使用下面命令查看Swift Package Manager的使用方法: 10 | 11 | ```bash 12 | swift package --help 13 | ``` 14 | 15 | 可以看到下面的帮助信息: 16 | 17 | ```bash 18 | $ swift package --help 19 | 20 | OVERVIEW: Perform operations on Swift packages 21 | 22 | SEE ALSO: swift build, swift run, swift test 23 | 24 | USAGE: swift package 25 | 26 | OPTIONS: 27 | --package-path 28 | Specify the package path to operate on (default current directory). This changes the working directory before any other operation 29 | --cache-path 30 | Specify the shared cache directory path 31 | --config-path 32 | Specify the shared configuration directory path 33 | --security-path 34 | Specify the shared security directory path 35 | --scratch-path 36 | Specify a custom scratch directory path (default .build) 37 | --enable-dependency-cache/--disable-dependency-cache 38 | Use a shared cache when fetching dependencies (default: true) 39 | --enable-build-manifest-caching/--disable-build-manifest-caching 40 | (default: true) 41 | --manifest-cache 42 | Caching mode of Package.swift manifests (shared: shared cache, local: package's build directory, none: disabled (default: shared) 43 | -v, --verbose Increase verbosity to include informational output 44 | --very-verbose, --vv Increase verbosity to include debug output 45 | --disable-sandbox Disable using the sandbox when executing subprocesses 46 | --enable-netrc/--disable-netrc 47 | Load credentials from a .netrc file (default: true) 48 | --netrc-file 49 | Specify the .netrc file path. 50 | --enable-keychain/--disable-keychain 51 | Search credentials in macOS keychain (default: true) 52 | --resolver-fingerprint-checking 53 | (default: strict) 54 | --enable-prefetching/--disable-prefetching 55 | (default: true) 56 | --force-resolved-versions, --disable-automatic-resolution, --only-use-versions-from-resolved-file 57 | Only use versions from the Package.resolved file and fail resolution if it is out-of-date 58 | --skip-update Skip updating dependencies from their remote during a resolution 59 | --disable-scm-to-registry-transformation 60 | disable source control to registry transformation (default: disabled) 61 | --use-registry-identity-for-scm 62 | look up source control dependencies in the registry and use their registry identity when possible to help deduplicate across the two origins (default: disabled) 63 | --replace-scm-with-registry 64 | look up source control dependencies in the registry and use the registry to retrieve them instead of source control when possible (default: disabled) 65 | -c, --configuration 66 | Build with configuration (default: debug) 67 | -Xcc Pass flag through to all C compiler invocations 68 | -Xswiftc Pass flag through to all Swift compiler invocations 69 | -Xlinker Pass flag through to all linker invocations 70 | -Xcxx Pass flag through to all C++ compiler invocations 71 | --triple 72 | --sdk 73 | --toolchain 74 | --sanitize Turn on runtime checks for erroneous behavior, possible values: address, thread, undefined, scudo 75 | --auto-index-store/--enable-index-store/--disable-index-store 76 | Enable or disable indexing-while-building feature (default: autoIndexStore) 77 | --enable-parseable-module-interfaces 78 | -j, --jobs The number of jobs to spawn in parallel during the build process 79 | --emit-swift-module-separately 80 | --use-integrated-swift-driver 81 | --experimental-explicit-module-build 82 | --print-manifest-job-graph 83 | Write the command graph for the build manifest as a graphviz file 84 | --build-system 85 | (default: native) 86 | --enable-dead-strip/--disable-dead-strip 87 | Disable/enable dead code stripping by the linker (default: true) 88 | --static-swift-stdlib/--no-static-swift-stdlib 89 | Link Swift stdlib statically (default: false) 90 | --version Show the version. 91 | -h, -help, --help Show help information. 92 | 93 | SUBCOMMANDS: 94 | clean Delete build artifacts 95 | purge-cache Purge the global repository cache. 96 | reset Reset the complete cache/build directory 97 | update Update package dependencies 98 | describe Describe the current package 99 | init Initialize a new package 100 | _format 101 | diagnose-api-breaking-changes 102 | Diagnose API-breaking changes to Swift modules in a package 103 | dump-symbol-graph Dump Symbol Graph 104 | dump-pif 105 | dump-package Print parsed Package.swift as JSON 106 | edit Put a package in editable mode 107 | unedit Remove a package from editable mode 108 | config Manipulate configuration of the package 109 | resolve Resolve package dependencies 110 | show-dependencies Print the resolved dependency graph 111 | tools-version Manipulate tools version of the current package 112 | generate-xcodeproj Generates an Xcode project. This command will be deprecated soon. 113 | compute-checksum Compute the checksum for a binary artifact. 114 | archive-source Create a source archive for the package 115 | completion-tool Completion tool (for shell completions) 116 | plugin Invoke a command plugin or perform other actions on command plugins 117 | 118 | See 'swift help package ' for detailed help. 119 | ``` 120 | 121 | ## 具体使用方法 122 | 123 | 就像帮助信息中所列的,命令行下使用SPM的格式如下: 124 | 125 | ``` 126 | swift package 127 | ``` 128 | 129 | 因为选项太多,我们在具体使用过程中可以在需要的时候从命令行帮助信息中查询,这里我们主要学习下这些子命令的使用方法,关于子命令的具体使用帮助信息,可以使用命令:`swift help package `在控制台随时进行查询学习 130 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /docs/swiftpm/spm_in_xcode.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Xcode中的SPM" 3 | date: 2020-11-24T03:22:36+08:00 4 | weight: 2 5 | --- 6 | 7 | Xcode本身自带Swift工具链,从Swift 3.0开始,已经集成了Swift Package Manager功能,所以安装成功后就可以直接使用SPM相关功能 8 | 9 | 在Xcode中使用SPM功能,主要是通过图形界面进行操作的 -------------------------------------------------------------------------------- /docs/swiftui/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "SwiftUI" 3 | date: 2020-04-29T01:41:31+08:00 4 | weight: 2 5 | chapter: true 6 | pre: "2. " 7 | --- 8 | 9 | ![swiftui](images/swiftui-96x96_2x.png) 10 | 11 | ## SwiftUI 12 | 13 | 借助 SwiftUI,您可以利用 Swift 的强大功能打造适合各个 Apple 平台的精美 app,而无需编写大量代码。SwiftUI 让您只需使用一套工具和 API,就能在任何 Apple 设备上为所有用户带来更加出色的体验。 14 | 15 | ![less code better app](images/swiftui-lesscode-betterapp.png) 16 | 17 | ## SwiftUI 新功能 18 | 19 | - **先进的 app 体验和工具**:您可以利用新功能增强您的 app,例如改进的列表视图、更好的搜索体验,以及对控制专注模式的支持。此外,还可以利用新的画布 API 这个 drawRect 的现代 GPU 加速替代方案,提高对底层绘图语言的控制。 20 | 21 | - **辅助功能改进**:利用新的 Rotor API,以简单列表形式在屏幕上显示最相关的项目,从而加快互动速度。当前的辅助功能焦点状态 (例如旁白光标) 现在可以朗读出来,甚至可以通过编程方式进行更改。而借助新的辅助功能表示 API,您的自定控件即可轻松继承现有标准 SwiftUI 控件的完整辅助功能支持。 22 | 23 | - **macOS 上的 SwiftUI 改进**:新的性能与 API 可用性改进,包括多列表格支持,让您的 macOS app 变得更加出色。 24 | 25 | - **全天候视网膜显示屏支持**:在 Apple Watch Series 5 及更新机型上,全天候视网膜显示屏让 watchOS app 即使在表盘变暗后,也能始终显示,重要信息一目了然。 26 | 27 | - **适用于 iPadOS 的小组件**:现在,小组件可以放在主屏幕中的任意位置上,而且尺寸进一步增大,带来全新的超大小组件。 28 | 29 | ## 声明式语法 30 | 31 | SwiftUI 采用声明式语法,您只需声明用户界面应具备的功能便可。例如,您可以写明您需要一个由文本栏组成的项目列表,然后描述各个栏位的对齐方式、字体和颜色。您的代码比以往更加简单直观和易于理解,可以节省您的时间和维护工作。 32 | 33 | ```swift 34 | import SwiftUI 35 | 36 | struct Content: View { 37 | 38 | @State var model = Themes.listModel 39 | 40 | var body: some View { 41 | 42 | List(model.items, action: model.selectItem) { item in 43 | 44 | Image(item.image) 45 | 46 | VStack(alignment: .leading) { 47 | 48 | Text(item.title) 49 | 50 | Text(item.subtitle).color(.gray) 51 | 52 | } 53 | } 54 | } 55 | } 56 | ``` 57 | 58 | 这种声明式风格甚至适用于动画等复杂的概念。只需几行代码,就能轻松地向几乎任何控件添加动画并选择一系列即时可用的特效。在运行时,系统会处理所有必要的步骤和中断因素,来保证您的代码流畅运行、保持稳定。实现动画效果是如此简单,您还能探索新的方式让 app 更生动出彩。 59 | 60 | ## 设计工具 61 | 62 | Xcode 包含直观的设计工具,只需拖放操作就能使用 SwiftUI 轻松构建界面。当您在设计画布中操作时,您的每一项编辑都会与相邻编辑器中的代码保持完全同步。在您键入时代码会立即以预览形式显示,您对预览进行的任何更改会立即反映在您的代码中。Xcode 会即时重新编译您的更改,并将它们插入到 app 的运行版本中,方便您随时查看和编辑。 63 | 64 | ![swiftui-design-tools](images/swiftui-design-tools.png) 65 | 66 | - **拖放操作**:只需在画布上拖放控件,就能调整组件在用户界面中的位置。点按打开检查器,即可选择字体、颜色、对齐方式和其他设计选项,并可通过光标轻松重新排列控件。多数这些可视化编辑器也可在代码编辑器中使用,因此您可以使用检查器来探索各个控件的新修饰符,即使您偏好手动编写界面组件代码也没问题。您还可以将控件从资源库拖放到设计画布上,或者直接拖放到代码中。 67 | 68 | - **动态替换**:Swift 编译器和运行时已全面嵌入到 Xcode 中,您可以随时构建和运行您的 app。您看到的设计画布不仅看起来像是用户界面——它确实就是您实时运行的 app。此外,借助 Swift 中新推出的“动态替换”功能,Xcode 可以直接在实时运行的 app 中替换编辑后的代码。 69 | 70 | - **预览**:您现在可以为任何 SwiftUI 视图创建一个或多个预览来获取样本数据。用户能看见的任何内容 (例如大字体、本地化或深色模式),你几乎都能配置。预览也可以显示您的 UI 在任何设备和方向上的呈现效果。 71 | 72 | ## 所有苹果设备原生支持SwiftUI 73 | 74 | ![all platforms](images/swiftui-all-platforms.png) 75 | 76 | --- 77 | 78 | SwiftUI是在苹果设备上创建用户界面的一种现代方法。可以更快的创建漂亮且充满活力的应用。 79 | 80 | ![swiftui introduction](images/swiftui-introduction.png) 81 | 82 | ## 只需要描述一次布局 83 | 84 | 声明式描述任何状态下的视图内容和布局。SwiftUI知道视图何时发生状态改变,并及时刷新对应状态下的视图内容。 85 | 86 | ![](images/swiftui-code-list.png) 87 | 88 | ![](images/swiftui-code-list-preview.png) 89 | 90 | ## 构建可复用组件 91 | 92 | 把多个目标单一的小视图组合成功能复杂的大视图进而组合成复杂的用户界面。同时自定义的视图还可以在不同的苹果平台设备应用开发中复用。 93 | 94 | ![](images/swiftui-feature-card.png) 95 | 96 | ![](images/swiftui-feature-card-preview.png) 97 | 98 | ## 简化动画效果实现 99 | 100 | 创建流畅的动画效果仅仅需要添加一个方法调用就可以完成。SwiftUI负责在必要时进行动画效果的内部计算和转场处理。 101 | 102 | ![](images/swiftui-animation.png) 103 | 104 | ![](images/swiftui-animation-preview.png) 105 | 106 | ## Xcode中实时预览 107 | 108 | 不需要实际运行应用就可以完成设计、构建和测试工作。使用交互式的预览功能来测试你开发的控件和页面布局。 109 | 110 | ![](images/swiftui-xcode-live-preview.png) 111 | -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "应用设计与布局" 3 | date: 2020-04-29T02:22:36+08:00 4 | weight: 30 5 | --- 6 | 7 | 深入了解使用SwiftUI创建的复杂的用户界面的结构和布局 8 | 9 | ![app design and layout](/swiftui/app_design_and_layout/images/app_design_and_layout.png?width=20pc) 10 | 11 | 12 | ### 包含章节 13 | 14 | {{% children style="li" %}} -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/ComposingComplexInterfaces.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/ComposingComplexInterfaces.zip -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/add-rows-landmarks.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/add-rows-landmarks.gif -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step1.gif -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step4.gif -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step5.gif -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/composing_complex_interfaces.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "组合复杂用户界面" 3 | date: 2020-05-19T23:15:25+08:00 4 | weight: 1 5 | --- 6 | 7 | `Landmarks`应用的首页是一个纵向滚动的地标类别列表,每一个类别内部是一个横向滑动列表。随后将构建应用的页面导航,这个过程中可以学习到如果组合各种视图,并让它们适配不同的设备尺寸和设备方向。 8 | 9 | {{%attachments title="项目文件" style="blue" pattern=".*zip" /%}} 10 | 11 | --- 12 | 13 | ### 第一节 添加一个首页视图 14 | 15 | 已经创建了所有在`Landmarks`应用中需要的视图,现在给应用创建一个首页视图,把之前创建的视图整合起来。首页不仅仅包含之前创建的视图,它还提供页面间导航的方式,同时也可以展示各种地标信息。 16 | 17 | ![section 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1.png?width=20pc) 18 | 19 | **步骤1** 创建一个名为`CategoryHome.swift`的自定义视图文件 20 | 21 | ![section 1 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step1.png?width=20pc) 22 | 23 | **步骤2** 把应用的场景代理(scene delegate)的根视图从之前的地标列表视图更改为新创建的首页视图。现在应用启动后的每一个页面就是首页了,所以还需要添加从首页导航跳转到其它页面的方法。 24 | 25 | ![section 1 step 2](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step2.png?width=40pc) 26 | 27 | **步骤3** 添加`NavigationView`,这个`NavigationView`将会容纳`Landmarks`应用中其它不同的视图。配合使用`NavigationView`、`NavigationLink`及相关的修改器,就可以构建出应用的页面间导航结构 28 | 29 | ![section 1 step 3](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step3.png?width=50pc) 30 | 31 | **步骤4** 设置导航栏标题为`Featured` 32 | 33 | ![section 1 step 4](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step4.png?width=50pc) 34 | 35 | ### 第二节 创建地标类别列表 36 | 37 | `Landmarks`应用为了便于用户浏览各种类别的地标,将地标按类别竖向排列形成列表视图,对于每一个类别内的具体地标,又把它们按照水平方向排列,形成横向列表。组合使用垂直栈(vertical statck)和水平栈(horizontal stack)并给列表添加滚动 38 | 39 | ![section 2](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2.png?width=20pc) 40 | 41 | **步骤1** 使用`Dictionary`结构体的初始化方法`init(grouping:by:)`,把地标数据的类别属性`category`传入作为分组依据,可以把地标数据按类别分组。工程文件中已经为每一个地标样本数据预定义了类别。 42 | 43 | ![section 2 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step1.png?width=30pc) 44 | 45 | **步骤2** 使用`List`显示地标数据的类别。`Landmark.Category`是枚举类型,它的值标识列表中每一种类别,可以保证类别不会有重复定义 46 | 47 | ![section 2 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step2.png?width=50pc) 48 | 49 | ### 第三节 添加针对单个类别的地标行列表 50 | 51 | `Landmarks`应用对每个类别下的地标采用横向滑动的行进行展示。添加一个新的视图类型用来表示这样一个地标行,然后使用这个新创建的行类型具体展示某一具体类型上的所有地标。 52 | 53 | ![section 3](/swiftui/app_design_and_layout/composing_complex_interfaces.files/add-rows-landmarks.gif?width=20pc) 54 | 55 | **步骤1** 定义一个新的视图类型,用来展示地标类别行的内容。新建行视图需要存放地标具体类别的展示数据 56 | 57 | ![section 3 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step1.png?width=50pc) 58 | 59 | **步骤2** 更新`CategoryHome.swift`的代码,把地标类别信息传给新建的行视图类型 60 | 61 | ![section 3 step 2](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step2.png?width=50pc) 62 | 63 | **步骤3** 在`CategoryRow.swift`中使用一个`HStack`展示类别下的地标内容 64 | 65 | ![section 3 step 3](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step3.png?width=50pc) 66 | 67 | **步骤4** 为行内容指定一个高度,并把行内容嵌入到`ScrollView`中,以支持横向滑动。预览视图时,可以多增加几个地标数据,用来查看列表的滑动是否正常。 68 | 69 | ![section 3 step 4](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step4.png?width=50pc) 70 | 71 | ### 第四节 组合首页 72 | 73 | `Landmarks`应用的首页在用户点击查看地标详情前需要先把地标的一些简单信息展示出来。复用之前创建的视图构建具体某一类别地标的行视图 74 | 75 | ![section 4](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4.png?width=20pc) 76 | 77 | **步骤1** 在`CategoryRow.swift`文件中,与`CategoryRow`类型并列,创建一个新的自定义视图类型`CategoryItem`,用这个新的视图类型替换`CategoryRow`的地标名称`Text`控件 78 | 79 | ![section 4 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step1.png?width=50pc) 80 | 81 | **步骤2** 在`CategoryHome.swift`中,添加一个名为`FeaturedLandmarks`的简单视图,这个视图用来显示地标数据中`isFeatured`属性为真的那些地标。在之后的教程中,会把`FeaturedLandmarks`这个视图修改成一个交互式轮播图。目前,这个视图仅仅展示一张缩放和剪裁后的地标图片。 82 | 83 | ![section 4 step 2](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step2.png?width=50pc) 84 | 85 | **步骤3** 把视图的边距设置为0,让展示内容可以尽量贴着屏幕边沿 86 | 87 | ![section 4 step 3](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step3.png?width=50pc) 88 | 89 | ### 第五节 90 | 91 | 现在所有类别的地标都可以在首页视图中展示出来,用户还需要能够进入应用其它页面的方法。使用页面导航和相关API来实现用户从应用首页到地标详情页、收藏列表页及用户个人中心页的跳转。 92 | 93 | ![section 5](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5.png?width=20pc) 94 | 95 | **步骤1** 在`CategoryRow.swift`中,把`CategoryItem`视图包裹在`NavigationLink`视图中。`CategoryItem`这时做为跳转按钮的内容,`destination`指定点击`NavigationLink`按钮时要跳转的目标视图。 96 | 97 | ![section 5 step 1](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step1.png?width=50pc) 98 | 99 | ![section 5 step 1 gif](/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step1.gif?width=20pc) 100 | 101 | **步骤2** 使用`renderingMode(_:)`和`foregroundColor(_:)`这两个属性修改器来改变地标类别项的导航样式。做为`NavigationLink`标签的`CategoryItem`中的文本会使用`Environment`中的强调颜色,图片可能以模板图片的方式渲染,这些都可以使用属性修改器来调整,达到最佳效果。 102 | 103 | ![section 5 step 2](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step2.png?width=50pc) 104 | 105 | **步骤3** 在`CategoryHome.swift`中,添加一个模态展示的用户信息展示页,点击了用户图标时弹出展示。当状态`showProfile`被置为`true`时,展示用户信息页,当`showProfile`状态置为`false`时,用户信息页消失。 106 | 107 | ![section 5 step 3](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step3.png?width=50pc) 108 | 109 | **步骤4** 在导航条上添加一个按钮,用来切换`showProfile`状态的值:`true`或者`false` 110 | 111 | ![section 5 step 4](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step4.png?width=50pc) 112 | 113 | ![section 5 step 4 gif](/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step4.gif?width=10pc) 114 | 115 | **步骤5** 在`CategoryHome.swift`中添加一个跳转链接,点击时跳转到全部地标的筛选页面。 116 | 117 | ![section 5 step 5](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step5.png?width=50pc) 118 | 119 | ![section 5 step 5 gif](/swiftui/app_design_and_layout/composing_complex_interfaces.files/swiftui-app-design-layout-section5-step5.gif?width=20pc) 120 | 121 | **步骤6** 把`LandmarkList.swift`中的把包裹地标列表视图的`NavigationView`移动到对应的预览视图中。因为在应用中,`LandmarkList`总是会被展示在`CategoryHome.swift`定义的导航视图中。 122 | 123 | ![section 5 step 6](/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step6.png?width=50pc) 124 | 125 | ### 检查是否理解 126 | 127 | **问题1** 对于`Landmarks`这个应用来说,哪一个视图是它的根视图? 128 | 129 | - [ ] SceneDelegate 130 | - [ ] Landmarks 131 | - [X] CategoryHome 132 | 133 | **问题2** `CategoryHome`这个视图是如何与应用的其它视图联动起来的 134 | 135 | - [ ] 在不同地标之间复用图片资源 136 | - [ ] 与其它视图使用一致的命名规范和属性修改器语法 137 | - [X] 使用导航结构把地标应用中所有视图连接在一起 138 | 139 | **问题3** 下面哪段代码可以将一个普通视图转化为一个具体点击导航功能的视图 140 | 141 | - [ ] ![problem 3 answer 1](/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer1.png?width=30pc&classes=border) 142 | - [X] ![problem 3 answer 2](/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer2.png?width=30pc&classes=border) 143 | - [ ] ![problem 3 answer 3](/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer3.png?width=30pc&classes=border) -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/app_design_and_layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/app_design_and_layout.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section3-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step5.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5-step6.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-app-design-layout-section5.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/swiftui-drawing-animation-problem3-answer3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step5.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step6.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step7.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step5.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step3.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step5.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step1.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step2.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/images/working-with-ui-controls-section4.png -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/working_with_ui_controls.files/WorkingWithUIControls.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/app_design_and_layout/working_with_ui_controls.files/WorkingWithUIControls.zip -------------------------------------------------------------------------------- /docs/swiftui/app_design_and_layout/working_with_ui_controls.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "玩转UI控件" 3 | date: 2020-05-19T23:15:53+08:00 4 | weight: 2 5 | --- 6 | 7 | 在`Landmarks`应用中,用户可以创建一个简介来描述他们自已的个人情况。为了让用户可以编辑自己的简介,我们需要添加一个编辑模式并设计一个偏好设置界面。 8 | 9 | 这里使用多种通用控件来展示用户的各种数据,并在用户保存他们所做的数据修改时更新地标数据模型。 10 | 11 | 按照步骤在下面的项目工程中一步步进行实践。 12 | 13 | {{%attachments title="项目文件" style="blue" pattern=".*zip" /%}} 14 | 15 | --- 16 | 17 | ### 第一节 展示用户简介 18 | 19 | `Landmarks`应用在本地存储了一些配置和用户偏好设置。在用户编辑这些数据前,会被展示在一个没有编辑按钮的概要视图上。 20 | 21 | ![secion 1](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1.png?width=30pc) 22 | 23 | **步骤1** 24 | 25 | 在项目文件导航栏的`Landmarks`文件组下面新建一个名为`Profile`的文件组,并在这个新建的文件组下面添加一个新视图`ProfileHost`, 这个新视图包含一个`TextView`,用来展示用户名称。`ProfileHost`将会展示静态概要信息,同时支持编辑模式 26 | 27 | ![secion 1 step 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step1.png?width=50pc) 28 | 29 | **步骤2** 用步骤1创建的`ProfileHost`替换`Home.swift`中的静态文本`Text`视图。现在主页中的`profile`按钮点击时可以调起一个用户简介页面了 30 | 31 | ![secion 1 step 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step2.png?width=50pc) 32 | 33 | **步骤3** 创建一个新的视图命名为`ProfileSummary`,它会持有一个`Profile`实例,并显示一些用户的基本信息。`Profile`概要视图持有一个`Profile`对像的原因是,因为它的父视图`ProfileHost`管理着视图的状态,它不能与`Profile`进行绑定。 34 | 35 | ![secion 1 step 3](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step3.png?width=50pc) 36 | 37 | **步骤4** 更新`ProfileHost`文件,显示新的概要视图 38 | 39 | ![secion 1 step 4](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step4.png?width=50pc) 40 | 41 | **步骤5** 创建一个名为`HikeBadge`的新视图,这个新视图由`Badge`视图和一些描述性文字构成。`Badge`仅仅是一个图形,在`HikeBadge`视图中的文本与`accessibility(label:)`属性修改器一起,可以让这个徽章对用户更加清晰。注意`frame(width:height:)`的两种不同的用法用来配置徽章以不同的缩放尺寸显示。 42 | 43 | ![secion 1 step 5](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step5.png?width=50pc) 44 | 45 | **步骤6** 更新`ProfileSummary`文件,添加几个不同的徽章代表用户得到的不同徽章 46 | 47 | ![secion 1 step 6](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step6.png?width=50pc) 48 | 49 | **步骤7** 把`HikeView`包含在`ProfileSummary`页面中后,就完成了第一节的实践内容了。 50 | 51 | ![secion 1 step 7](/swiftui/app_design_and_layout/images/working-with-ui-controls-section1-step7.png?width=50pc) 52 | 53 | ### 第二节 添加编辑模式 54 | 55 | 用户需要能够在浏览模式和编辑模式之间进行切换来查看或者修改用户简介的信息。通过在`ProfileHost`上添加一个`Edit Button`,然后创建一个用来编辑简介信息的页面。 56 | 57 | ![secion 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2.png?width=20pc) 58 | 59 | **步骤1** 添加一个`Enviornment`视图属性,用来使用`\.edit`模式。可以使用这个属性来读写当前编辑模式。 60 | 61 | ![secion 2 step 1](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step1.png?width=30pc) 62 | 63 | **步骤2** 创建一个编辑按钮,可以切换编辑模式 64 | 65 | ![secion 2 step 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step2.png?width=50pc) 66 | 67 | **步骤3** 更新`UserData`类,包含一个Profile实例,即使用户简介页面消失后也可以存储编辑后的信息 68 | 69 | ![secion 2 step 3](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step3.png?width=30pc) 70 | 71 | **步骤4** 从环境变量中读取用户简介信息,并把数据传递给`ProfileHost`视图的控件上进行展示。为了在编辑状态下修改简介信息后确认修改前避免更新全局状态(例如在编辑用户名的过程中),编辑视图在一个备份属性中进行相应的修改操作,确认修改后,才把备份属性同步到全局应用状态中。 72 | 73 | ![secion 2 step 4](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step4.png?width=30pc) 74 | 75 | **步骤5** 添加一个条件视图,可以用来显示静态用户简介视图或者是用户简介视图的编辑模式。当前的编辑模式只支持静态文本框的编辑。 76 | 77 | ![secion 2 step 5](/swiftui/app_design_and_layout/images/working-with-ui-controls-section2-step5.png?width=50pc) 78 | 79 | ### 第三节 定义简介编辑器 80 | 81 | 用户简介编辑器包含几个单独的控件用来修改对应简介信息。在简介中,一些项例如徽章是不可以编辑修改的,所以它们不会出现在简介编辑器中。为了保持简介在编辑模式和浏览模式的一致性,需要按照简介页面各项相同的顺序进行添加。 82 | 83 | **步骤1** 创建一个名为`ProfileEditor`的新视图,并绑定用户简介中的草稿。视图中的第一个控件是`TextField`,用来更新用户名字段值。创建`TextField`时要提供一个标签和一个绑定字符串。 84 | 85 | ![secion 3 step 1](/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step1.png?width=50pc) 86 | 87 | **步骤2** 更新`ProfileHost`中的条件内容,让它包含条件编辑器并把简单的绑定关系传递给简介编辑器。现在当你点击`Edit`按钮,简介视图就会变成编辑模式了。 88 | 89 | ![secion 3 step 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step2.png?width=50pc) 90 | 91 | **步骤3** 添加一个切换开关,用来设置用户是否接收相关地标事件的推送通知。这个`Toggle`控件打开和关闭正好对应着布尔值的`true`或`false`。 92 | 93 | ![secion 3 step 3](/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step3.png?width=50pc) 94 | 95 | **步骤4** 把一个`Picker`和一个`Text`放在`VStack`结构里,让这个地标可以选择不同季节。 96 | 97 | ![secion 3 step 4](/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step4.png?width=50pc) 98 | 99 | **步骤5** 最后,在季节图片选择器下方添加一个`DatePicker`,用来修改地标的目标浏览日期 100 | 101 | ![secion 3 step 5](/swiftui/app_design_and_layout/images/working-with-ui-controls-section3-step5.png?width=50pc) 102 | 103 | ### 第四节 延迟编辑传播 104 | 105 | 在编辑模式时,使用用户简介信息的备份进行修改,当用户确认进行修改后,再用修改的备份信息覆盖真正的用户信息。直到用户退出编辑模式前都不让编辑的备份生效。 106 | 107 | ![secion 4](/swiftui/app_design_and_layout/images/working-with-ui-controls-section4.png?width=20pc) 108 | 109 | **步骤1** 在`ProfileHost`视图上添加一个取消按钮。不像编辑模式按钮提供的完成按钮,取消按钮不会应用修改后的简介备份信息到实际的简介数据上。 110 | 111 | ![secion 4 step 1](/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step1.png?width=40pc) 112 | 113 | **步骤2** 当用户点击完成按钮后,使用`onAppear(perform:)`和`onDisappear(perform:)`来更新或保存用户简介数据。下一次进入编辑模式时,使用上一次的用户简介数据来展示。 114 | 115 | ![secion 4 step 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-section4-step2.png?width=40pc) 116 | 117 | ### 检查是否理解 118 | 119 | **问题1** 编辑状态改变时,怎样更新一个视图,例如,当用户编辑了用户简介信息后点击完成按钮的情况下,是怎么更新一个视图的 120 | 121 | - [ ] ![problem 1 answer 1](/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer1.png?width=30pc&classes=border) 122 | - [X] ![problem 1 answer 2](/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer2.png?width=30pc&classes=border) 123 | - [ ] ![problem 1 answer 3](/swiftui/app_design_and_layout/images/working-with-ui-controls-problem1-answer3.png?width=30pc&classes=border) 124 | 125 | **问题2** 什么情况下需要添加一个`accessiblity`标签,使用`accessibility(label:)`修改器? 126 | 127 | - [ ] 在应用的每一个视图都添加一个`accessibility`标签 128 | - [X] 当可以让用户界面元素对用户变的更清晰时,添加一个`accessibility`标签 129 | - [ ] 只有当你没有给视图清加tag时才可以使用`accessibility(label:)` 130 | 131 | **问题3** 模态和非模态视图展示有什么差别? 132 | 133 | - [ ] 当模态展示一个视图时,源视图设置目标视图的编辑模式 134 | - [ ] 当非模态展示一个视图时,目标视图会盖住源视图并且替代当前的导航栈 135 | - [X] 当模态展示一个视图时,目标视图盖住源视图并替换当前导航栈 -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "绘制和动画" 3 | date: 2020-04-29T02:21:18+08:00 4 | weight: 20 5 | --- 6 | 7 | 学习绘制形状和路径,并创建徽章和添加动画 8 | 9 | ![drawing and animation](/swiftui/drawing_and_animation/images/drawing_and_animation.png?width=20pc) 10 | 11 | ### 包含章节 12 | 13 | {{% children style="li" %}} 14 | -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/AnimatingViewsAndTransitions.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/AnimatingViewsAndTransitions.zip -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade-slide-scale.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade-slide-scale.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/customize-view-transitions.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/customize-view-transitions.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/hike-graph-transition-spring-animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/hike-graph-transition-spring-animation.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/live-preview-animations.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/live-preview-animations.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-aniamtion.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-aniamtion.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-animation-scale.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-animation-scale.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-delay-index-based.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-delay-index-based.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-speed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-speed.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/transition-slide.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/transition-slide.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-block.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-block.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-duration.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-duration.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-interrupt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-interrupt.gif -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/animating_views_and_transitions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "视图动画和转场" 3 | date: 2020-05-07T23:20:35+08:00 4 | weight: 2 5 | --- 6 | 7 | 使用SwiftUI可以把视图状态的改变转成动画过程,`SwiftUI`会处理所有复杂的动画细节 8 | 9 | 在这篇中,会给跟踪用户徒步的图表视图添加动画。使用`animation(_:)`修改器给一个视图添加动画效果非常容易 10 | 11 | 下载起步项目并跟着本篇教程一步步实践,或者查看本篇完成状态时的工程代码去学习 12 | 13 | {{%attachments title="项目文件" style="blue" pattern=".*zip" /%}} 14 | 15 | --- 16 | 17 | ### 第一节 给每个视图单独添加动画 18 | 19 | 在视图上使用`animation(_:)`修改器时,`SwiftUI`会在视图的任何可进行动画的属性发生改变时产生对应的动画效果。视图的颜色、不透明度、旋转角度、大小及一些其它属性都是可进行动画的 20 | 21 | ![animate button](/swiftui/drawing_and_animation/images/swiftui-drawing-path-and-shape-animate-button.png?width=20pc) 22 | 23 | **步骤1** 在`HikeView.swift`中,打开实时预览,体验一下图表的打开和隐藏,此时的状态改变时是没有添加动画效果的。在本篇的实践中,保持实时预览一直打开,每一步修改的效果就可以实时的看到 24 | 25 | ![live preview animation](/swiftui/drawing_and_animation/animating_views_and_transitions.files/live-preview-animations.gif?width=20pc) 26 | 27 | **步骤2** 给显示/隐藏切换的箭头按钮添加旋转动画,会发现现在按钮点击时的旋转有一个动画过渡的效果了 28 | 29 | ![rotate button animation](/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-animation.png?width=30pc) 30 | 31 | ![rotate button animation video](/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-aniamtion.gif?width=20pc) 32 | 33 | **步骤3** 当视图从隐藏到展示时,让切换按钮变大1.5倍 34 | 35 | ![rotate button scale](/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-scale.png?width=30pc) 36 | 37 | ![rotate button scale video](/swiftui/drawing_and_animation/animating_views_and_transitions.files/rotate-button-animation-scale.gif?width=20pc) 38 | 39 | **步骤4** 把动画的类型从`easeInOut`改为`spring()`。SwiftUI包含一些预设或可自定义的动画类型,像`弹簧(spring)`动画和类型`液体(fluid)`动画类型。可以调整动画开始前的等待时长、动画的速度也可以指定让动画循环重复的进行 40 | 41 | ![rotate button spring](/swiftui/drawing_and_animation/images/swiftui-animation-transtion-rotate-button-spring.png?width=30pc) 42 | 43 | **步骤5** 如果只想让按钮具有缩放动画而不进行旋转动画,可以在`scaleEffect`添加`animation(nil)`来实现。可以在这里做一些实验,如果把其它的一些动画效果结合在一起,会怎么样 44 | 45 | ![rotate button no rotate](/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-no-rotate.png?width=30pc) 46 | 47 | **步骤6** 学下一节之前,把本节中添加的`animation(_:)`修改器都去掉 48 | 49 | ![rotate button resume](/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-resume.png?width=30pc) 50 | 51 | ### 第二节 把视图的状态改态转化成动画效果 52 | 53 | 已经学会了给单个视图添加动画的方法,现在可以学习怎么在视图的状态发生改变时添加动画效果。当用户点击按钮时会切换`showDetail`状态的值,在视图变化过程中添加动画效果。 54 | 55 | ![state change](/swiftui/drawing_and_animation/images/swiftui-animation-transtion-state-change.png?width=10pc) 56 | 57 | **步骤1** 把`showDetail.toggle()`包裹在`withAnimation`函数调用块中。`showDetail`的改变影响了视图`HikeDetail`和详情切换按钮,在显示/隐藏详情的过程中都有了过滤动画效果。 58 | 59 | ![with_animation block](/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-block.gif?width=50pc) 60 | 61 | 放慢动画速度,可以观察`SwiftUI`动画在被中断下是怎么运作的 62 | 63 | **步骤2** 给`withAnimation`传入一个`时长4秒`的基本动画参数`.easeInOut(duration:4)`,可以指定动画过程时长,给`withAnimation`传入的动画参数与`.animation(_:)`修改器可用参数一致。 64 | 65 | ![with animation duration block](/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-duration.gif?width=50pc) 66 | 67 | **步骤3** 在动画过程进行中点击按钮切换视图状态,查看对应的动画被中断时的效果 68 | 69 | ![with animation interrupt](/swiftui/drawing_and_animation/animating_views_and_transitions.files/with-animation-interrupt.gif?width=20pc) 70 | 71 | **步骤4** 读下一节之前,把动画时长参数(`.easeInOut(duration: 4)`)去掉,让动画不再缓慢进行。 72 | 73 | ### 第三节 定制视图转场动画 74 | 75 | 默值情况下,视图离屏和入屏时的动画效果是`渐隐/渐现`, 这个默认的转场效果可以使用`transition(_:)`修改器进行定制。 76 | 77 | ![transitions](/swiftui/drawing_and_animation/animating_views_and_transitions.files/customize-view-transitions.gif?width=20pc) 78 | 79 | **步骤1** 给`HikeView`视图添加`transition(_:)`修改器,并定制转场参数为`.slide`,转场动画为`滑入/滑出` 80 | 81 | ![transition slide](/swiftui/drawing_and_animation/animating_views_and_transitions.files/transition-slide.gif?width=40pc) 82 | 83 | **步骤2** 可以把`滑入/滑出`这种转场动画封装起来,方便其它视图复用同样的转场效果 84 | 85 | ![custom transition effect](/swiftui/drawing_and_animation/images/swiftui-animation-transition-custom-transition.png?width=30pc) 86 | 87 | **步骤3** 在`moveAndFade`转场效果的定义中使用`move(edge:)`,让滑入/滑出从屏幕的同一边进行 88 | 89 | ![move and fade custom](/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade.gif?width=50pc) 90 | 91 | **步骤4** 使用`asymmetric(insertion:removal:)`修改器来定制视图显示/消失时的转场动画效果 92 | 93 | ![custom move and fade slide scale](/swiftui/drawing_and_animation/animating_views_and_transitions.files/custom-move-and-fade-slide-scale.gif?width=50pc) 94 | 95 | ### 第四节 组合复杂的动画效果 96 | 97 | 点击图表下面的三个按钮,会在三个不同的数据集间进行切换并展示。本节中会使用组合动画,让图表在不同数据集间切换时的转换动画流畅自然。 98 | 99 | ![combine animation](/swiftui/drawing_and_animation/images/swiftui-animation-transition-combine-animation.png?width=20pc) 100 | 101 | **步骤1** 把`showDetail`的默认值改为`true`,并把`HikeView`的预览模式视图固定在画布上。这样可以在编辑其它文件时,依然看到动画效果的变化。 102 | 103 | ![pin canvas](/swiftui/drawing_and_animation/images/swiftui-animation-transition-pin-canvas.png?width=50pc) 104 | 105 | **步骤2** 在`HikeGraph.swift`中定义了一个新的`波动`动画,并把它与`滑入/滑出`动画一起应用到图表视图上。 106 | 107 | ![hike graph ripple](/swiftui/drawing_and_animation/images/swiftui-animation-transition-hike-graph-ripple.png?width=50pc) 108 | 109 | **步骤3** 把动画切换为弹簧动画(`spring`),并设置弹簧阻尼系数为`0.5`,动画过程中产生了逐渐回弹效果 110 | 111 | ![spring animation](/swiftui/drawing_and_animation/animating_views_and_transitions.files/hike-graph-transition-spring-animation.gif?width=50pc) 112 | 113 | **步骤4** 加速弹簧动画的执行速度,缩短切换图表的时间 114 | 115 | ![spring animation speed](/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-speed.gif?width=50pc) 116 | 117 | **步骤5** 以当条形在图表中的位置为参数,添加延迟效果,图表中的每个条形会顺序动起来 118 | 119 | ![spring animation index based delay](/swiftui/drawing_and_animation/animating_views_and_transitions.files/spring-animation-delay-index-based.gif?width=50pc) 120 | 121 | **步骤6** 观察一下自定义`波动(rippling)`效果是怎么作用在视图转场中的 122 | 123 | ### 检查是否理解 124 | 125 | **问题1** 怎样从一串动画效果调用中,去掉其中的一种动画效果。以下面的代码为例,怎样去掉旋转动画 126 | 127 | ![problem 1](/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1.png?width=20pc) 128 | 129 | - [X] ![a1](/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-1.png?width=30pc&classes=border) 130 | - [ ] ![a2](/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-2.png?width=30pc&classes=border) 131 | - [ ] ![a3](/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-3.png?width=30pc&classes=border) 132 | 133 | **问题2** 当你开发动画的过程上,为什么要把预览视图固定在画布上? 134 | 135 | - [ ] 为了固定动画过程中的当前帧 136 | - [ ] 为了在多个设备配置开发中预览动画效果 137 | - [X] 为了在切换到其它不同文件时,固定显示当前视图的预览 138 | 139 | **问题3** 在视图状态改变时,如何快速测试一个动画在被中断时的表现 140 | 141 | - [ ] 在包含`animation(_:)`修改器的代码行上打一个断点,然后单步按动画帧进行测试 142 | - [X] 调整动画的持续时长,让动画在足够长的时间内完成,这样就可以调整动画的细节 143 | - [ ] 重复的调用`sleep(100)`来减慢动画的执行 144 | -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/drawing_paths_and_shapes.files/DrawingPathsAndShapes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/drawing_paths_and_shapes.files/DrawingPathsAndShapes.zip -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/drawing_and_animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/drawing_and_animation.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-combine-animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-combine-animation.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-custom-transition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-custom-transition.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-hike-graph-ripple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-hike-graph-ripple.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-pin-canvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-pin-canvas.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-1.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-2.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1-3.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-problem1.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-animation.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-no-rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-no-rotate.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-resume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-resume.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transition-rotate-button-scale.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transtion-rotate-button-spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transtion-rotate-button-spring.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-animation-transtion-state-change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-animation-transtion-state-change.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-background.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-center.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-combine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-combine.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-geometry-reader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-geometry-reader.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-geometry-scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-geometry-scale.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-gradient.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-hexagonal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-hexagonal.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-path-fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-path-fill.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-refactor-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-refactor-background.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-square.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-bottom.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-completed.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-create.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-fill.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol-top.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbol.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbols.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-symbols.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge-text.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badge.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badgebackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-badgebackground.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-create-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-create-file.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-hexagonal-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-hexagonal-data.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-name-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-name-file.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-path-start-point.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-path-start-point.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-path.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer1.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer2.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2-answer3.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem2.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer1.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer2.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3-answer3.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-problem3.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-rotate-badge-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-animation-rotate-badge-5.png -------------------------------------------------------------------------------- /docs/swiftui/drawing_and_animation/images/swiftui-drawing-path-and-shape-animate-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/drawing_and_animation/images/swiftui-drawing-path-and-shape-animate-button.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "框架集成" 3 | date: 2020-04-29T02:23:04+08:00 4 | weight: 40 5 | --- 6 | 7 | 混合使用SwiftUI框架和平台相关的其它UI框架(视图和视图控制器) 8 | 9 | ![framework and integeration](/swiftui/framework_integration/images/framework_integeration.png?width=20pc) 10 | 11 | ### 包含章节 12 | 13 | {{% children style="li" %}} -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/creating_a_macOS_App.files/CreatingAmacOSApp.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/creating_a_macOS_App.files/CreatingAmacOSApp.zip -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/creating_a_macOS_App.files/macos-landmark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/creating_a_macOS_App.files/macos-landmark.gif -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/creating_a_watchOS_App.files/CreatingAwatchOSApp.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/creating_a_watchOS_App.files/CreatingAwatchOSApp.zip -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/creating_a_watchOS_App.files/watch_landmark_app_test.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/creating_a_watchOS_App.files/watch_landmark_app_test.gif -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_problem1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_problem1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_problem5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_problem5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step1_1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step1_2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step2_1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step2_2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section1_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section2_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step10.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step8.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section3_step9.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section4_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section5_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section6_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step8.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step9_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step9_1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step9_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/create_a_watchOS_app_section7_step9_2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem1_answer3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem3_answer3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_problem4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_problem4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont10_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont1_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont2_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont3_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont4_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step10.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont5_step8.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont6_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont7_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont8_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step10.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step7.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step8.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/creating_a_macOS_App_seciont9_step9.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/framework_integeration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/framework_integeration.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section1_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section2_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step5.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section3_step6.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step1.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step2.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step3.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/images/interfacing_with_uikit_section4_step4.png -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/interfaceing_with_uikit.files/InterfacingWithUIKit.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/interfaceing_with_uikit.files/InterfacingWithUIKit.zip -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/interfaceing_with_uikit.files/page-control.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/interfaceing_with_uikit.files/page-control.gif -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/interfaceing_with_uikit.files/swipe-binding-text.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/interfaceing_with_uikit.files/swipe-binding-text.gif -------------------------------------------------------------------------------- /docs/swiftui/framework_integration/interfaceing_with_uikit.files/swipe-landmarks.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/framework_integration/interfaceing_with_uikit.files/swipe-landmarks.gif -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-96x96_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-96x96_2x.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-all-platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-all-platforms.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-animation-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-animation-preview.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-animation.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-code-list-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-code-list-preview.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-code-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-code-list.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-design-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-design-tools.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-feature-card-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-feature-card-preview.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-feature-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-feature-card.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-introduction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-introduction.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-lesscode-betterapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-lesscode-betterapp.png -------------------------------------------------------------------------------- /docs/swiftui/images/swiftui-xcode-live-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/images/swiftui-xcode-live-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "SwiftUI基础" 3 | date: 2020-04-29T02:19:26+08:00 4 | weight: 5 5 | --- 6 | 7 | 学习使用SwiftUI把简单的视图组合成复杂的页面、建立数据流以及页面间的导航,同时在Xcode中预览效果 8 | 9 | ![swift essentials](/swiftui/swiftui_essentials/images/swiftui-essentials.png?width=20pc) 10 | 11 | 12 | ### 包含章节 13 | 14 | {{% children style="li" %}} -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/BuildingListsAndNavigation.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/BuildingListsAndNavigation.zip -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/swiftui-building-list-landmark-list-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/swiftui-building-list-landmark-list-preview.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/swifui-building-list-navigation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/building_lists_and_navigation.files/swifui-building-list-navigation.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/CreatingAndCombiningViews.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/CreatingAndCombiningViews.zip -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/create-new-project.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/create-new-project.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/customize-text-view.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/customize-text-view.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/swiftui-embed-in-hstack.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/swiftui-embed-in-hstack.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/swiftui-inspector-add-text-view.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/swiftui-inspector-add-text-view.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/creating_and_combining_views.files/xcode-live-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/creating_and_combining_views.files/xcode-live-preview.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/handling_user_input.files/HandlingUserInput.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/handling_user_input.files/HandlingUserInput.zip -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/handling_user_input.files/landmarklist-environment.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/handling_user_input.files/landmarklist-environment.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/handling_user_input.files/swiftui-handle-user-input-start-completed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/handling_user_input.files/swiftui-handle-user-input-start-completed.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/handling_user_input.files/toggle-state-live-preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/handling_user_input.files/toggle-state-live-preview.gif -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/handling_user_input.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "处理用户输入" 3 | date: 2020-04-30T10:09:51+08:00 4 | weight: 3 5 | --- 6 | 7 | 在`Landmark`应用中,标记喜爱的地方,过滤地标列表,只显示喜欢的地标。要增加这些特性,首先要在列表上添加一个开关,用来过滤用户喜欢的地标。在地标上添加一个星标按钮,用户可以点击它来标记这个地标为自己喜欢的。 8 | 9 | 下载工程文件并且跟着下面的教程实践 10 | 11 | {{%attachments title="项目文件" style="blue" pattern=".*zip" /%}} 12 | 13 | --- 14 | 15 | ### 第一节 标记用户最喜欢的地标 16 | 17 | ![mark-favorite](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-mark-favorite.png?width=20pc) 18 | 19 | 给地标列表的每一行添加一个星标用来表示用户是否标记该地标为自己喜欢的 20 | 21 | **步骤1** 打开工程项目,在项目导航下选择`LandmarkRow.swift`文件 22 | 23 | **步骤2** 在空白占位后面添加一个`if`表达式,`if`表达式判断是否当前地标是用户喜欢的,如果用户标记当前地标为喜欢就显示星标。可以在SwitUI的代码块中使用`if`语句来条件包含视图 24 | 25 | **步骤3** 由于系统图片是矢量类型的,可以使用`foregroundColor(_:)`来改变它的颜色。当地标landmark的`isFavorite`属性为真时,星标显示,稍后会讲怎么修改属性值。 26 | 27 | ![star](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-star.png?width=50pc) 28 | 29 | ### 第二节 过滤列表 30 | 31 | 可以定制地标列表,让它只显示用户喜欢的地标,或者显示所有的地标。要实现这个功能,需要给`LandmarkList`视图类型添加一些状态变量。 32 | 33 | `状态(State)`是一个值或者一个值的集合,会随着时间而改变,同时会影响视图的内容、行为或布局。在属性前面加上`@State`修饰词就是给视图添加了一个状态值 34 | 35 | ![state](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state.png?width=20pc) 36 | 37 | **步骤1** 选择`LandmarkList.swift`文件,并给`LandmarkList`添加一个名为`showFavoritesOnly`的状态,初始值设置为`false` 38 | 39 | **步骤2** 点击`Resume`按钮或快捷键`Command+Option+P`刷新画布。当对视图进行添加或修改属性等结构性改变时,需要手动刷新画布 40 | 41 | **步骤3** 代码中通过检查`showFavoritesOnly`属性和每一个地标的`isFavorite`属性值来过滤地标列表所展示的内容 42 | 43 | ![state favorite](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state-favorite.png?width=50pc) 44 | 45 | ### 第三节 添加控件来切换状态 46 | 47 | 为了让用户控制地标列表的过滤器,需要添加一个可以修改`showFavoritesOnly`值的控件,传递一个绑定关系给`toggle`控件可以实现 48 | 49 | 一个绑定关系(`binding`)是对可变状态的引用。当用户点击`toggle`控件,从开到关或从关到开,`toggle`控件会通过绑定关系对应的更新视图的状态 50 | 51 | ![toggle state](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-state.png?width=20pc) 52 | 53 | **步骤1** 创建一个嵌套的`ForEach`组来把地标数据转换成地标行视图。在一个列表中组合静态和动态视图,或者组合两个甚至多个不同的动态视图组,使用`ForEach`类型动态生成而不是给列表传入数据集合生成列表视图 54 | 55 | **步骤2** 添加一个`Toggle`视图作为列表的每一个子视图,传入一个`showFavoritesOnly`的绑定关系。使用`$`前缀来获得一个状态变量或属性的绑定关系 56 | 57 | **步骤3** 实时预览模式下,点击`Toggle`控件来验证过滤器的功能 58 | 59 | ![toggle binding](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-binding.png?width=50pc) 60 | 61 | ![live preview](/swiftui/swiftui_essentials/handling_user_input.files/toggle-state-live-preview.gif?width=20pc) 62 | 63 | ### 第四节 使用可观察对象来存储数据 64 | 65 | 要实现用户标记哪个地标为自己喜爱的地标这个功能,需要使用可观察对象(`observalble object`)存放地标数据 66 | 67 | 可观察对象是一种可以绑定到具体SwifUI视图环境中的数据对象。`SwiftUI`可以察觉它影响视图展示的任何变化,并在这种变化发生后及时更新对应视图的展示内容 68 | 69 | ![observable](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-observable.png?width=10pc) 70 | 71 | **步骤1** 创建一个名为`UserData.swift`的文件 72 | 73 | **步骤2** 声明一个遵循`ObservableObject`协议的新数据模型,`ObservableObject`协议来自响应式框架`Combine`。SwiftUI可以订阅可观察对象,并在数据发生改变时更新视图的显示内容 74 | 75 | **步骤3** 添加存储属性`showFavoritesOnly`和`landmarks`,并赋予初始值。可观察对象需要对外公布内部数据的任何改动,因此订阅此可观察对象的订阅者就可以获得对应的数据改动信息 76 | 77 | **步骤4** 给新建的数据模型的每一个属性添加`@Published`属性修饰词 78 | 79 | ![combine](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-combine.png?width=40pc) 80 | 81 | ### 第五节 视图中适配数据模型对象 82 | 83 | 已经创建了`UserData`可观察对象,现在要改造视图,让它使用这个新的数据模型来存储视图内容数据 84 | 85 | ![model](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-model.png?width=30pc) 86 | 87 | **步骤1** 在`LandmarkList.swift`文件中,使用`@EnvironmentObject`修饰的`userData`属性来替换原来的`showFavoritesOnly`状态属性,并对预览视图调用`environmentObject(_:)`修改器。只要`environmentObject(_:)`修改器应用在视图的父视图上,`userData`就能够自动获取它的值。 88 | 89 | **步骤2** 替换原来使用`showFavoritesOnly`状态属性的地方,改为使用`userData`中的对应属性。与`@State`修饰的属性一样,也可以使用`$`前缀访问`userData`对象的成员绑定引用 90 | 91 | **步骤3** 创建`ForEach`实例时使用`userData.landmarks`做为数据源 92 | 93 | ![envrionment object](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-list-environment.png?width=50pc) 94 | 95 | **步骤4** 在`SceneDelegate.swift`中,对`LandmarkList`视图调用`environmentObject`修改器,这样可以把`UserData`的数据对象绑定到`LandmarkList`视图的环境变量中,子视图可以获得父视图环境中的变量。此时如果在模拟器或者真机上运行应用,也可以正常展示视图内容 96 | 97 | ![scene delegate](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-scene-delegate-environment.png?width=40pc) 98 | 99 | **步骤5** 更新`LandmarkDetail`视图,让它从父视图的环境变量中取要展示的数据。之后在更新地标的用户喜爱状态时,会用到`landmarkIndex`这个变量 100 | 101 | ![landmark detail environment](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-landmark-detail-environment.png?width=40pc) 102 | 103 | **步骤6** 切换到`LandmarkList.swift`文件,并打开实时预览视图去验证所添加的功能是否正常工作 104 | 105 | ![landmark list environment](/swiftui/swiftui_essentials/handling_user_input.files/landmarklist-environment.gif?width=20pc) 106 | 107 | ### 第六节 为每一个地标创建一个喜爱按钮 108 | 109 | `Landmark`这个应用可以在喜欢和不喜欢的地标列表间进行切换了,但喜欢的地标列表还是硬编码形成的,为了让用户可以自己标记哪个地标是自己喜欢的,需要在地标详情页添加一个标记喜欢的按钮 110 | 111 | ![favorite button](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-button.png?width=20pc) 112 | 113 | **步骤1** 在`LandmarkDetail.swift`的`HStack`中添加地标名称的`Text` 114 | 115 | **步骤2** 在地标名称的`Text`控件旁边添加一个新的按钮控件。使用`if-else`条件语句设置不同的图片显示状态表示这个地标是否被用户标记为喜欢。在`Button`的动作闭包中,使用了`landmarkIndex`去修改`userData`中对应地标的数据。 116 | 117 | ![favorite star button](/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-star-button.png?width=50pc) 118 | 119 | **步骤3** 切换到`landmarkList.swift`,并开启实时预览模式。当从列表页导航进入详情页后,点击喜欢按钮,喜欢的状态会在返回列表页后与列表中对应的地标喜欢状态保持一致,因为列表页和详情页的地标数据使用的是同一份,所以可以在不同页面间保持状态同步。 120 | 121 | ![star button completed](/swiftui/swiftui_essentials/handling_user_input.files/swiftui-handle-user-input-start-completed.gif?width=20pc) 122 | 123 | ### 检查是否理解 124 | 125 | **问题1** 下列选项哪个可以把数据按视图层级关系传递下去? 126 | 127 | - [ ] `@EnvironmentObject`属性 128 | - [X] `environmentObject(_:)`修改器 129 | 130 | **问题2** 绑定(binding)的作用是什么? 131 | 132 | - [X] 绑定是值和改变值的方法 133 | - [ ] 是一个视图连接在一起的方法,确保连续起来的视图接收同一份数据 134 | - [ ] 是一个临时固化值的方式,目的是在其它视图状态变化时,保持值不改变 135 | 136 | 137 | -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/create-new-project-app-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/create-new-project-app-template.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/create-new-project-completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/create-new-project-completed.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/create-new-project-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/create-new-project-info.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/create-new-project-xcode-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/create-new-project-xcode-menu.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/create-new-project-xcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/create-new-project-xcode.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swfitui-xcode-resume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swfitui-xcode-resume.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-assets-catalog-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-assets-catalog-editor.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-buidling-list-sencedelegate-rootview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-buidling-list-sencedelegate-rootview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-circle-image-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-circle-image-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-circle-image-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-circle-image-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-data-identifiable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-data-identifiable.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-detail-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-detail-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-detail.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-dynamic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-dynamic.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-file.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-identifiable-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-identifiable-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-keypath-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-keypath-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-to-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-to-detail.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-two-rows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list-two-rows.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-list.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-model.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-create.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-layout-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-layout-1.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row-layout.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-landmark-row.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-map-view-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-map-view-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-map-view-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-map-view-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-navigation-view-title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-navigation-view-title.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-navigationlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-navigationlink.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-pass-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-pass-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-group.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-layout-size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-layout-size.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-multiple-device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preivew-multiple-device.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-dynamic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-dynamic.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-layout-group-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-layout-group-configuration.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-muldevices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-muldevices.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-row-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-preview-row-2.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-row-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-row-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list-sampe-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list-sampe-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-building-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-building-list.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-circle-image-completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-circle-image-completed.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-code-chage-foreground-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-code-chage-foreground-color.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-code-inspector-resume-font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-code-inspector-resume-font.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-begin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-begin.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-completed.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-1.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-2.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2-3.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem2.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-1.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-2.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem3-3.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-1.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-2.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-combine-view-problem4-3.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-create-swiftui-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-create-swiftui-file.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-essentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-essentials.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-combine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-combine.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-button.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-star-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-favorite-star-button.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-landmark-detail-environment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-landmark-detail-environment.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-list-environment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-list-environment.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-mark-favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-mark-favorite.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-model.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-observable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-observable.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-scene-delegate-environment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-scene-delegate-environment.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-star.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state-favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state-favorite.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-state.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-binding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-binding.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-handle-user-input-toggle-state.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-layout-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-layout-stack.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-mapview-mkmapview-wrapper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-mapview-mkmapview-wrapper.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-mkmapview-live-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-mkmapview-live-preview.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector-change-font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector-change-font.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector-change-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector-change-text.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-preview-inspector.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-uikit-swiftui-combine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-uikit-swiftui-combine.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-view-embed-in-vertical-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-view-embed-in-vertical-stack.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui-vstack-leading-alignment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui-vstack-leading-alignment.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swiftui_building-list-landmark-detail-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swiftui_building-list-landmark-detail-data.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swifui-building-list-embed-in-navigation-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swifui-building-list-embed-in-navigation-view.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swifui-building-list-preview-on-iphonese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swifui-building-list-preview-on-iphonese.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swifui-create-circle-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swifui-create-circle-image.png -------------------------------------------------------------------------------- /docs/swiftui/swiftui_essentials/images/swifui-turtlerock-overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/docs/swiftui/swiftui_essentials/images/swifui-turtlerock-overlay.png -------------------------------------------------------------------------------- /docs/tdd/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "TDD" 3 | date = 2022-04-30T16:47:11+08:00 4 | weight = 5 5 | chapter = true 6 | pre = "5. " 7 | +++ 8 | 9 | # 测试驱动开发 10 | 11 | ## Test-Driven Development 12 | 13 | 把需求转换为测试用例,再把测试用例转换成生产环境代码 14 | 15 | 要求熟悉Swift语言与iOS应用开发基本流程 16 | 17 | 测试驱动开发是一种软件开发迭代方法,大体包含四个步骤: 18 | 19 | 1. 写失败的测试用例 20 | 2. 让测试用例通过 21 | 3. 修改代码 22 | 4. 重复整体过程 23 | 24 | 测试驱动开发可以通过写好的测试用例,确保你的软件在现在和未来都可以按照预想的方式正常运行 25 | 26 | 一个好的测试用例包含下面四个特点: 27 | 28 | 1. 条件不满足的情况下会发生失败 29 | 2. 可以被不断的重复执行 30 | 3. 运行耗时很短 31 | 4. 容易维护 32 | 33 | 34 | 测试覆盖率越高并不一定意味着软件被测试的越好了。 35 | 36 | 不需要对所有的逻辑都写测试 37 | 38 | - 通常对那些不能被自动化检测的代码逻辑写测试, 39 | - 自动生成的代码逻辑则没有必要写测试,因为自动生成器应该保证它们自动生成的代码逻辑的正确性 40 | - 对于可以触发编译警告和错误的代码逻辑也不需要写测试,因为编译器会发现它们 41 | - 不要为依赖代码写测试,依赖代码的测试应该由依赖提供方来保证 42 | - 在为了学习某个组件运行逻辑时,也可以写一些临时的测试,但是要记得用完后清理掉 43 | 44 | 45 | 对于测试驱动开发,通常有人会抱怨开发周期太长,耗时又费力。但是如果从长期来看,软件开发的时间成本,不仅仅是开发第一个版本所花费的时间,它应该还包括后期维护时迭代需求、代码重构、问题修复以及重复测试的时间。测试驱动开发从长期来看,是可以为软件开发工作节省整体成本的,同时它可以让问题尽早的暴露在开发阶段,避免造成线上问题 46 | 47 | 48 | ## 什么情况下应该采用TDD开发模式 49 | 50 | 如果你的软件需要长期维护、不断的迭代新功能和发布新版本,并且会不断的集成新功能和一些复杂逻辑,测试驱动开发就适合被引入到软件项目中。如果只是临时项目,测试驱动开发就是看你自己的决定了。 51 | 52 | 总体来说,测试驱动开发只是一种软件开发工具,具体情况还需要具体分析优缺点来决定是否采用 53 | -------------------------------------------------------------------------------- /docs/tdd/tdd_cycle.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "TDD 迭代循环" 3 | date = 2022-04-30T18:14:12+08:00 4 | weight = 5 5 | +++ 6 | 7 | 1. 写任何业务代码前,先写一个会失败的测试用例 8 | 2. 写最少的业务代码,让之前写的失败的测试用例通过测试 9 | 3. 重构你的业务代码和测试用例代码 10 | 4. 重复前面三个步骤,确何测试用例通正确通过测试 11 | 12 | 这个不断循环的开发流程被称为:`Red - Green - Refactor`循环 13 | 14 | 在这个循环过程中,可以把编译失败也看做是一次测试失败来处理 -------------------------------------------------------------------------------- /layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | {{ if .Params.chapter }} 2 | 3 | {{ end }} 4 | 5 | {{ partial "custom-comments.html" . }} 6 | 7 | 8 | 53 | 54 | 55 | 56 |
57 |
58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | {{ if (or (and (ne .Params.disableMermaid nil) (not .Params.disableMermaid)) (not .Site.Params.disableMermaid)) }} 70 | {{ if isset .Params "custommermaidurl" }} 71 | 72 | {{ else if isset .Site.Params "custommermaidurl" }} 73 | 74 | {{ else }} 75 | 76 | {{ end }} 77 | 80 | {{ end }} 81 | {{ if not .Site.Params.disableMathJax }} 82 | 83 | {{ end }} 84 | {{ partial "custom-footer.html" . }} 85 | 86 | -------------------------------------------------------------------------------- /layouts/partials/logo.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /layouts/partials/menu-footer.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /layouts/shortcodes/attachments.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` -}} 2 |
3 | 7 |
8 | {{- $filesName := "files" }} 9 | {{- if ne .Page.File.BaseFileName "index" }} 10 | {{- $filesName = printf "%s.files" .Page.File.BaseFileName }} 11 | {{- end}} 12 | {{- $fileDir := replace .Page.File.Dir "\\" "/" }} 13 | {{- $pattern := .Get "pattern" | default "" }} 14 | {{- range (readDir (printf "%s/%s%s" .Site.Params.contentDirName .Page.File.Dir $filesName) ) }} 15 | {{- if findRE $pattern .Name}} 16 | {{- $size := .Size }} 17 | {{- $unit := "Byte" }} 18 | {{- if ge $size 1024 }} 19 | {{- $size = div $size 1024 }} 20 | {{- $unit = "Kilobyte" }} 21 | {{- end}} 22 | {{- if ge $size 1024 }} 23 | {{- $size = div $size 1024 }} 24 | {{- $unit = "Megabyte" }} 25 | {{- end}} 26 |
  • 27 | {{.Name}} 28 | ({{$size}} {{T (print $unit "-symbol")}}) 29 |
  • 30 | {{- end}} 31 | {{- end}} 32 |
    33 | {{- .Inner}} 34 |
    35 | -------------------------------------------------------------------------------- /new_chapter: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #-*- coding: utf-8 -*- 3 | 4 | hugo new $1 --kind chapter \ 5 | --contentDir="docs" \ -------------------------------------------------------------------------------- /new_page: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #-*- coding: utf-8 -*- 3 | 4 | hugo new $1 \ 5 | --contentDir="docs" \ -------------------------------------------------------------------------------- /preview: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | #-*- utf-8 -*- 3 | 4 | pkill -9 hugo 5 | hugo \ 6 | --contentDir="docs" \ 7 | --themesDir="themes" \ 8 | --layoutDir="layouts" \ 9 | --config="config.toml" \ 10 | --ignoreCache=true \ 11 | --disableFastRender \ 12 | --navigateToChanged \ 13 | --minify \ 14 | --noBuildLock \ 15 | --noHTTPCache \ 16 | --printMemoryUsage \ 17 | --printPathWarnings \ 18 | --printUnusedTemplates \ 19 | server -D --bind "0.0.0.0" -p 1313 & 20 | sleep 2s 21 | open http://localhost:1313 22 | 23 | 24 | -------------------------------------------------------------------------------- /static/css/theme-mine.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | 4 | --MAIN-TEXT-color:#323232; /* Color of text by default */ 5 | --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ 6 | --MAIN-LINK-color:#1C90F3; /* Color of links */ 7 | --MAIN-LINK-HOVER-color:#167ad0; /* Color of hovered links */ 8 | --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ 9 | 10 | --MENU-HEADER-BG-color:#1C90F3; /* Background color of menu header */ 11 | --MENU-HEADER-BORDER-color:#33a1ff; /*Color of menu header border */ 12 | 13 | --MENU-SEARCH-BG-color:#167ad0; /* Search field background color (by default borders + icons) */ 14 | --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ 15 | --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ 16 | 17 | --MENU-SECTIONS-ACTIVE-BG-color:#20272b; /* Background color of the active section and its childs */ 18 | --MENU-SECTIONS-BG-color:#252c31; /* Background color of other sections */ 19 | --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ 20 | --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ 21 | --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ 22 | --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ 23 | 24 | --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ 25 | --MENU-SECTION-HR-color: #20272b; /* Color of
    separator in menu */ 26 | 27 | } 28 | 29 | body { 30 | color: var(--MAIN-TEXT-color) !important; 31 | } 32 | 33 | textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { 34 | border-color: none; 35 | box-shadow: none; 36 | } 37 | 38 | h2, h3, h4, h5 { 39 | color: var(--MAIN-TITLES-TEXT-color) !important; 40 | } 41 | 42 | a { 43 | color: var(--MAIN-LINK-color); 44 | } 45 | 46 | .anchor { 47 | color: var(--MAIN-ANCHOR-color); 48 | } 49 | 50 | a:hover { 51 | color: var(--MAIN-LINK-HOVER-color); 52 | } 53 | 54 | #sidebar ul li.visited > a .read-icon { 55 | color: var(--MENU-VISITED-color); 56 | } 57 | 58 | #body a.highlight:after { 59 | display: block; 60 | content: ""; 61 | height: 1px; 62 | width: 0%; 63 | -webkit-transition: width 0.5s ease; 64 | -moz-transition: width 0.5s ease; 65 | -ms-transition: width 0.5s ease; 66 | transition: width 0.5s ease; 67 | background-color: var(--MAIN-LINK-HOVER-color); 68 | } 69 | #sidebar { 70 | background-color: var(--MENU-SECTIONS-BG-color); 71 | } 72 | #sidebar #header-wrapper { 73 | background: var(--MENU-HEADER-BG-color); 74 | color: var(--MENU-SEARCH-BOX-color); 75 | border-color: var(--MENU-HEADER-BORDER-color); 76 | } 77 | #sidebar .searchbox { 78 | border-color: var(--MENU-SEARCH-BOX-color); 79 | background: var(--MENU-SEARCH-BG-color); 80 | } 81 | #sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { 82 | background: var(--MENU-SECTIONS-ACTIVE-BG-color); 83 | } 84 | #sidebar .searchbox * { 85 | color: var(--MENU-SEARCH-BOX-ICONS-color); 86 | } 87 | 88 | #sidebar a { 89 | color: var(--MENU-SECTIONS-LINK-color); 90 | } 91 | 92 | #sidebar a:hover { 93 | color: var(--MENU-SECTIONS-LINK-HOVER-color); 94 | } 95 | 96 | #sidebar ul li.active > a { 97 | background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); 98 | color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; 99 | } 100 | 101 | #sidebar hr { 102 | border-color: var(--MENU-SECTION-HR-color); 103 | } 104 | -------------------------------------------------------------------------------- /static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhizhou/LearnSwift/c36470b9527dfb313ea561307625154bd7d8401f/static/images/favicon.png --------------------------------------------------------------------------------