├── README.md
├── music-app-swiftui-Info.plist
├── music_app_swiftui.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── xcuserdata
│ └── CodeForAny.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ └── xcschememanagement.plist
└── music_app_swiftui
├── Assets.xcassets
├── AccentColor.colorset
│ └── Contents.json
├── AppIcon.appiconset
│ └── Contents.json
├── Contents.json
├── add.imageset
│ ├── Contents.json
│ └── add.png
├── alb_1.imageset
│ ├── Contents.json
│ └── alb_1.png
├── alb_2.imageset
│ ├── Contents.json
│ └── alb_2.png
├── alb_3.imageset
│ ├── Contents.json
│ └── alb_3.png
├── alb_4.imageset
│ ├── Contents.json
│ └── alb_4.png
├── alb_5.imageset
│ ├── Contents.json
│ └── alb_5.png
├── alb_6.imageset
│ ├── Contents.json
│ └── alb_6.png
├── app_logo.imageset
│ ├── Contents.json
│ └── app_logo.png
├── ar_1.imageset
│ ├── Contents.json
│ └── ar_1.png
├── ar_2.imageset
│ ├── Contents.json
│ └── ar_2.png
├── ar_3.imageset
│ ├── Contents.json
│ └── ar_3.png
├── ar_4.imageset
│ ├── Contents.json
│ └── ar_4.png
├── ar_5.imageset
│ ├── Contents.json
│ └── ar_5.png
├── ar_6.imageset
│ ├── Contents.json
│ └── ar_6.png
├── ar_d_1.imageset
│ ├── Contents.json
│ └── ar_d_1.png
├── ar_d_2.imageset
│ ├── Contents.json
│ └── ar_d_2.png
├── ar_d_3.imageset
│ ├── Contents.json
│ └── ar_d_3.png
├── ar_d_4.imageset
│ ├── Contents.json
│ └── ar_d_4.png
├── artitst_detail_top.imageset
│ ├── Contents.json
│ └── artitst_detail_top.png
├── b_player_next.imageset
│ ├── Contents.json
│ └── b_player_next.png
├── b_player_previous.imageset
│ ├── Contents.json
│ └── b_player_previous.png
├── back.imageset
│ ├── Contents.json
│ └── back.png
├── close.imageset
│ ├── Contents.json
│ └── close.png
├── eq.imageset
│ ├── Contents.json
│ └── eq.png
├── eq_display.imageset
│ ├── Contents.json
│ └── eq_display.png
├── fav.imageset
│ ├── Contents.json
│ └── fav.png
├── favTemp.imageset
│ ├── Contents.json
│ └── fav.png
├── gen_1.imageset
│ ├── Contents.json
│ └── gen_1.png
├── gen_2.imageset
│ ├── Contents.json
│ └── gen_2.png
├── gen_3.imageset
│ ├── Contents.json
│ └── gen_3.png
├── gen_4.imageset
│ ├── Contents.json
│ └── gen_4.png
├── gen_5.imageset
│ ├── Contents.json
│ └── gen_5.png
├── gen_6.imageset
│ ├── Contents.json
│ └── gen_6.png
├── gen_7.imageset
│ ├── Contents.json
│ └── gen_7.png
├── gen_8.imageset
│ ├── Contents.json
│ └── gen_8.png
├── home_tab.imageset
│ ├── Contents.json
│ └── home_tab.png
├── home_tab_un.imageset
│ ├── Contents.json
│ └── home_tab_un.png
├── img_1.imageset
│ ├── Contents.json
│ └── img_1.png
├── img_2.imageset
│ ├── Contents.json
│ └── img_2.png
├── img_3.imageset
│ ├── Contents.json
│ └── img_3.png
├── img_4.imageset
│ ├── Contents.json
│ └── img_4.png
├── img_5.imageset
│ ├── Contents.json
│ └── img_5.png
├── m_driver_mode.imageset
│ ├── Contents.json
│ └── m_driver_mode.png
├── m_eq.imageset
│ ├── Contents.json
│ └── m_eq.png
├── m_hidden_folder.imageset
│ ├── Contents.json
│ └── m_hidden_folder.png
├── m_ring_cut.imageset
│ ├── Contents.json
│ └── m_ring_cut.png
├── m_scan_media.imageset
│ ├── Contents.json
│ └── m_scan_media.png
├── m_sleep_timer.imageset
│ ├── Contents.json
│ └── m_sleep_timer.png
├── m_theme.imageset
│ ├── Contents.json
│ └── m_theme.png
├── menu.imageset
│ ├── Contents.json
│ └── menu.png
├── more.imageset
│ ├── Contents.json
│ └── more.png
├── more_btn.imageset
│ ├── Contents.json
│ └── more_btn.png
├── mp_1.imageset
│ ├── Contents.json
│ └── mp_1.png
├── mp_2.imageset
│ ├── Contents.json
│ └── mp_2.png
├── mp_3.imageset
│ ├── Contents.json
│ └── mp_3.png
├── mp_4.imageset
│ ├── Contents.json
│ └── mp_4.png
├── next_song.imageset
│ ├── Contents.json
│ └── next_song.png
├── pause.imageset
│ ├── Contents.json
│ └── pause.png
├── play.imageset
│ ├── Contents.json
│ └── play.png
├── play_btn.imageset
│ ├── Contents.json
│ └── play_btn.png
├── play_eq.imageset
│ ├── Contents.json
│ └── play_eq.png
├── play_n.imageset
│ ├── Contents.json
│ └── play_n.png
├── player_image.imageset
│ ├── Contents.json
│ └── player_image.png
├── playlist.imageset
│ ├── Contents.json
│ └── playlist.png
├── playlist_1.imageset
│ ├── Contents.json
│ └── playlist_1.png
├── playlist_2.imageset
│ ├── Contents.json
│ └── playlist_2.png
├── playlist_3.imageset
│ ├── Contents.json
│ └── playlist_3.png
├── playlist_4.imageset
│ ├── Contents.json
│ └── playlist_4.png
├── previous_song.imageset
│ ├── Contents.json
│ └── previous_song.png
├── repeat.imageset
│ ├── Contents.json
│ └── repeat.png
├── s1.imageset
│ ├── Contents.json
│ └── s1.png
├── s10.imageset
│ ├── Contents.json
│ └── s10.png
├── s2.imageset
│ ├── Contents.json
│ └── s2.png
├── s3.imageset
│ ├── Contents.json
│ └── s3.png
├── s4.imageset
│ ├── Contents.json
│ └── s4.png
├── s5.imageset
│ ├── Contents.json
│ └── s5.png
├── s6.imageset
│ ├── Contents.json
│ └── s6.png
├── s7.imageset
│ ├── Contents.json
│ └── s7.png
├── s8.imageset
│ ├── Contents.json
│ └── s8.png
├── s9.imageset
│ ├── Contents.json
│ └── s9.png
├── s_audio.imageset
│ ├── Contents.json
│ └── s_audio.png
├── s_display.imageset
│ ├── Contents.json
│ └── s_display.png
├── s_headset.imageset
│ ├── Contents.json
│ └── s_headset.png
├── s_lock_screen.imageset
│ ├── Contents.json
│ └── s_lock_screen.png
├── s_menu.imageset
│ ├── Contents.json
│ └── s_menu.png
├── s_other.imageset
│ ├── Contents.json
│ └── s_other.png
├── search.imageset
│ ├── Contents.json
│ └── search.png
├── setting_tab.imageset
│ ├── Contents.json
│ └── setting_tab.png
├── setting_tab_un.imageset
│ ├── Contents.json
│ └── setting_tab_un.png
├── share.imageset
│ ├── Contents.json
│ └── share.png
├── shuffle.imageset
│ ├── Contents.json
│ └── shuffle.png
├── songs_tab.imageset
│ ├── Contents.json
│ └── songs_tab.png
└── songs_tab_un.imageset
│ ├── Contents.json
│ └── songs_tab_un.png
├── Fonts
├── CircularStd-Black.otf
├── CircularStd-Bold.otf
├── CircularStd-Book.otf
└── CircularStd-Medium.otf
├── Launch Screen.storyboard
├── Preview Content
└── Preview Assets.xcassets
│ └── Contents.json
├── UICommon
├── AlbumCell.swift
├── AlbumSongRow.swift
├── AllSongRow.swift
├── ArtistAlbumCell.swift
├── ArtistCell.swift
├── GenreCell.swift
├── IconTextRow.swift
├── MyPlaylistCell.swift
├── PlayerBottomButton.swift
├── PlaylistSongCell.swift
├── ProgressSliderView.swift
├── ScrollTabButton.swift
├── SettingRow.swift
├── TabButton.swift
├── UIExtension.swift
├── UIProgressSlider.swift
└── ViewAllSection.swift
├── View
├── Home
│ └── HomeView.swift
├── MainTab
│ ├── MainTabView.swift
│ └── SideMenuView.swift
├── Player
│ ├── DriverModeView.swift
│ ├── MainPlayerView.swift
│ └── PlayPlaylistView.swift
├── Settings
│ └── SettingsView.swift
└── Songs
│ ├── AlbumDetailsView.swift
│ ├── AlbumsView.swift
│ ├── AllSongsView.swift
│ ├── ArtistDetailsView.swift
│ ├── ArtistsView.swift
│ ├── GenresView.swift
│ ├── PlaylistsView.swift
│ └── SongsView.swift
├── ViewModel
├── AudioPlayerViewModel.swift
└── MainViewModel.swift
└── music_app_swiftuiApp.swift
/README.md:
--------------------------------------------------------------------------------
1 | # Best Music Player App in SwiftUI with MVVM: Complete Native iOS Step by Step
2 |
3 | # codeforany @codeforany
4 |
5 | 🎶 Embark on a journey to build a sleek and feature-rich Music Player App in SwiftUI using the MVVM architecture. In this comprehensive tutorial, we'll guide you through creating a captivating user experience with a Splash screen, a Bottom TabView, Home screen, Side Menu, Songs library, Playlists, Albums, Artist profiles, Genres, Play functionality, and Settings screen.
6 |
7 | 🚀 Key Highlights:
8 |
9 | 1) MVVM Architecture: Learn to structure your app using the Model-View-ViewModel pattern for maintainable and organized code.
10 | 2) Splash Screen: Create an engaging Splash screen to make a strong first impression.
11 | 3) Bottom TabView: Implement a sleek Bottom TabView for easy navigation across different app sections.
12 | 4) Home Screen: Design a dynamic Home screen to display featured content and quick links.
13 | 6) Side Menu: Craft an intuitive Side Menu for seamless access to app sections.
14 | 7) Songs Library: Build a comprehensive Songs library for users to explore and enjoy.
15 | 8) Playlist, Albums, Artist Details: Create interactive screens to view Playlists, Albums, and Artist details.
16 | 9) Genres and Play Songs: Allow users to explore music by Genres and play their favorite tracks.
17 | 10) Settings Screen: Design a user-friendly Settings screen for customization.
18 |
19 | 🎵 Elevate Your SwiftUI Skills:
20 | Whether you're a SwiftUI enthusiast or a beginner, this tutorial offers step-by-step instructions to create an impressive Music Player App. Enhance your SwiftUI skills and master MVVM architecture to build user-centric apps.
21 |
22 | 🔥 Let's Get Started:
23 | If you found this tutorial valuable, give it a thumbs up, share it with fellow developers, and subscribe to our channel for more exciting SwiftUI tutorials. Join our community of learners and become a SwiftUI pro!
24 |
25 | Let the music play! 🎶🎧🎤
26 |
27 | 👍 Don't forget to like the video, subscribe to the channel, and hit the notification bell to stay updated on more exciting SwiftUI tutorials.
28 |
29 | 🙏 Thank you for joining us on this creative journey! We're thrilled to have you with us as we develop an innovative Online Groceries Shop App for native iOS.
30 |
31 |
32 | - [Youtube Full Playlist: Swift UI Native iOS Music Player App Development from Scratch | MVVM Architecture | Step-by-Step Guide](https://www.youtube.com/playlist?list=PLzcRC7PA0xWTRhFuIAY6ZdUP62X0DdttE)
33 | - [Youtube Channel: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg)
34 | - [Youtube Channel Subscribe: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg?sub_confirmation=1)
35 |
36 |
37 | UI UX App Design by: [Akila Weerakoon](https://www.behance.net/gallery/108639283/Meal-Monkey-Food-delivery-iOS-mobile-application)
38 |
39 | #SwiftUI #MusicPlayerApp #MVVMArchitecture #SwiftUITutorial #iOSDevelopment #SplashScreen #BottomTabView #HomeScreen #SideMenu #SongsLibrary #Playlists #Albums #ArtistProfiles #Genres #PlayFunctionality #SettingsScreen #iOSAppDevelopment #SwiftUIApp #MVVMTutorial #iOSMusicApp #SwiftUILikeShareSubscribe #SwiftUIWelcomeMessage #iOSCommunity #MusicPlayerApp #SwiftUI #iOSDevelopment #MVVMArchitecture #SplashScreen #BottomTabView #HomeScreen #SideMenu #SongsList #PlaylistScreen #AlbumsCollection #AlbumDetails #ArtistList #ArtistDetails #GenresList #PlaySongs #SettingsScreen #NativeiOSApp #SwiftUITutorials #MobileAppDevelopment #UserExperience #UIDesign #MusicAppUI
40 |
--------------------------------------------------------------------------------
/music-app-swiftui-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIAppFonts
6 |
7 | CircularStd-Black.otf
8 | CircularStd-Bold.otf
9 | CircularStd-Book.otf
10 | CircularStd-Medium.otf
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/music_app_swiftui.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/music_app_swiftui.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/music_app_swiftui.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "circularslider",
5 | "kind" : "remoteSourceControl",
6 | "location" : "https://github.com/terlan98/CircularSlider",
7 | "state" : {
8 | "revision" : "6112f54dd7fe756a4549865b66c697eab88ff9fd",
9 | "version" : "1.0.3"
10 | }
11 | },
12 | {
13 | "identity" : "rxmusicplayer",
14 | "kind" : "remoteSourceControl",
15 | "location" : "https://github.com/yoheimuta/RxMusicPlayer",
16 | "state" : {
17 | "revision" : "27b3c6a6f6f2c0e65be5df40eeab5e462ed0190f",
18 | "version" : "2.3.3"
19 | }
20 | },
21 | {
22 | "identity" : "rxswift",
23 | "kind" : "remoteSourceControl",
24 | "location" : "https://github.com/ReactiveX/RxSwift",
25 | "state" : {
26 | "revision" : "9dcaa4b333db437b0fbfaf453fad29069044a8b4",
27 | "version" : "6.6.0"
28 | }
29 | },
30 | {
31 | "identity" : "sdwebimage",
32 | "kind" : "remoteSourceControl",
33 | "location" : "https://github.com/SDWebImage/SDWebImage.git",
34 | "state" : {
35 | "revision" : "36e484b317522667a4b2de9b50daaa01dfa30809",
36 | "version" : "5.18.0"
37 | }
38 | },
39 | {
40 | "identity" : "sdwebimageswiftui",
41 | "kind" : "remoteSourceControl",
42 | "location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
43 | "state" : {
44 | "revision" : "e837c37d45449fbd3b4745c10c5b5274e73edead",
45 | "version" : "2.2.3"
46 | }
47 | }
48 | ],
49 | "version" : 2
50 | }
51 |
--------------------------------------------------------------------------------
/music_app_swiftui.xcodeproj/xcuserdata/CodeForAny.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
9 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/music_app_swiftui.xcodeproj/xcuserdata/CodeForAny.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Rx (Playground) 1.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 2
13 |
14 | Rx (Playground) 2.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 3
20 |
21 | Rx (Playground).xcscheme
22 |
23 | isShown
24 |
25 | orderHint
26 | 0
27 |
28 | music_app_swiftui.xcscheme_^#shared#^_
29 |
30 | orderHint
31 | 0
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/add.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "add.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/add.imageset/add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/add.imageset/add.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_1.imageset/alb_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_1.imageset/alb_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_2.imageset/alb_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_2.imageset/alb_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_3.imageset/alb_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_3.imageset/alb_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_4.imageset/alb_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_4.imageset/alb_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_5.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_5.imageset/alb_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_5.imageset/alb_5.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "alb_6.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/alb_6.imageset/alb_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/alb_6.imageset/alb_6.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/app_logo.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "app_logo.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/app_logo.imageset/app_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/app_logo.imageset/app_logo.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_1.imageset/ar_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_1.imageset/ar_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_2.imageset/ar_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_2.imageset/ar_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_3.imageset/ar_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_3.imageset/ar_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_4.imageset/ar_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_4.imageset/ar_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_5.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_5.imageset/ar_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_5.imageset/ar_5.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_6.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_6.imageset/ar_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_6.imageset/ar_6.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_d_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_1.imageset/ar_d_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_1.imageset/ar_d_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_d_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_2.imageset/ar_d_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_2.imageset/ar_d_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_d_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_3.imageset/ar_d_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_3.imageset/ar_d_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "ar_d_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/ar_d_4.imageset/ar_d_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/ar_d_4.imageset/ar_d_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "artitst_detail_top.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "original"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/artitst_detail_top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/artitst_detail_top.imageset/artitst_detail_top.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/b_player_next.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "b_player_next.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/b_player_next.imageset/b_player_next.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/b_player_next.imageset/b_player_next.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/b_player_previous.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "b_player_previous.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/b_player_previous.imageset/b_player_previous.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/b_player_previous.imageset/b_player_previous.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/back.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "back.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/back.imageset/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/back.imageset/back.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/close.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "close.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/close.imageset/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/close.imageset/close.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/eq.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "eq.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/eq.imageset/eq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/eq.imageset/eq.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/eq_display.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "eq_display.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/eq_display.imageset/eq_display.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/eq_display.imageset/eq_display.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/fav.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "fav.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/fav.imageset/fav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/fav.imageset/fav.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/favTemp.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "fav.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | },
21 | "properties" : {
22 | "template-rendering-intent" : "template"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/favTemp.imageset/fav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/favTemp.imageset/fav.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_1.imageset/gen_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_1.imageset/gen_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_2.imageset/gen_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_2.imageset/gen_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_3.imageset/gen_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_3.imageset/gen_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_4.imageset/gen_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_4.imageset/gen_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_5.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_5.imageset/gen_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_5.imageset/gen_5.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_6.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_6.imageset/gen_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_6.imageset/gen_6.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_7.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_7.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_7.imageset/gen_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_7.imageset/gen_7.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_8.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "gen_8.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/gen_8.imageset/gen_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/gen_8.imageset/gen_8.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/home_tab.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "home_tab.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/home_tab.imageset/home_tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/home_tab.imageset/home_tab.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/home_tab_un.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "home_tab_un.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/home_tab_un.imageset/home_tab_un.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/home_tab_un.imageset/home_tab_un.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "img_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_1.imageset/img_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_1.imageset/img_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "img_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_2.imageset/img_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_2.imageset/img_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "img_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_3.imageset/img_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_3.imageset/img_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "img_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_4.imageset/img_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_4.imageset/img_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "img_5.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/img_5.imageset/img_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/img_5.imageset/img_5.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_driver_mode.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/m_driver_mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_driver_mode.imageset/m_driver_mode.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_eq.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_eq.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_eq.imageset/m_eq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_eq.imageset/m_eq.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_hidden_folder.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/m_hidden_folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_hidden_folder.imageset/m_hidden_folder.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_ring_cut.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/m_ring_cut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_ring_cut.imageset/m_ring_cut.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_scan_media.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_scan_media.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_scan_media.imageset/m_scan_media.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_scan_media.imageset/m_scan_media.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_sleep_timer.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/m_sleep_timer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_sleep_timer.imageset/m_sleep_timer.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_theme.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "m_theme.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/m_theme.imageset/m_theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/m_theme.imageset/m_theme.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/menu.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "menu.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/menu.imageset/menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/menu.imageset/menu.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/more.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "more.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/more.imageset/more.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/more.imageset/more.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/more_btn.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "more_btn.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/more_btn.imageset/more_btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/more_btn.imageset/more_btn.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "mp_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_1.imageset/mp_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_1.imageset/mp_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "mp_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_2.imageset/mp_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_2.imageset/mp_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "mp_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_3.imageset/mp_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_3.imageset/mp_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "mp_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/mp_4.imageset/mp_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/mp_4.imageset/mp_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/next_song.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "next_song.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/next_song.imageset/next_song.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/next_song.imageset/next_song.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/pause.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "pause.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/pause.imageset/pause.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/pause.imageset/pause.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "play.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play.imageset/play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play.imageset/play.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_btn.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "play_btn.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_btn.imageset/play_btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_btn.imageset/play_btn.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_eq.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "play_eq.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_eq.imageset/play_eq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_eq.imageset/play_eq.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "play_n.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/play_n.imageset/play_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/play_n.imageset/play_n.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/player_image.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "player_image.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/player_image.imageset/player_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/player_image.imageset/player_image.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "playlist.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist.imageset/playlist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist.imageset/playlist.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "playlist_1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_1.imageset/playlist_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_1.imageset/playlist_1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "playlist_2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_2.imageset/playlist_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_2.imageset/playlist_2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "playlist_3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_3.imageset/playlist_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_3.imageset/playlist_3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "playlist_4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/playlist_4.imageset/playlist_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/playlist_4.imageset/playlist_4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/previous_song.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "previous_song.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/previous_song.imageset/previous_song.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/previous_song.imageset/previous_song.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/repeat.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "repeat.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/repeat.imageset/repeat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/repeat.imageset/repeat.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s1.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s1.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s1.imageset/s1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s1.imageset/s1.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s10.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s10.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s10.imageset/s10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s10.imageset/s10.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s2.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s2.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s2.imageset/s2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s2.imageset/s2.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s3.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s3.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s3.imageset/s3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s3.imageset/s3.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s4.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s4.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s4.imageset/s4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s4.imageset/s4.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s5.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s5.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s5.imageset/s5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s5.imageset/s5.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s6.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s6.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s6.imageset/s6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s6.imageset/s6.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s7.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s7.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s7.imageset/s7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s7.imageset/s7.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s8.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s8.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s8.imageset/s8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s8.imageset/s8.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s9.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s9.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s9.imageset/s9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s9.imageset/s9.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_audio.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_audio.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_audio.imageset/s_audio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_audio.imageset/s_audio.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_display.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_display.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_display.imageset/s_display.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_display.imageset/s_display.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_headset.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_headset.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_headset.imageset/s_headset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_headset.imageset/s_headset.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_lock_screen.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/s_lock_screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_lock_screen.imageset/s_lock_screen.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_menu.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_menu.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_menu.imageset/s_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_menu.imageset/s_menu.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_other.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "s_other.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/s_other.imageset/s_other.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/s_other.imageset/s_other.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/search.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "search.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "template-rendering-intent" : "template"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/search.imageset/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/search.imageset/search.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/setting_tab.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "setting_tab.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/setting_tab.imageset/setting_tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/setting_tab.imageset/setting_tab.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "setting_tab_un.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/setting_tab_un.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/setting_tab_un.imageset/setting_tab_un.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/share.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "share.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/share.imageset/share.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/share.imageset/share.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/shuffle.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "shuffle.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/shuffle.imageset/shuffle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/shuffle.imageset/shuffle.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/songs_tab.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "songs_tab.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/songs_tab.imageset/songs_tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/songs_tab.imageset/songs_tab.png
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "songs_tab_un.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/songs_tab_un.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Assets.xcassets/songs_tab_un.imageset/songs_tab_un.png
--------------------------------------------------------------------------------
/music_app_swiftui/Fonts/CircularStd-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Black.otf
--------------------------------------------------------------------------------
/music_app_swiftui/Fonts/CircularStd-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Bold.otf
--------------------------------------------------------------------------------
/music_app_swiftui/Fonts/CircularStd-Book.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Book.otf
--------------------------------------------------------------------------------
/music_app_swiftui/Fonts/CircularStd-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codeforany/music_app_swiftui/2c33724b2a2914225fd261e6eaa9386676b6c74c/music_app_swiftui/Fonts/CircularStd-Medium.otf
--------------------------------------------------------------------------------
/music_app_swiftui/Launch Screen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/music_app_swiftui/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/AlbumCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlbumCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 25/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct AlbumCell: View {
11 | var sObj: NSDictionary = [
12 | "image": "alb_1",
13 | "name": "History",
14 | "artists": "Michael Jackson",
15 | "songs": "10 Songs"
16 | ]
17 |
18 | var body: some View {
19 | VStack {
20 | Image(sObj.value(forKey: "image") as? String ?? "")
21 | .resizable()
22 | .scaledToFill()
23 | .aspectRatio( CGSize(width: 1, height: 1) , contentMode: .fit)
24 | .frame(width: .infinity, height: .infinity)
25 |
26 |
27 | VStack(spacing: 4){
28 |
29 | HStack{
30 | Text(sObj.value(forKey: "name") as? String ?? "")
31 | .font(.customfont(.medium, fontSize: 14))
32 | .foregroundColor(.primaryText)
33 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
34 |
35 | Menu {
36 | Button {
37 |
38 | } label: {
39 | Text("Play")
40 | .foregroundColor(.primaryText)
41 | }
42 |
43 | Button {
44 |
45 | } label: {
46 | Text("Play next")
47 | .foregroundColor(.primaryText)
48 | }
49 |
50 | Button {
51 |
52 | } label: {
53 | Text("Add to playlist queue")
54 | .foregroundColor(.primaryText)
55 | }
56 |
57 |
58 | Button {
59 |
60 | } label: {
61 | Text("Add to playlist")
62 | .foregroundColor(.primaryText)
63 | }
64 |
65 |
66 | Button {
67 |
68 | } label: {
69 | Text("Rename")
70 | .foregroundColor(.primaryText)
71 | }
72 |
73 |
74 | Button {
75 |
76 | } label: {
77 | Text("Tag Editor")
78 | .foregroundColor(.primaryText)
79 | }
80 |
81 |
82 | Button {
83 |
84 | } label: {
85 | Text("Go to artist")
86 | .foregroundColor(.primaryText)
87 | }
88 |
89 | Button {
90 |
91 | } label: {
92 | Text("Delete form device")
93 | .foregroundColor(.primaryText)
94 | }
95 |
96 | Button {
97 |
98 | } label: {
99 | Text("Share")
100 | .foregroundColor(.primaryText)
101 | }
102 |
103 |
104 | } label: {
105 | Image("more_btn")
106 | .resizable()
107 | .scaledToFit()
108 | .frame(width: 12, height: 12)
109 | }
110 | .environment(\.colorScheme, .dark)
111 |
112 | }
113 |
114 | HStack{
115 | Text(sObj.value(forKey: "artists") as? String ?? "")
116 | .font(.customfont(.regular, fontSize: 11))
117 | .foregroundColor(Color.primaryText28)
118 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
119 |
120 | Text("•")
121 | .font(.customfont(.regular, fontSize: 11))
122 | .foregroundColor(Color.primaryText28)
123 |
124 | Text(sObj.value(forKey: "songs") as? String ?? "")
125 | .font(.customfont(.regular, fontSize: 11))
126 | .foregroundColor(Color.primaryText28)
127 | }
128 | }
129 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
130 |
131 |
132 | }
133 | }
134 | }
135 |
136 | struct AlbumCell_Previews: PreviewProvider {
137 | static var previews: some View {
138 | AlbumCell()
139 |
140 | .background(Color.bg)
141 | .frame(width: 200)
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/AlbumSongRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlbumSongRow.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 27/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct AlbumSongRow: View {
11 |
12 | @State var sObj: NSDictionary = [:]
13 | var isPlay: Bool = false
14 |
15 | var body: some View {
16 | VStack {
17 |
18 | HStack(spacing: 15) {
19 |
20 | Button {
21 |
22 | } label: {
23 | Image( "play_btn")
24 | .resizable()
25 | .scaledToFit()
26 | .frame(width: 25, height: 25)
27 | }
28 |
29 | Text(sObj.value(forKey: "name") as? String ?? "")
30 | .font(.customfont(.medium, fontSize: 14))
31 | .foregroundColor(.primaryText60)
32 | .frame(maxWidth: .infinity, alignment: .leading)
33 |
34 | Text(sObj.value(forKey: "duration") as? String ?? "")
35 | .font(.customfont(.medium, fontSize: 14))
36 | .foregroundColor(.primaryText60)
37 |
38 |
39 | if(isPlay) {
40 | Image("play_eq")
41 | .resizable()
42 | .scaledToFit()
43 | .frame(width: 80, height: 40, alignment: .center)
44 | }else{
45 | Button {
46 |
47 | } label: {
48 | Image( "more")
49 | .resizable()
50 | .scaledToFit()
51 | .frame(width: 25, height: 25)
52 | }
53 | .frame(width: 80, height: 40, alignment: .trailing)
54 | }
55 |
56 |
57 | }
58 |
59 | Divider()
60 | .padding(.leading, 50)
61 |
62 | }
63 | .frame(height: 44)
64 | }
65 | }
66 |
67 | struct AlbumSongRow_Previews: PreviewProvider {
68 | static var previews: some View {
69 | AlbumSongRow(sObj: ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"])
70 | .padding(.horizontal, 20)
71 | .background(Color.bg)
72 |
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/AllSongRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AllSongRow.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 24/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct AllSongRow: View {
11 |
12 | var sObj: NSDictionary = [
13 | "name":"Title",
14 | "artist":"Artist Name",
15 | "image":"s1"
16 | ]
17 | var didTap: (()->())?
18 | var didTapPlay: (()->())?
19 |
20 |
21 | var body: some View {
22 | VStack {
23 |
24 | HStack(spacing: 15) {
25 | ZStack(alignment: .center) {
26 | Image( sObj.value(forKey: "image") as? String ?? "")
27 | .resizable()
28 | .scaledToFill()
29 | .overlay(
30 | RoundedRectangle(cornerRadius: 25)
31 | .stroke(Color.primaryText28, lineWidth: 1)
32 | )
33 | .frame(width: 50, height: 50)
34 | .cornerRadius(25)
35 |
36 | Rectangle()
37 | .fill(Color.bg)
38 | .frame(width: 15, height: 15)
39 | .cornerRadius(7.5)
40 |
41 | }
42 |
43 | VStack {
44 | Text(sObj.value(forKey: "name") as? String ?? "")
45 | .font(.customfont(.medium, fontSize: 14))
46 | .foregroundColor(.primaryText.opacity(0.9))
47 | .frame(maxWidth: .infinity, alignment: .leading)
48 |
49 | Text(sObj.value(forKey: "artist") as? String ?? "")
50 | .font(.customfont(.regular, fontSize: 10))
51 | .foregroundColor(.primaryText28)
52 | .frame(maxWidth: .infinity, alignment: .leading)
53 | }
54 |
55 |
56 | Button {
57 | didTapPlay?()
58 | } label: {
59 | Image( "play_btn")
60 | .resizable()
61 | .scaledToFit()
62 | .frame(width: 25, height: 25)
63 | }
64 |
65 | }
66 |
67 | Divider()
68 | .padding(.leading, 50)
69 |
70 | }
71 | }
72 | }
73 |
74 | struct AllSongRow_Previews: PreviewProvider {
75 | static var previews: some View {
76 | AllSongRow()
77 | .padding(20)
78 | .background( Color.bg)
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/ArtistAlbumCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ArtistAlbumCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 27/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ArtistAlbumCell: View {
11 | @State var sObj: NSDictionary = [:]
12 |
13 | var body: some View {
14 | VStack {
15 | Image(sObj.value(forKey: "image") as? String ?? "")
16 | .resizable()
17 | .scaledToFill()
18 | .frame(width: 90, height: 80)
19 | .padding(.bottom, 4)
20 | .clipped()
21 |
22 | Text(sObj.value(forKey: "name") as? String ?? "")
23 | .font(.customfont(.bold, fontSize: 13))
24 | .foregroundColor(.primaryText60)
25 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
26 | Text(sObj.value(forKey: "year") as? String ?? "")
27 | .font(.customfont(.bold, fontSize: 10))
28 | .foregroundColor(Color.secondaryText)
29 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
30 | }
31 | .frame(width: 90)
32 | }
33 | }
34 |
35 | struct ArtistAlbumCell_Previews: PreviewProvider {
36 | static var previews: some View {
37 | ArtistAlbumCell(sObj: [
38 | "image":"ar_d_1",
39 | "name":"Fire Dragon",
40 | "year":"2019",
41 | ])
42 | .padding(80)
43 | .background(Color.bg)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/ArtistCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ArtistCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 25/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ArtistCell: View {
11 |
12 | var aObj: NSDictionary = [
13 | "image": "ar_1",
14 | "name": "Beyonce",
15 | "albums": "4 albums",
16 | "songs": "38 Songs"
17 | ]
18 |
19 | var body: some View {
20 | HStack(alignment: .top, spacing: 15) {
21 | Image(aObj.value(forKey: "image") as? String ?? "")
22 | .resizable()
23 | .scaledToFill()
24 | .overlay( RoundedRectangle(cornerRadius: 1)
25 | .stroke( Color.primaryText28, lineWidth: 1 ))
26 | .frame(width: 80, height: 80)
27 |
28 |
29 | VStack{
30 |
31 | Text(aObj.value(forKey: "name") as? String ?? "")
32 | .font(.customfont(.bold, fontSize: 15))
33 | .foregroundColor(.primaryText)
34 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
35 |
36 | Text("\(aObj.value(forKey: "albums") as? String ?? "" ) • \(aObj.value(forKey: "songs") as? String ?? "")")
37 | .font(.customfont(.regular, fontSize: 11))
38 | .foregroundColor(Color.primaryText80)
39 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
40 |
41 | }
42 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
43 |
44 |
45 | Menu {
46 | Button {
47 |
48 | } label: {
49 | Text("Play")
50 | .foregroundColor(.primaryText)
51 | }
52 |
53 | Button {
54 |
55 | } label: {
56 | Text("Play next")
57 | .foregroundColor(.primaryText)
58 | }
59 |
60 | Button {
61 |
62 | } label: {
63 | Text("Add to playlist queue")
64 | .foregroundColor(.primaryText)
65 | }
66 |
67 |
68 | Button {
69 |
70 | } label: {
71 | Text("Add to playlist")
72 | .foregroundColor(.primaryText)
73 | }
74 |
75 |
76 | Button {
77 |
78 | } label: {
79 | Text("Rename")
80 | .foregroundColor(.primaryText)
81 | }
82 |
83 |
84 | Button {
85 |
86 | } label: {
87 | Text("Tag Editor")
88 | .foregroundColor(.primaryText)
89 | }
90 |
91 |
92 | Button {
93 |
94 | } label: {
95 | Text("Go to artist")
96 | .foregroundColor(.primaryText)
97 | }
98 |
99 | Button {
100 |
101 | } label: {
102 | Text("Delete form device")
103 | .foregroundColor(.primaryText)
104 | }
105 |
106 | Button {
107 |
108 | } label: {
109 | Text("Share")
110 | .foregroundColor(.primaryText)
111 | }
112 |
113 |
114 | } label: {
115 | Image("more_btn")
116 | .resizable()
117 | .scaledToFit()
118 | .frame(width: 20, height: 20)
119 | }
120 | .environment(\.colorScheme, .dark)
121 |
122 | }
123 | }
124 | }
125 |
126 | struct ArtistCell_Previews: PreviewProvider {
127 | static var previews: some View {
128 | ArtistCell()
129 | .padding(20)
130 | .background(Color.bg)
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/GenreCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GenreCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 25/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct GenreCell: View {
11 | var pObj: NSDictionary = [:]
12 | var body: some View {
13 | ZStack(alignment: .center) {
14 | Image(pObj.value(forKey: "image") as? String ?? "" )
15 | .resizable()
16 | .scaledToFill()
17 |
18 | Rectangle()
19 | .fill( Color.black.opacity(0.87) )
20 |
21 | VStack{
22 | Text(pObj.value(forKey: "name") as? String ?? "" )
23 | .font(.customfont(.bold, fontSize: 15))
24 | .foregroundColor(.primaryText)
25 |
26 | Text(pObj.value(forKey: "songs") as? String ?? "" )
27 | .font(.customfont(.regular, fontSize: 10))
28 | .foregroundColor(.primaryText80)
29 | }
30 | .padding(8)
31 |
32 | }
33 | .frame(width: ( .screenWidth - 55 ) / 2, height: ( .screenWidth - 55 ) / 2 * 0.75 )
34 | }
35 | }
36 |
37 | struct GenreCell_Previews: PreviewProvider {
38 | static var previews: some View {
39 | GenreCell(pObj: [
40 | "image": "gen_1",
41 | "name": "Classical",
42 | "songs": "56 Songs"
43 | ])
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/IconTextRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IconTextRow.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 22/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct IconTextRow: View {
11 | var title: String = "Title"
12 | var icon: String = "m_theme"
13 | var body: some View {
14 | VStack{
15 | HStack {
16 | Image(icon)
17 | .resizable()
18 | .scaledToFit()
19 | .frame(width: 25 , height: 25)
20 |
21 | Text(title)
22 | .font(.customfont(.medium, fontSize: 14))
23 | .foregroundColor( Color.primaryText.opacity(0.9) )
24 | .frame(minWidth: 0, maxWidth: .infinity, alignment
25 | : .leading)
26 | }
27 | .frame(height: 40)
28 |
29 | Divider()
30 | .padding(.leading, 40)
31 | }
32 | }
33 | }
34 |
35 | struct IconTextRow_Previews: PreviewProvider {
36 | static var previews: some View {
37 | IconTextRow()
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/MyPlaylistCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MyPlaylistCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 25/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct MyPlaylistCell: View {
11 |
12 | var sObj: NSDictionary = [
13 | "image": "mp_1",
14 | "name": "Queens Collection"
15 | ]
16 |
17 | var body: some View {
18 | VStack {
19 | Image(sObj.value(forKey: "image") as? String ?? "")
20 | .resizable()
21 | .scaledToFill()
22 | .frame(width: 90, height: 80)
23 | .overlay( RoundedRectangle(cornerRadius: 5)
24 | .stroke(Color.primaryText28, lineWidth: 1)
25 | )
26 | .padding(.bottom, 4)
27 |
28 | Text(sObj.value(forKey: "name") as? String ?? "")
29 | .font(.customfont(.medium, fontSize: 12))
30 | .lineLimit(1)
31 | .foregroundColor(.primaryText60)
32 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
33 |
34 | }
35 | .frame(width: 90)
36 | }
37 | }
38 |
39 | struct MyPlaylistCell_Previews: PreviewProvider {
40 | static var previews: some View {
41 | MyPlaylistCell()
42 | .padding(30)
43 | .background(Color.bg)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/PlayerBottomButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlayerBottomButton.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 28/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct PlayerBottomButton: View {
11 | var title: String = "Playlist"
12 | var icon: String = "playlist"
13 | var body: some View {
14 | VStack {
15 | Image(icon)
16 | .resizable()
17 | .scaledToFit()
18 | .frame(width: 30, height: 30)
19 | .foregroundColor(.primaryText)
20 |
21 | Text(title)
22 | .font(.customfont(.regular, fontSize: 10))
23 | .foregroundColor(.secondaryText)
24 |
25 | }
26 | }
27 | }
28 |
29 | struct PlayerBottomButton_Previews: PreviewProvider {
30 | static var previews: some View {
31 | PlayerBottomButton()
32 | .padding(20)
33 | .background(Color.bg)
34 |
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/PlaylistSongCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlaylistSongCell.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 25/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct PlaylistSongCell: View {
11 |
12 | var sObj: NSDictionary = ["image":"playlist_1", "name":"My Top Tracks","songs":"100 Songs"]
13 |
14 | var body: some View {
15 | ZStack(alignment: .bottomLeading) {
16 | Image(sObj.value(forKey: "image") as? String ?? "")
17 | .resizable()
18 | .scaledToFill()
19 | .frame(width: .infinity, height: .infinity)
20 |
21 | Rectangle()
22 | .fill( Color.black.opacity(0.45) )
23 |
24 | HStack{
25 | VStack{
26 | Text(sObj.value(forKey: "name") as? String ?? "")
27 | .font(.customfont(.medium, fontSize: 14))
28 | .foregroundColor(.primaryText)
29 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
30 |
31 | Text(sObj.value(forKey: "songs") as? String ?? "")
32 | .font(.customfont(.regular, fontSize: 10))
33 | .foregroundColor(Color.primaryText28)
34 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
35 | }
36 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
37 |
38 | Button {
39 |
40 | } label: {
41 | Image("play")
42 | .resizable()
43 | .scaledToFit()
44 | .frame(width: 22, height: 22)
45 | }
46 |
47 |
48 | }
49 | .padding(15)
50 |
51 |
52 | }
53 | .aspectRatio(CGSize(width: 200, height: 140), contentMode: .fit)
54 | }
55 |
56 | }
57 |
58 | struct PlaylistSongCell_Previews: PreviewProvider {
59 | static var previews: some View {
60 | PlaylistSongCell()
61 | .frame(width: 200)
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/ProgressSliderView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ProgressSliderView.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 03/09/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ProgressSliderView: UIViewRepresentable {
11 | @Binding var value: Double
12 | @Binding var maximumValue: Double
13 | @Binding var isUserInteractionEnabled: Bool
14 | @Binding var playableProgress: Double
15 | var updateValueHandler: (Double) -> Void
16 |
17 | @State private var touching = false
18 |
19 | init(value: Binding,
20 | maximumValue: Binding,
21 | isUserInteractionEnabled: Binding,
22 | playableProgress: Binding,
23 | updateValueHandler: @escaping (Double) -> Void) {
24 | self._value = value
25 | self._maximumValue = maximumValue
26 | self._isUserInteractionEnabled = isUserInteractionEnabled
27 | self._playableProgress = playableProgress
28 | self.updateValueHandler = updateValueHandler
29 | }
30 |
31 | func makeCoordinator() -> Coordinator {
32 | Coordinator(self)
33 | }
34 |
35 | func makeUIView(context: Context) -> UIProgressSlider {
36 | let slider = UIProgressSlider()
37 | slider.addTarget(
38 | context.coordinator,
39 | action: #selector(Coordinator.updateValue(sender:)),
40 | for: .valueChanged)
41 |
42 | slider.addTarget(
43 | context.coordinator,
44 | action: #selector(Coordinator.startTouch(sender:)),
45 | for: .touchDown)
46 |
47 | slider.addTarget(
48 | context.coordinator,
49 | action: #selector(Coordinator.endTouch(sender:)),
50 | for: .touchUpInside)
51 |
52 | return slider
53 | }
54 |
55 | func updateUIView(_ uiView: UIProgressSlider, context: Context) {
56 | if !touching {
57 | uiView.value = Float(value)
58 | }
59 | uiView.maximumValue = Float(maximumValue)
60 | uiView.isUserInteractionEnabled = isUserInteractionEnabled
61 | uiView.playableProgress = Float(playableProgress)
62 | uiView.setNeedsDisplay()
63 | }
64 |
65 | class Coordinator: NSObject {
66 | var view: ProgressSliderView
67 |
68 | init(_ view: ProgressSliderView) {
69 | self.view = view
70 | }
71 |
72 | @objc
73 | func updateValue(sender: UIProgressSlider) {
74 | view.updateValueHandler(Double(sender.value))
75 | }
76 |
77 | @objc
78 | func startTouch(sender: UIProgressSlider) {
79 | view.touching = true
80 | }
81 |
82 | @objc
83 | func endTouch(sender: UIProgressSlider) {
84 | view.touching = false
85 | }
86 | }
87 | }
88 |
89 | struct ProgressSliderView_Previews: PreviewProvider {
90 | @State static var value = Double(50.0)
91 | @State static var maximumValue = Double(50.0)
92 | @State static var isUserInteractionEnabled = true
93 | @State static var playableProgress = Double(70.0)
94 |
95 | static var previews: some View {
96 | ProgressSliderView(value: $value,
97 | maximumValue: $maximumValue,
98 | isUserInteractionEnabled: $isUserInteractionEnabled,
99 | playableProgress: $playableProgress) {
100 | print("value changed: \($0)")
101 | }
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/ScrollTabButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScrollTabButton.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 24/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ScrollTabButton: View {
11 |
12 | var title: String = "Title"
13 | var width: Double = 70
14 | var isSelect: Bool = true
15 | var didTap: (()->())?
16 |
17 | var body: some View {
18 | Button {
19 | didTap?()
20 | } label: {
21 | Text(title)
22 | .font(.customfont(.medium, fontSize: 15))
23 | .foregroundColor(isSelect ? .focus : .primaryText28 )
24 |
25 | }
26 | .frame(width: width)
27 |
28 | }
29 | }
30 |
31 | struct ScrollTabButton_Previews: PreviewProvider {
32 | static var previews: some View {
33 | ScrollTabButton()
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/SettingRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingRow.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 29/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct SettingRow: View {
11 |
12 | var title: String = "Title"
13 | var icon: String = "s_display"
14 |
15 |
16 | var body: some View {
17 | VStack{
18 |
19 | HStack(spacing: 15) {
20 | Image(icon)
21 | .resizable()
22 | .scaledToFit()
23 | .frame(width: 25, height: 25)
24 |
25 | Text(title)
26 | .font(.customfont(.medium, fontSize: 14))
27 | .foregroundColor( .primaryText.opacity(0.9) )
28 | .frame(maxWidth: .infinity, alignment: .leading )
29 | }
30 |
31 | Divider()
32 | .padding(.leading, 40)
33 | }
34 | .frame(height: 44)
35 | }
36 | }
37 |
38 | struct SettingRow_Previews: PreviewProvider {
39 | static var previews: some View {
40 | SettingRow()
41 | .padding(20)
42 | .background( Color.bg )
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/TabButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TabButton.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 21/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct TabButton: View {
11 | @State var title: String = "Home"
12 | @State var icon: String = "home_tab"
13 | @State var iconUnfocus: String = "home_tab_un"
14 | var isSelect: Bool = false
15 | var didTap: (()->())?
16 |
17 | var body: some View {
18 | Button {
19 | didTap?()
20 | } label: {
21 | VStack {
22 | Image( isSelect ? icon : iconUnfocus)
23 | .resizable()
24 | .scaledToFit()
25 | .frame(width: 20, height: 20)
26 |
27 | Text(title)
28 | .font(.customfont(.regular, fontSize: 12))
29 | .foregroundColor(isSelect ? .focus : .unfocused )
30 | }
31 |
32 | }
33 | }
34 | }
35 |
36 | struct TabButton_Previews: PreviewProvider {
37 | static var previews: some View {
38 | TabButton()
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/UIExtension.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIExtension.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 21/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | enum CircularStd: String {
11 | case regular = "CircularStd-Book"
12 | case medium = "CircularStd-Medium"
13 | case bold = "CircularStd-Bold"
14 | case black = "CircularStd-Black"
15 | }
16 |
17 | extension Font {
18 | static func customfont(_ font: CircularStd, fontSize: CGFloat) -> Font {
19 | custom(font.rawValue, size: fontSize)
20 | }
21 | }
22 |
23 | extension CGFloat {
24 | static var screenWidth: Double {
25 | return UIScreen.main.bounds.size.width
26 | }
27 | static var screenHeight: Double {
28 | return UIScreen.main.bounds.size.height
29 | }
30 |
31 | static func widthPer(per: Double) -> Double {
32 | return screenWidth * per;
33 | //375 * 0.5
34 | }
35 |
36 | static func heightPer(per: Double) -> Double {
37 | return screenHeight * per;
38 | //375 * 0.5
39 | }
40 |
41 | static var topInsets: Double {
42 | if let keyWindow = UIApplication.shared.keyWindow {
43 | return keyWindow.safeAreaInsets.top
44 | }
45 | return 0.0
46 | }
47 |
48 | static var bottomInsets: Double {
49 | if let keyWindow = UIApplication.shared.keyWindow {
50 | return keyWindow.safeAreaInsets.bottom
51 | }
52 | return 0.0
53 | }
54 |
55 | static var horizontalInsets: Double {
56 | if let keyWindow = UIApplication.shared.keyWindow {
57 | return keyWindow.safeAreaInsets.left + keyWindow.safeAreaInsets.right
58 | }
59 | return 0.0
60 | }
61 |
62 | static var verticalInsets: Double {
63 | if let keyWindow = UIApplication.shared.keyWindow {
64 | return keyWindow.safeAreaInsets.top + keyWindow.safeAreaInsets.bottom
65 | }
66 | return 0.0
67 | }
68 | }
69 |
70 |
71 | extension Color {
72 |
73 | static var primaryApp: Color {
74 | return Color(hex: "C35BD1")
75 | }
76 |
77 | static var focus: Color {
78 | return Color(hex: "D9519D")
79 | }
80 |
81 | static var unfocused: Color {
82 | return Color(hex: "63666E")
83 | }
84 |
85 | static var focusStart: Color {
86 | return Color(hex: "ED8770")
87 | }
88 | static var secondaryStart: Color {
89 | return primaryApp
90 | }
91 | static var secondaryEnd: Color {
92 | return Color(hex: "657DDF")
93 | }
94 | static var org: Color {
95 | return Color(hex: "E1914B")
96 | }
97 |
98 | static var primaryText: Color {
99 | return Color.white
100 | }
101 |
102 | static var primaryText80: Color {
103 | return Color.white.opacity(0.8)
104 | }
105 | static var primaryText60: Color {
106 | return Color.white.opacity(0.6)
107 | }
108 | static var primaryText35: Color {
109 | return Color.white.opacity(0.35)
110 | }
111 | static var primaryText28: Color {
112 | return Color.white.opacity(0.28)
113 | }
114 |
115 | static var primaryText10: Color {
116 | return Color.white.opacity(0.1)
117 | }
118 |
119 | static var secondaryText: Color {
120 | return Color(hex: "585A66")
121 | }
122 |
123 | static var primaryG: [Color] {
124 | return [focusStart, focus]
125 | }
126 |
127 | static var secondaryG: [Color] {
128 | return [secondaryStart, secondaryEnd]
129 | }
130 | static var bg: Color {
131 | return Color(hex: "181B2C")
132 | }
133 |
134 | static var darkGray: Color {
135 | return Color(hex: "383B49")
136 | }
137 | static var lightGray: Color {
138 | return Color(hex: "D0D1D4")
139 | }
140 |
141 | init(hex: String) {
142 | let hex = hex.trimmingCharacters(in: .alphanumerics.inverted)
143 | var int: UInt64 = 0
144 | Scanner(string: hex).scanHexInt64(&int)
145 | let a, r, g, b: UInt64
146 | switch hex.count {
147 | case 3: // RGB(12 -bit)
148 | (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
149 | case 6: // RGB (24-bit)
150 | (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
151 | case 8: // ARGB (32-bit)
152 | (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
153 | default:
154 | (a, r, g, b) = (1, 1, 1, 0)
155 | }
156 |
157 | self.init(
158 | .sRGB,
159 | red: Double(r) / 255,
160 | green: Double(g) / 255,
161 | blue: Double(b) / 255,
162 | opacity: Double(a) / 255
163 | )
164 | }
165 | }
166 |
167 | extension View {
168 | func cornerRadius(_ radius: CGFloat, corner: UIRectCorner) -> some View {
169 | clipShape(RoundedCorner(radius: radius, corner: corner))
170 | }
171 |
172 | }
173 |
174 | extension Color {
175 |
176 | func uiColor() -> UIColor {
177 |
178 | if #available(iOS 14.0, *) {
179 | return UIColor(self)
180 | }
181 |
182 | let components = self.components()
183 | return UIColor(red: components.r, green: components.g, blue: components.b, alpha: components.a)
184 | }
185 |
186 | private func components() -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {
187 |
188 | let scanner = Scanner(string: self.description.trimmingCharacters(in: CharacterSet.alphanumerics.inverted))
189 | var hexNumber: UInt64 = 0
190 | var r: CGFloat = 0.0, g: CGFloat = 0.0, b: CGFloat = 0.0, a: CGFloat = 0.0
191 |
192 | let result = scanner.scanHexInt64(&hexNumber)
193 | if result {
194 | r = CGFloat((hexNumber & 0xff000000) >> 24) / 255
195 | g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255
196 | b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255
197 | a = CGFloat(hexNumber & 0x000000ff) / 255
198 | }
199 | return (r, g, b, a)
200 | }
201 | }
202 |
203 | struct RoundedCorner: Shape {
204 | var radius: CGFloat = .infinity
205 | var corner: UIRectCorner = .allCorners
206 |
207 | func path(in rect: CGRect) -> Path {
208 | let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corner, cornerRadii: CGSize(width: radius, height: radius))
209 | return Path(path.cgPath)
210 | }
211 | }
212 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/UIProgressSlider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIProgressSlider.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 03/09/23.
6 | //
7 | import UIKit
8 | import SwiftUI
9 |
10 | class UIProgressSlider: UISlider {
11 | var playableProgress: Float = 0
12 |
13 | override init(frame: CGRect) {
14 | super.init(frame: frame)
15 | }
16 |
17 | required init?(coder aDecoder: NSCoder) {
18 | super.init(coder: aDecoder)
19 | }
20 |
21 | override func draw(_ rect: CGRect) {
22 | super.draw(rect)
23 | maximumTrackTintColor = .clear
24 |
25 | self.tintColor = Color.focus.uiColor()
26 |
27 | let c = UIGraphicsGetCurrentContext()
28 | let r = trackRect(forBounds: bounds)
29 | let path = UIBezierPath(roundedRect: r, cornerRadius: r.size.height / 2.0)
30 | c?.addPath(path.cgPath)
31 | c?.setLineWidth(0.1)
32 |
33 | UIColor.black.setStroke()
34 | c?.strokePath()
35 |
36 | c?.addPath(path.cgPath)
37 | c?.clip()
38 |
39 | UIColor.lightGray.setFill()
40 | c?.fill(CGRect(x: r.origin.x,
41 | y: r.origin.y,
42 | width: r.size.width,
43 | height: r.size.height))
44 |
45 | UIColor.white.setFill()
46 | c?.fill(CGRect(x: r.origin.x,
47 | y: r.origin.y,
48 | width: r.size.width * CGFloat(playableProgress),
49 | height: r.size.height))
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/music_app_swiftui/UICommon/ViewAllSection.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewAllSection.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 22/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct ViewAllSection: View {
11 |
12 | @State var title: String = "Title"
13 | @State var button: String = "View All"
14 | var didTap: (()->())?
15 |
16 | var body: some View {
17 | HStack{
18 | Text(title)
19 | .font(.customfont(.medium, fontSize: 15))
20 | .foregroundColor(.primaryText80)
21 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
22 |
23 |
24 | Button {
25 | didTap?()
26 | } label: {
27 | Text(button)
28 | .font(.customfont(.regular, fontSize: 11))
29 | .foregroundColor(Color.org)
30 | }
31 |
32 |
33 |
34 | }
35 | }
36 | }
37 |
38 | struct ViewAllSection_Previews: PreviewProvider {
39 | static var previews: some View {
40 | ViewAllSection()
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/music_app_swiftui/View/Home/HomeView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HomeView.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 22/08/23.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct HomeView: View {
11 |
12 | @StateObject var mainVM = MainViewModel.share
13 |
14 | @State var txtSearch: String = ""
15 | @State var hostRecommendedArr = [
16 | [
17 | "image": "img_1",
18 | "name": "Sound of Sky",
19 | "artists": "Dilon Bruce"
20 | ],
21 | [
22 | "image": "img_2",
23 | "name": "Girl on Fire",
24 | "artists": "Alecia Keys"
25 | ]
26 | ]
27 |
28 | @State var playlistArr = [
29 | [
30 | "image": "img_3",
31 | "name": "Classic Playlist",
32 | "artists": "Piano Guys"
33 | ],
34 | [
35 | "image": "img_4",
36 | "name": "Summer Playlist",
37 | "artists": "Dilon Bruce"
38 | ],
39 | [
40 | "image": "img_5",
41 | "name": "Pop Music",
42 | "artists": "Michael Jackson"
43 | ]
44 | ]
45 |
46 | var recentlyPlayedArr: NSArray = [
47 | [
48 | "rate": 4,
49 | "name": "Billie Jean",
50 | "artists": "Michael Jackson"
51 | ],
52 | [
53 | "rate": 4,
54 | "name": "Earth Song",
55 | "artists": "Michael Jackson"
56 | ],
57 | [
58 | "rate": 4,
59 | "name": "Mirror",
60 | "artists": "Justin Timberlake"
61 | ],
62 | [
63 | "rate": 4,
64 | "name": "Remember the Time",
65 | "artists": "Michael Jackson"
66 | ]
67 | ]
68 |
69 | var body: some View {
70 | ZStack{
71 |
72 | ScrollView {
73 | VStack {
74 | Text("Hot Recommended")
75 | .font(.customfont(.medium, fontSize: 15))
76 | .foregroundColor(.primaryText80)
77 | .padding(.top, .topInsets + 56)
78 | .padding(.horizontal, 20)
79 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
80 |
81 | ScrollView(.horizontal, showsIndicators: false) {
82 | LazyHStack(spacing: 15) {
83 | ForEach( hostRecommendedArr.indices, id: \.self) { index in
84 |
85 | var sObj = hostRecommendedArr[index]
86 |
87 | VStack {
88 | Image(sObj["image"] ?? "")
89 | .resizable()
90 | .scaledToFill()
91 | .frame(width: 230, height: 125)
92 | .padding(.bottom, 4)
93 |
94 | Text(sObj["name"] ?? "")
95 | .font(.customfont(.bold, fontSize: 13))
96 | .foregroundColor(.primaryText60)
97 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
98 | Text(sObj["artists"] ?? "")
99 | .font(.customfont(.bold, fontSize: 10))
100 | .foregroundColor(Color.secondaryText)
101 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
102 | }
103 |
104 | }
105 |
106 | }
107 | .padding(.horizontal, 20)
108 | }
109 |
110 |
111 | }
112 |
113 | ViewAllSection(title: "Playlists") {
114 |
115 | }
116 | .padding(.horizontal, 20)
117 | .padding(.vertical, 8)
118 |
119 | ScrollView(.horizontal, showsIndicators: false) {
120 | LazyHStack(spacing: 15) {
121 | ForEach( playlistArr.indices, id: \.self) { index in
122 |
123 | var sObj = playlistArr[index]
124 |
125 | VStack {
126 | Image(sObj["image"] ?? "")
127 | .resizable()
128 | .scaledToFill()
129 | .frame(width: 110, height: 110)
130 | .padding(.bottom, 4)
131 |
132 | Text(sObj["name"] ?? "")
133 | .font(.customfont(.bold, fontSize: 13))
134 | .foregroundColor(.primaryText60)
135 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
136 | Text(sObj["artists"] ?? "")
137 | .font(.customfont(.bold, fontSize: 10))
138 | .foregroundColor(Color.secondaryText)
139 | .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
140 | }
141 |
142 | }
143 |
144 | }
145 | .padding(.horizontal, 20)
146 | }
147 |
148 | ViewAllSection(title: "Recently Played") {
149 |
150 | }
151 | .padding(.horizontal, 20)
152 | .padding(.vertical, 8)
153 |
154 | LazyVStack(spacing: 10) {
155 | ForEach( 0..
12 | @State var seekbarVal: Double = 0.5
13 |
14 |
15 |
16 | var body: some View {
17 | ZStack{
18 | VStack{
19 | HStack{
20 | Button {
21 | self.mode.wrappedValue.dismiss()
22 | } label: {
23 | Image("close")
24 | .resizable()
25 | .scaledToFit()
26 | .frame(width: 25, height: 25)
27 | }
28 |
29 | Text("Driver Mode")
30 | .font(.customfont(.bold, fontSize: 18))
31 | .foregroundColor(.primaryText80)
32 | .frame(maxWidth: .infinity, alignment: .center)
33 |
34 | Button {
35 |
36 | } label: {
37 | Image("playlist")
38 | .resizable()
39 | .scaledToFit()
40 | .frame(width: 25, height: 25)
41 | }
42 |
43 | }
44 | .padding(.top, .topInsets)
45 | .padding(.horizontal,20)
46 |
47 | ScrollView{
48 |
49 | ZStack {
50 | Image("player_image")
51 | .resizable()
52 | .scaledToFit()
53 | .frame(width: .widthPer(per: 0.4), height: .widthPer(per: 0.4))
54 | .cornerRadius(.widthPer(per: 0.2))
55 | .clipped()
56 | }
57 | .padding(.bottom,45)
58 |
59 |
60 |
61 |
62 | Text("Black or White")
63 | .font(.customfont(.medium, fontSize: 18))
64 | .foregroundColor(.primaryText.opacity(0.9))
65 | .padding(.bottom, 4)
66 |
67 | Text("Michael Jackson • Album - Dangerous")
68 | .font(.customfont(.regular, fontSize: 14))
69 | .foregroundColor(.primaryText60)
70 | .padding(.bottom, 15)
71 |
72 | Text("237 | 335")
73 | .font(.customfont(.regular, fontSize: 14))
74 | .foregroundColor(.primaryText60)
75 | .padding(.bottom, 40)
76 |
77 | VStack {
78 | Slider(value: $seekbarVal )
79 | .accentColor(Color.focus)
80 |
81 | HStack{
82 | Text("3:24")
83 | .font(.customfont(.regular, fontSize: 14))
84 | .foregroundColor(.primaryText80)
85 | .padding(.bottom, 40)
86 |
87 | Spacer()
88 |
89 | Text("5:24")
90 | .font(.customfont(.regular, fontSize: 14))
91 | .foregroundColor(.primaryText80)
92 | .padding(.bottom, 40)
93 | }
94 | }
95 | .padding(20)
96 |
97 | HStack(spacing: 25) {
98 | Button {
99 |
100 | } label: {
101 | Image("previous_song")
102 | .resizable()
103 | .scaledToFit()
104 | .frame(width: 50, height: 50)
105 | }
106 |
107 | Spacer()
108 |
109 | Button {
110 |
111 | } label: {
112 | Image("play")
113 | .resizable()
114 | .scaledToFit()
115 | .frame(width: 80, height: 80)
116 | }
117 |
118 | Spacer()
119 |
120 | Button {
121 |
122 | } label: {
123 | Image("next_song")
124 | .resizable()
125 | .scaledToFit()
126 | .frame(width: 50, height: 50)
127 | }
128 |
129 | }
130 | .padding(.horizontal, 25)
131 |
132 |
133 |
134 | }
135 |
136 | }
137 |
138 | }
139 | .navigationTitle("")
140 | .navigationBarHidden(true)
141 | .navigationBarBackButtonHidden()
142 | .background(Color.bg)
143 | .ignoresSafeArea()
144 | }
145 | }
146 |
147 | struct DriverModeView_Previews: PreviewProvider {
148 | static var previews: some View {
149 | DriverModeView()
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/music_app_swiftui/View/Player/MainPlayerView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainPlayerView.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 28/08/23.
6 | //
7 |
8 | import SwiftUI
9 | import CircularSlider
10 | import SDWebImageSwiftUI
11 |
12 | struct MainPlayerView: View {
13 | @Environment(\.presentationMode) var mode: Binding
14 | @State var seekbarVal: Double = 0.5
15 |
16 | @StateObject var model = AudioPlayerViewModel.shared
17 |
18 |
19 |
20 | var body: some View {
21 | ZStack{
22 | VStack{
23 | HStack{
24 | Button {
25 | self.mode.wrappedValue.dismiss()
26 | } label: {
27 | Image("back")
28 | .resizable()
29 | .scaledToFit()
30 | .frame(width: 25, height: 25)
31 | }
32 |
33 | Text("Now Playing")
34 | .font(.customfont(.bold, fontSize: 18))
35 | .foregroundColor(.primaryText80)
36 | .frame(maxWidth: .infinity, alignment: .center)
37 |
38 | Menu {
39 | Button {
40 |
41 | } label: {
42 | Text("Social Share")
43 | .foregroundColor(.primaryText)
44 | }
45 |
46 | Button {
47 |
48 | } label: {
49 | Text("Playing Queue")
50 | .foregroundColor(.primaryText)
51 | }
52 |
53 | Button {
54 |
55 | } label: {
56 | Text("Add to playlist ...")
57 | .foregroundColor(.primaryText)
58 | }
59 |
60 |
61 | Button {
62 |
63 | } label: {
64 | Text("Lyrics")
65 | .foregroundColor(.primaryText)
66 | }
67 |
68 |
69 | Button {
70 |
71 | } label: {
72 | Text("Volume")
73 | .foregroundColor(.primaryText)
74 | }
75 |
76 |
77 | Button {
78 |
79 | } label: {
80 | Text("Details")
81 | .foregroundColor(.primaryText)
82 | }
83 |
84 |
85 | Button {
86 |
87 | } label: {
88 | Text("Sleep Timer")
89 | .foregroundColor(.primaryText)
90 | }
91 |
92 | NavigationLink {
93 | DriverModeView()
94 | } label: {
95 | Text("Driver Mode")
96 | .foregroundColor(.primaryText)
97 | }
98 |
99 | } label: {
100 | Image("more_btn")
101 | .resizable()
102 | .scaledToFit()
103 | .frame(width: 25, height: 25)
104 | }
105 | .environment(\.colorScheme, .dark)
106 |
107 | }
108 | .padding(.top, .topInsets)
109 | .padding(.horizontal,20)
110 |
111 | ScrollView{
112 |
113 | ZStack {
114 |
115 | let _ = print(model.artwork)
116 |
117 | WebImage( url: URL(string: model.artwork))
118 | .resizable()
119 | .indicator(.activity)
120 | .transition(.fade(duration: 0.5))
121 | .scaledToFit()
122 | .frame(width: .widthPer(per: 0.6), height: .widthPer(per: 0.6))
123 | .cornerRadius(.widthPer(per: 0.3))
124 | .clipped()
125 |
126 | CircularSlider(currentValue: $model.sliderValue,
127 | minValue: 0.0,
128 | maxValue: model.sliderMaximumValue,
129 | knobRadius: 10, knobColor: Color.focusStart,
130 | radius: Double( CGFloat.widthPer(per: 0.3)),
131 | progressLineColor: Color.focusStart,
132 | textColor: .clear,
133 | currentValueSuffix: "")
134 | .padding(20)
135 | }
136 | .padding(.bottom, 4)
137 |
138 | ProgressSliderView(value: $model.sliderValue,
139 | maximumValue: $model.sliderMaximumValue,
140 | isUserInteractionEnabled: $model.sliderIsUserInteractionEnabled,
141 | playableProgress: $model.sliderPlayableProgress) {
142 | model.sliderValueChanged.send($0)
143 | }
144 | .padding(.horizontal)
145 |
146 |
147 | Text("\(model.duration) | -\(model.restDuration)")
148 | .font(.customfont(.regular, fontSize: 14))
149 | .foregroundColor(.secondaryText)
150 | .padding(.bottom, 15)
151 |
152 | Text(model.title)
153 | .font(.customfont(.medium, fontSize: 18))
154 | .foregroundColor(.primaryText.opacity(0.9))
155 | .padding(.bottom, 4)
156 |
157 | Text("\( model.artist )")
158 | .font(.customfont(.regular, fontSize: 14))
159 | .foregroundColor(.secondaryText)
160 | .padding(.bottom, 15)
161 |
162 | Image("eq_display")
163 | .resizable()
164 | .scaledToFit()
165 | .frame(width: 280, height: 70)
166 |
167 | Divider()
168 | .padding(20)
169 |
170 | HStack(spacing: 25) {
171 | Button {
172 | model.playPrevious()
173 | } label: {
174 | Image("previous_song")
175 | .resizable()
176 | .scaledToFit()
177 | .frame(width: 45, height: 45)
178 | }
179 | .disabled(!model.canPlayPrevious)
180 |
181 | Button {
182 | model.canPlay ? model.play() : model.pause()
183 | } label: {
184 | Image( model.canPlay ? "play" : "pause" )
185 | .resizable()
186 | .scaledToFit()
187 | .frame(width: 60, height: 60)
188 | }
189 |
190 | Button {
191 | model.playNext()
192 | } label: {
193 | Image("next_song")
194 | .resizable()
195 | .scaledToFit()
196 | .frame(width: 45, height: 45)
197 | }
198 | .disabled(!model.canPlayNext)
199 |
200 | }
201 |
202 | HStack(spacing: 25) {
203 | NavigationLink {
204 | PlayPlaylistView()
205 | } label: {
206 | PlayerBottomButton(title: "Playlist", icon: "playlist")
207 | }
208 |
209 | Button {
210 | model.shuffle()
211 | } label: {
212 | PlayerBottomButton(title: "Shuffle", icon: "shuffle")
213 | }
214 |
215 | Button {
216 | model.doRepeat()
217 | } label: {
218 | PlayerBottomButton(title: "Repeat", icon: "repeat")
219 | }
220 |
221 | Button {
222 |
223 | } label: {
224 | PlayerBottomButton(title: "EQ", icon: "eq")
225 | }
226 |
227 | Button {
228 |
229 | } label: {
230 | PlayerBottomButton(title: "Favourites", icon: "favTemp")
231 | }
232 | }
233 | .padding(20)
234 | }
235 |
236 | }
237 |
238 | }
239 | .navigationTitle("")
240 | .navigationBarHidden(true)
241 | .navigationBarBackButtonHidden()
242 | .background(Color.bg)
243 | .ignoresSafeArea()
244 | }
245 | }
246 |
247 | struct MainPlayerView_Previews: PreviewProvider {
248 | static var previews: some View {
249 | NavigationView {
250 | MainPlayerView()
251 | }
252 |
253 | }
254 | }
255 |
--------------------------------------------------------------------------------
/music_app_swiftui/View/Player/PlayPlaylistView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlayPlaylistView.swift
3 | // music_app_swiftui
4 | //
5 | // Created by CodeForAny on 28/08/23.
6 | //
7 |
8 | import SwiftUI
9 | import CircularSlider
10 |
11 | struct PlayPlaylistView: View {
12 | @Environment(\.presentationMode) var mode: Binding
13 | @State var seekbarVal: Double = 0.5
14 |
15 | @State var allArr: NSArray = [
16 | [
17 |
18 | "image": "s1",
19 | "name": "Billie Jean",
20 | "artist": "Michael Jackson"
21 | ],
22 | [
23 | "image": "s2",
24 | "name": "Be the girl",
25 | "artist": "Bebe Rexa"
26 | ],
27 | [
28 | "image": "s3",
29 | "name": "Countryman",
30 | "artist": "Daughtry"
31 | ],
32 | [
33 | "image": "s4",
34 | "name": "Do you feel lonelyness",
35 | "artist": "Marc Anthony"
36 | ],
37 | [
38 | "image": "s5",
39 | "name": "Earth song",
40 | "artist": "Michael Jackson"
41 | ],
42 | [
43 | "image": "s6",
44 | "name": "Smooth criminal",
45 | "artist": "Michael Jackson"
46 | ],
47 | [
48 | "image": "s7",
49 | "name": "The way you make me feel",
50 | "artist": "Michael Jackson"
51 | ],
52 |
53 | [
54 | "image": "s9",
55 | "name": "Somebody that I used to know",
56 | "artist": "Gotye"
57 | ],
58 | [
59 | "image": "s10",
60 | "name": "Wild Thoughts",
61 | "artist": "Michael Jackson"
62 | ]
63 | ]
64 |
65 |
66 |
67 | var body: some View {
68 | ZStack{
69 | VStack{
70 | HStack{
71 | Button {
72 | self.mode.wrappedValue.dismiss()
73 | } label: {
74 | Image("back")
75 | .resizable()
76 | .scaledToFit()
77 | .frame(width: 25, height: 25)
78 | }
79 |
80 | Text("Playlist")
81 | .font(.customfont(.bold, fontSize: 18))
82 | .foregroundColor(.primaryText80)
83 | .frame(maxWidth: .infinity, alignment: .center)
84 |
85 | Menu {
86 | Button {
87 |
88 | } label: {
89 | Text("Social Share")
90 | .foregroundColor(.primaryText)
91 | }
92 |
93 | Button {
94 |
95 | } label: {
96 | Text("Playing Queue")
97 | .foregroundColor(.primaryText)
98 | }
99 |
100 | Button {
101 |
102 | } label: {
103 | Text("Add to playlist ...")
104 | .foregroundColor(.primaryText)
105 | }
106 |
107 |
108 | Button {
109 |
110 | } label: {
111 | Text("Lyrics")
112 | .foregroundColor(.primaryText)
113 | }
114 |
115 |
116 | Button {
117 |
118 | } label: {
119 | Text("Volume")
120 | .foregroundColor(.primaryText)
121 | }
122 |
123 |
124 | Button {
125 |
126 | } label: {
127 | Text("Details")
128 | .foregroundColor(.primaryText)
129 | }
130 |
131 |
132 | Button {
133 |
134 | } label: {
135 | Text("Sleep Timer")
136 | .foregroundColor(.primaryText)
137 | }
138 | } label: {
139 | Image("more_btn")
140 | .resizable()
141 | .scaledToFit()
142 | .frame(width: 25, height: 25)
143 | }
144 | .environment(\.colorScheme, .dark)
145 |
146 | }
147 | .padding(.top, .topInsets)
148 | .padding(.horizontal,20)
149 |
150 | ScrollView{
151 |
152 | HStack(spacing: 25) {
153 | Button {
154 |
155 | } label: {
156 | Image("previous_song")
157 | .resizable()
158 | .scaledToFit()
159 | .frame(width: 40, height: 40)
160 | }
161 |
162 | Spacer()
163 |
164 | ZStack {
165 | Image("player_image")
166 | .resizable()
167 | .scaledToFit()
168 | .frame(width: .widthPer(per: 0.4), height: .widthPer(per: 0.4))
169 | .cornerRadius(.widthPer(per: 0.2))
170 | .clipped()
171 |
172 | CircularSlider(currentValue: $seekbarVal,
173 | minValue: 0.0,
174 | maxValue: 1.0,
175 | knobRadius: 10, knobColor: Color.focusStart,
176 | radius: Double( CGFloat.widthPer(per: 0.2)),
177 | progressLineColor: Color.focusStart,
178 | textColor: .clear,
179 | currentValueSuffix: "")
180 | .frame(width: .widthPer(per: 0.45), height: .widthPer(per: 0.45))
181 | }
182 |
183 | Spacer()
184 |
185 | Button {
186 |
187 | } label: {
188 | Image("next_song")
189 | .resizable()
190 | .scaledToFit()
191 | .frame(width: 40, height: 40)
192 | }
193 |
194 | }
195 | .padding(.horizontal, 20)
196 | .padding(.bottom, 4)
197 |
198 |
199 | Text("3:15 | 4.26")
200 | .font(.customfont(.regular, fontSize: 14))
201 | .foregroundColor(.secondaryText)
202 | .padding(.bottom, 15)
203 |
204 | Text("Black or White")
205 | .font(.customfont(.medium, fontSize: 18))
206 | .foregroundColor(.primaryText.opacity(0.9))
207 | .padding(.bottom, 4)
208 |
209 | Text("Michael Jackson • Album - Dangerous")
210 | .font(.customfont(.regular, fontSize: 14))
211 | .foregroundColor(.primaryText60)
212 | .padding(.bottom, 15)
213 |
214 |
215 |
216 |
217 |
218 | LazyVStack(spacing: 10) {
219 | ForEach( 0..
13 |
14 | @State var allArr: NSArray = [
15 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
16 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
17 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
18 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
19 | ],
20 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
21 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
22 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
23 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
24 | ],
25 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
26 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
27 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
28 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
29 | ]
30 | ]
31 |
32 |
33 | var body: some View {
34 | ZStack{
35 | VStack{
36 | HStack{
37 | Button {
38 | self.mode.wrappedValue.dismiss()
39 | } label: {
40 | Image("back")
41 | .resizable()
42 | .scaledToFit()
43 | .frame(width: 25, height: 25)
44 | }
45 |
46 | Text("Album Details")
47 | .font(.customfont(.bold, fontSize: 18))
48 | .foregroundColor(.primaryText80)
49 | .frame(maxWidth: .infinity, alignment: .center)
50 |
51 | Button {
52 | self.mode.wrappedValue.dismiss()
53 | } label: {
54 | Image("search")
55 | .resizable()
56 | .scaledToFit()
57 | .frame(width: 25, height: 25)
58 | .foregroundColor(.primaryText28)
59 | }
60 |
61 | }
62 | .padding(.top, .topInsets)
63 | .padding(.horizontal,20)
64 |
65 | ScrollView{
66 |
67 | ZStack{
68 | Image("alb_1")
69 | .resizable()
70 | .scaledToFill()
71 | .frame(width: .screenWidth - 40, height: .screenWidth * 0.5)
72 | .blur(radius: 5)
73 | .clipped()
74 |
75 | Rectangle()
76 | .fill( Color.black.opacity(0.54) )
77 |
78 | VStack(){
79 | HStack(alignment: .top,spacing: 15){
80 | Image("alb_1")
81 | .resizable()
82 | .scaledToFill()
83 | .frame(width: 100, height: 100)
84 | .clipped()
85 |
86 | VStack(spacing: 8){
87 | Text("History")
88 | .font(.customfont(.bold, fontSize: 18))
89 | .foregroundColor(.primaryText.opacity(0.9))
90 | .frame(maxWidth: .infinity, alignment: .leading)
91 |
92 | Text("by Michal Jackson")
93 | .font(.customfont(.bold, fontSize: 12))
94 | .foregroundColor(.primaryText.opacity(0.74))
95 | .frame(maxWidth: .infinity, alignment: .leading)
96 |
97 | Text("1996 . 18 Songs . 64 min")
98 | .font(.customfont(.bold, fontSize: 12))
99 | .foregroundColor(.primaryText.opacity(0.74))
100 | .frame(maxWidth: .infinity, alignment: .leading)
101 | }
102 | }
103 |
104 | HStack{
105 | Button {
106 |
107 | } label: {
108 | Image("play_n")
109 | .resizable()
110 | .scaledToFit()
111 | .frame(width:12, height: 12)
112 |
113 | Text("Play")
114 | .font(.customfont(.medium, fontSize: 8))
115 | .foregroundColor(.primaryText.opacity(0.74))
116 | }
117 | .padding(8)
118 | .padding(.horizontal, 8)
119 | .background(
120 | LinearGradient(colors: Color.primaryG, startPoint: .top, endPoint: .bottom)
121 | )
122 | .cornerRadius(15)
123 |
124 | Spacer()
125 |
126 | Button {
127 |
128 | } label: {
129 | Image("share")
130 | .resizable()
131 | .scaledToFit()
132 | .frame(width:12, height: 12)
133 |
134 | Text("Share")
135 | .font(.customfont(.medium, fontSize: 8))
136 | .foregroundColor(.primaryText.opacity(0.74))
137 | }
138 | .padding(8)
139 | .padding(.horizontal, 15)
140 | .overlay(
141 | RoundedRectangle(cornerRadius: 15)
142 | .stroke( Color.primaryText, lineWidth: 1 )
143 | )
144 | .cornerRadius(8)
145 |
146 | Spacer()
147 |
148 | Button {
149 |
150 | } label: {
151 | Image("favTemp")
152 | .resizable()
153 | .scaledToFit()
154 | .frame(width:12, height: 12)
155 |
156 | Text("Add to Favorites")
157 | .font(.customfont(.medium, fontSize: 8))
158 |
159 | }
160 | .foregroundColor(.primaryText.opacity(0.74))
161 | .padding(8)
162 | .padding(.horizontal, 8)
163 | .overlay(
164 | RoundedRectangle(cornerRadius: 15)
165 | .stroke( Color.primaryText, lineWidth: 1 )
166 | )
167 | .cornerRadius(15)
168 |
169 | }
170 | }
171 | .padding(20)
172 | }
173 | .frame(width: .screenWidth - 40)
174 |
175 | LazyVStack {
176 | ForEach( 0..
12 |
13 | @State var albumArr: NSArray = [
14 | [
15 | "image":"ar_d_1",
16 | "name":"Fire Dragon",
17 | "year":"2019",
18 | ],
19 | [
20 | "image": "ar_d_2",
21 | "name": "Sound of Life",
22 | "year": "2018",
23 | ],
24 | [
25 | "image":"ar_d_3",
26 | "name":"Giving Heart",
27 | "year":"2017",
28 | ],
29 | [
30 | "image": "ar_d_4",
31 | "name": "Dream of",
32 | "year": "2016",
33 | ]
34 | ]
35 |
36 | @State var allArr: NSArray = [
37 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
38 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
39 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
40 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
41 | ],
42 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
43 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
44 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
45 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
46 | ],
47 | ["duration": "3:56", "name": "Billie Jean", "artists": "Michael Jackson"],
48 | ["duration": "3:56", "name": "Earth Song", "artists": "Michael Jackson"],
49 | ["duration": "3:56", "name": "Mirror", "artists": "Justin Timberlake"],
50 | ["duration": "3:56", "name": "Remember the Time","artists": "Michael Jackson"
51 | ]
52 | ]
53 |
54 |
55 | var body: some View {
56 | ZStack{
57 | VStack{
58 | HStack{
59 | Button {
60 | self.mode.wrappedValue.dismiss()
61 | } label: {
62 | Image("back")
63 | .resizable()
64 | .scaledToFit()
65 | .frame(width: 25, height: 25)
66 | }
67 |
68 | Text("Artist Details")
69 | .font(.customfont(.bold, fontSize: 18))
70 | .foregroundColor(.primaryText80)
71 | .frame(maxWidth: .infinity, alignment: .center)
72 |
73 | Button {
74 | self.mode.wrappedValue.dismiss()
75 | } label: {
76 | Image("search")
77 | .resizable()
78 | .scaledToFit()
79 | .frame(width: 25, height: 25)
80 | .foregroundColor(.primaryText28)
81 | }
82 |
83 | }
84 | .padding(.top, .topInsets)
85 | .padding(.horizontal,20)
86 |
87 | ScrollView{
88 |
89 | ZStack{
90 | Image("artitst_detail_top")
91 | .resizable()
92 | .scaledToFill()
93 | .frame(width: .screenWidth - 40, height: .screenWidth * 0.5)
94 | .blur(radius: 5)
95 | .clipped()
96 |
97 | Rectangle()
98 | .fill( Color.black.opacity(0.54) )
99 |
100 | VStack(){
101 |
102 |
103 | VStack(spacing: 15){
104 | Text("Dilon Bruce")
105 | .font(.customfont(.bold, fontSize: 18))
106 | .foregroundColor(.primaryText.opacity(0.9))
107 | .frame(maxWidth: .infinity, alignment: .center)
108 |
109 | Text("Pop rock, Funk pop, Heavy Metal")
110 | .font(.customfont(.bold, fontSize: 12))
111 | .foregroundColor(.primaryText.opacity(0.74))
112 | .frame(maxWidth: .infinity, alignment: .center)
113 |
114 | }
115 | .padding(.bottom, 25)
116 |
117 |
118 | HStack{
119 | Spacer()
120 |
121 | VStack {
122 | Text("4,357")
123 | .font(.customfont(.bold, fontSize: 18))
124 | .foregroundColor(.primaryText.opacity(0.9))
125 |
126 | Text("Followers")
127 | .font(.customfont(.bold, fontSize: 10))
128 | .foregroundColor(.primaryText60)
129 | }
130 |
131 | Spacer()
132 | VStack {
133 | Text("128,980")
134 | .font(.customfont(.bold, fontSize: 18))
135 | .foregroundColor(.primaryText.opacity(0.9))
136 |
137 | Text("Lintners")
138 | .font(.customfont(.bold, fontSize: 10))
139 | .foregroundColor(.primaryText60)
140 | }
141 |
142 | Spacer()
143 |
144 | Button {
145 |
146 | } label: {
147 |
148 |
149 | Text("Follow")
150 | .font(.customfont(.medium, fontSize: 8))
151 | .foregroundColor(.primaryText.opacity(0.74))
152 | }
153 | .padding(8)
154 | .padding(.horizontal, 8)
155 | .background(
156 | LinearGradient(colors: Color.primaryG, startPoint: .top, endPoint: .bottom)
157 | )
158 | .cornerRadius(15)
159 | }
160 | }
161 | .padding(20)
162 | }
163 | .frame(width: .screenWidth - 40)
164 |
165 | ViewAllSection(title: "Top Albums") {
166 |
167 | }
168 | .padding(20)
169 |
170 | ScrollView(.horizontal, showsIndicators: false) {
171 | LazyHStack(spacing: 15) {
172 | ForEach( 0..