diff --git a/MusicPlayer.xcodeproj/project.pbxproj b/MusicPlayer.xcodeproj/project.pbxproj index 46f6f86..a56880a 100644 --- a/MusicPlayer.xcodeproj/project.pbxproj +++ b/MusicPlayer.xcodeproj/project.pbxproj @@ -14,30 +14,28 @@ 009662392BB14A5B00FCA65F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 009662382BB14A5B00FCA65F /* Assets.xcassets */; }; 0096623C2BB14A5B00FCA65F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0096623A2BB14A5B00FCA65F /* LaunchScreen.storyboard */; }; 639E3B772F558B3350DD56BA /* Pods_MusicPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 411725AB000C22E50EBD70BA /* Pods_MusicPlayer.framework */; }; - CB0FBB7F2BC69616006290D4 /* PrivacyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0FBB7D2BC69616006290D4 /* PrivacyViewController.swift */; }; - CB0FBB802BC69616006290D4 /* PrivacyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB0FBB7E2BC69616006290D4 /* PrivacyViewController.xib */; }; - CB0FBB832BC6986E006290D4 /* ServiceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0FBB812BC6986E006290D4 /* ServiceViewController.swift */; }; - CB0FBB842BC6986E006290D4 /* ServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB0FBB822BC6986E006290D4 /* ServiceViewController.xib */; }; - CB1181452BC66E7C00586030 /* PlayerActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1181442BC66E7C00586030 /* PlayerActionView.swift */; }; - CB1181482BC6874D00586030 /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1181462BC6874D00586030 /* SettingViewController.swift */; }; - CB1181492BC6874D00586030 /* SettingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB1181472BC6874D00586030 /* SettingViewController.xib */; }; - CB11814C2BC68B0500586030 /* SettingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB11814A2BC68B0500586030 /* SettingTableViewCell.swift */; }; - CB11814D2BC68B0500586030 /* SettingTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB11814B2BC68B0500586030 /* SettingTableViewCell.xib */; }; - CB1181502BC68DD800586030 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB11814E2BC68DD800586030 /* AboutViewController.swift */; }; - CB1181512BC68DD800586030 /* AboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB11814F2BC68DD800586030 /* AboutViewController.xib */; }; - CB1C16522BC80BF100B96AB3 /* MPMediaCenterManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1C16512BC80BF100B96AB3 /* MPMediaCenterManager.swift */; }; - CB7B778F2BB50B1300C34894 /* CountTimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7B778D2BB50B1300C34894 /* CountTimerViewController.swift */; }; - CB7B77902BB50B1300C34894 /* CountTimerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB7B778E2BB50B1300C34894 /* CountTimerViewController.xib */; }; - CB7B77952BB55A4500C34894 /* PlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7B77932BB55A4500C34894 /* PlayerViewController.swift */; }; - CB7B77962BB55A4500C34894 /* PlayerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB7B77942BB55A4500C34894 /* PlayerViewController.xib */; }; - CBAD14AB2BC3E1C3001430F9 /* MPBottomShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBAD14AA2BC3E1C3001430F9 /* MPBottomShowView.swift */; }; - CBAD14AD2BC3E201001430F9 /* MPBottomShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBAD14AC2BC3E201001430F9 /* MPBottomShowView.xib */; }; - CBBFA9132BBA71CF00057FD5 /* MusicModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA9122BBA71CF00057FD5 /* MusicModel.swift */; }; - CBBFA9182BBA83BA00057FD5 /* MPCoreDataHandlerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA9172BBA83BA00057FD5 /* MPCoreDataHandlerManager.swift */; }; + CB0918912BD255EA006D2B39 /* MPPositive_NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918902BD255EA006D2B39 /* MPPositive_NavigationController.swift */; }; + CB0918972BD25D8C006D2B39 /* MPPositive_TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918962BD25D8C006D2B39 /* MPPositive_TabBarController.swift */; }; + CB0918992BD25DCC006D2B39 /* MPPositive_CustomTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918982BD25DCC006D2B39 /* MPPositive_CustomTabBar.swift */; }; + CB09189B2BD25F50006D2B39 /* MPPositive_CustomTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB09189A2BD25F50006D2B39 /* MPPositive_CustomTabBarView.swift */; }; + CB09189D2BD25F63006D2B39 /* MPPositive_CustomTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB09189C2BD25F63006D2B39 /* MPPositive_CustomTabBarItem.swift */; }; + CB09189F2BD26AFC006D2B39 /* MPPositive_HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB09189E2BD26AFC006D2B39 /* MPPositive_HomeViewController.swift */; }; + CB0918A12BD26B0A006D2B39 /* MPPositive_SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918A02BD26B0A006D2B39 /* MPPositive_SearchViewController.swift */; }; + CB0918A32BD26B2F006D2B39 /* MPPositive_LibraryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918A22BD26B2F006D2B39 /* MPPositive_LibraryViewController.swift */; }; + CB0918A52BD26E16006D2B39 /* MPPositive_BottomShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0918A42BD26E16006D2B39 /* MPPositive_BottomShowView.swift */; }; + CB1C16522BC80BF100B96AB3 /* MPSideA_MediaCenterManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1C16512BC80BF100B96AB3 /* MPSideA_MediaCenterManager.swift */; }; + CB5661292BE09D0500CFD014 /* MPPositive_JsonPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB5661282BE09D0500CFD014 /* MPPositive_JsonPlayer.swift */; }; + CB56612D2BE0DF8C00CFD014 /* MP_WebWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB56612C2BE0DF8C00CFD014 /* MP_WebWork.swift */; }; + CBB5D31D2BDF4E9600CC333D /* MPPositive_MusicItemShowTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB5D31C2BDF4E9600CC333D /* MPPositive_MusicItemShowTableViewCell.swift */; }; + CBB5D31F2BDF711600CC333D /* MPPositive_SongItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB5D31E2BDF711600CC333D /* MPPositive_SongItemModel.swift */; }; + CBB5D3222BDF80C800CC333D /* MPPositive_PlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB5D3212BDF80C800CC333D /* MPPositive_PlayerViewController.swift */; }; + CBB9F9DD2BEDCFEE008338DE /* MPPositive_JsonLyrics.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB9F9DC2BEDCFEE008338DE /* MPPositive_JsonLyrics.swift */; }; + CBB9F9DF2BEDDCC5008338DE /* MP_PlayerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB9F9DE2BEDDCC5008338DE /* MP_PlayerManager.swift */; }; + CBBFA9182BBA83BA00057FD5 /* MP_CoreDataHandlerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA9172BBA83BA00057FD5 /* MP_CoreDataHandlerManager.swift */; }; CBBFA91A2BBA846600057FD5 /* CoreDataDelegete.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA9192BBA846600057FD5 /* CoreDataDelegete.swift */; }; CBBFA91E2BBA9B5C00057FD5 /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA91D2BBA9B5C00057FD5 /* Notification.swift */; }; - CBBFA9202BBAB88500057FD5 /* MusicViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA91F2BBAB88500057FD5 /* MusicViewModel.swift */; }; - CBBFA9222BBAB8FD00057FD5 /* LoadDataMusic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBFA9212BBAB8FD00057FD5 /* LoadDataMusic.swift */; }; + CBC32A532BD8D9F300687171 /* MPPositive_BrowseItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC32A522BD8D9F300687171 /* MPPositive_BrowseItemModel.swift */; }; + CBC32A552BD8DFB900687171 /* MPPositive_BrowseModuleListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC32A542BD8DFB900687171 /* MPPositive_BrowseModuleListViewModel.swift */; }; CBC54E562BC4D5D3003B1901 /* Breathe.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E442BC4D5D3003B1901 /* Breathe.mp3 */; }; CBC54E572BC4D5D3003B1901 /* Shhh….mp3 in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E452BC4D5D3003B1901 /* Shhh….mp3 */; }; CBC54E582BC4D5D3003B1901 /* Shh Shh.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E462BC4D5D3003B1901 /* Shh Shh.mp3 */; }; @@ -55,53 +53,102 @@ CBC54E642BC4D5D3003B1901 /* Seawater Surging.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E542BC4D5D3003B1901 /* Seawater Surging.mp3 */; }; CBC54E652BC4D5D3003B1901 /* Summer Insects.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E552BC4D5D3003B1901 /* Summer Insects.mp3 */; }; CBC54E672BC4D90F003B1901 /* Resource.plist in Resources */ = {isa = PBXBuildFile; fileRef = CBC54E662BC4D90F003B1901 /* Resource.plist */; }; - CBC6873E2BC24FFF0023ECA6 /* MoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC6873C2BC24FFF0023ECA6 /* MoreViewController.swift */; }; - CBC6873F2BC24FFF0023ECA6 /* MoreViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBC6873D2BC24FFF0023ECA6 /* MoreViewController.xib */; }; - CBC687422BC2788D0023ECA6 /* RenameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC687402BC2788D0023ECA6 /* RenameViewController.swift */; }; - CBC687432BC2788D0023ECA6 /* RenameViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBC687412BC2788D0023ECA6 /* RenameViewController.xib */; }; - CBC687462BC27AE70023ECA6 /* DeleteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC687442BC27AE70023ECA6 /* DeleteViewController.swift */; }; - CBC687472BC27AE70023ECA6 /* DeleteViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBC687452BC27AE70023ECA6 /* DeleteViewController.xib */; }; CBC687492BC2882B0023ECA6 /* MPTableManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC687482BC2882B0023ECA6 /* MPTableManager.swift */; }; CBC6874B2BC2B0710023ECA6 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC6874A2BC2B0710023ECA6 /* String.swift */; }; CBCAFB5A2BB3C2A000BC6520 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB592BB3C2A000BC6520 /* LayoutConstraint.swift */; }; CBCAFB5D2BB3C52100BC6520 /* HexColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB5C2BB3C52100BC6520 /* HexColor.swift */; }; CBCAFB5F2BB3C55500BC6520 /* DateTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB5E2BB3C55500BC6520 /* DateTime.swift */; }; CBCAFB612BB3C59500BC6520 /* InstanceFromNib.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB602BB3C59500BC6520 /* InstanceFromNib.swift */; }; - CBCAFB632BB3C67A00BC6520 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB622BB3C67A00BC6520 /* BaseViewController.swift */; }; - CBCAFB662BB3C82C00BC6520 /* LunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB642BB3C82C00BC6520 /* LunchViewController.swift */; }; - CBCAFB672BB3C82C00BC6520 /* LunchViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB652BB3C82C00BC6520 /* LunchViewController.xib */; }; - CBCAFB692BB3CAC400BC6520 /* Lunch_ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB682BB3CAC400BC6520 /* Lunch_ProgressView.swift */; }; - CBCAFB6C2BB3EB4500BC6520 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB6A2BB3EB4500BC6520 /* HomeViewController.swift */; }; - CBCAFB6D2BB3EB4500BC6520 /* HomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB6B2BB3EB4500BC6520 /* HomeViewController.xib */; }; - CBCAFB6F2BB3EB7000BC6520 /* MPNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB6E2BB3EB7000BC6520 /* MPNavigationController.swift */; }; - CBCAFB712BB3EB9100BC6520 /* MPTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB702BB3EB9100BC6520 /* MPTabBarController.swift */; }; - CBCAFB732BB3EDAE00BC6520 /* MPCustomTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB722BB3EDAE00BC6520 /* MPCustomTabBar.swift */; }; - CBCAFB752BB3EDCD00BC6520 /* MPCustomTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB742BB3EDCD00BC6520 /* MPCustomTabBarView.swift */; }; - CBCAFB772BB3EE4800BC6520 /* MPCustomTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB762BB3EE4800BC6520 /* MPCustomTabBarItem.swift */; }; - CBCAFB7C2BB3F98800BC6520 /* AddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB7A2BB3F98800BC6520 /* AddViewController.swift */; }; - CBCAFB7D2BB3F98800BC6520 /* AddViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB7B2BB3F98800BC6520 /* AddViewController.xib */; }; - CBCAFB802BB3F99300BC6520 /* CenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB7E2BB3F99300BC6520 /* CenterViewController.swift */; }; - CBCAFB812BB3F99300BC6520 /* CenterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB7F2BB3F99300BC6520 /* CenterViewController.xib */; }; - CBCAFB832BB40C1000BC6520 /* Home_HeadBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB822BB40C1000BC6520 /* Home_HeadBannerView.swift */; }; - CBCAFB862BB40ED800BC6520 /* Home_RowListsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB842BB40ED800BC6520 /* Home_RowListsTableViewCell.swift */; }; - CBCAFB872BB40ED800BC6520 /* Home_RowListsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB852BB40ED800BC6520 /* Home_RowListsTableViewCell.xib */; }; - CBCAFB8A2BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB882BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.swift */; }; - CBCAFB8B2BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB892BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.xib */; }; - CBCAFB8E2BB4170000BC6520 /* Home_SecondListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB8C2BB4170000BC6520 /* Home_SecondListCollectionViewCell.swift */; }; - CBCAFB8F2BB4170000BC6520 /* Home_SecondListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB8D2BB4170000BC6520 /* Home_SecondListCollectionViewCell.xib */; }; - CBCAFB922BB4185700BC6520 /* Home_FourthListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB902BB4185700BC6520 /* Home_FourthListCollectionViewCell.swift */; }; - CBCAFB932BB4185700BC6520 /* Home_FourthListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB912BB4185700BC6520 /* Home_FourthListCollectionViewCell.xib */; }; - CBCAFB992BB4309C00BC6520 /* MPPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB982BB4309C00BC6520 /* MPPresentationController.swift */; }; - CBD5AEDE2BBBA7B600BF5A43 /* CenterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD5AEDC2BBBA7B600BF5A43 /* CenterTableViewCell.swift */; }; - CBD5AEDF2BBBA7B600BF5A43 /* CenterTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBD5AEDD2BBBA7B600BF5A43 /* CenterTableViewCell.xib */; }; + CBCAFB662BB3C82C00BC6520 /* MP_LunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB642BB3C82C00BC6520 /* MP_LunchViewController.swift */; }; + CBCAFB672BB3C82C00BC6520 /* MP_LunchViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCAFB652BB3C82C00BC6520 /* MP_LunchViewController.xib */; }; + CBCAFB692BB3CAC400BC6520 /* MP_Lunch_ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCAFB682BB3CAC400BC6520 /* MP_Lunch_ProgressView.swift */; }; + CBCB321A2BD7578500802900 /* MP_LocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB32192BD7578500802900 /* MP_LocationManager.swift */; }; + CBCB35212BD7ACE900802900 /* MPPositive_JsonBrowse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB34DA2BD7ACE900802900 /* MPPositive_JsonBrowse.swift */; }; + CBCB4F982BD11054009760B3 /* MP_BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4F972BD11054009760B3 /* MP_BaseViewController.swift */; }; + CBCB4F9A2BD11089009760B3 /* MP_NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4F992BD11089009760B3 /* MP_NavigationController.swift */; }; + CBCB4FE92BD11402009760B3 /* MPSideA_LoadDataMusic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4F9D2BD11402009760B3 /* MPSideA_LoadDataMusic.swift */; }; + CBCB4FEA2BD11402009760B3 /* MPSideA_MusicModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4F9F2BD11402009760B3 /* MPSideA_MusicModel.swift */; }; + CBCB4FEB2BD11402009760B3 /* MPSideA_MusicViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FA12BD11402009760B3 /* MPSideA_MusicViewModel.swift */; }; + CBCB4FEC2BD11402009760B3 /* MPSideA_AddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FA42BD11402009760B3 /* MPSideA_AddViewController.swift */; }; + CBCB4FED2BD11402009760B3 /* MPSideA_AddViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FA52BD11402009760B3 /* MPSideA_AddViewController.xib */; }; + CBCB4FEE2BD11402009760B3 /* MPSideA_BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FA72BD11402009760B3 /* MPSideA_BaseViewController.swift */; }; + CBCB4FEF2BD11402009760B3 /* MPSideA_NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FA82BD11402009760B3 /* MPSideA_NavigationController.swift */; }; + CBCB4FF02BD11402009760B3 /* MPSideA_PresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FA92BD11402009760B3 /* MPSideA_PresentationController.swift */; }; + CBCB4FF12BD11402009760B3 /* MPSideA_TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FAA2BD11402009760B3 /* MPSideA_TabBarController.swift */; }; + CBCB4FF22BD11402009760B3 /* MPSideA_AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FAC2BD11402009760B3 /* MPSideA_AboutViewController.swift */; }; + CBCB4FF32BD11402009760B3 /* MPSideA_AboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FAD2BD11402009760B3 /* MPSideA_AboutViewController.xib */; }; + CBCB4FF42BD11402009760B3 /* MPSideA_CenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FAE2BD11402009760B3 /* MPSideA_CenterViewController.swift */; }; + CBCB4FF52BD11402009760B3 /* MPSideA_CenterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FAF2BD11402009760B3 /* MPSideA_CenterViewController.xib */; }; + CBCB4FF62BD11402009760B3 /* MPSideA_DeleteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FB02BD11402009760B3 /* MPSideA_DeleteViewController.swift */; }; + CBCB4FF72BD11402009760B3 /* MPSideA_DeleteViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FB12BD11402009760B3 /* MPSideA_DeleteViewController.xib */; }; + CBCB4FF82BD11402009760B3 /* MPSideA_MoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FB22BD11402009760B3 /* MPSideA_MoreViewController.swift */; }; + CBCB4FF92BD11402009760B3 /* MPSideA_MoreViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FB32BD11402009760B3 /* MPSideA_MoreViewController.xib */; }; + CBCB4FFA2BD11402009760B3 /* MPSideA_PrivacyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FB42BD11402009760B3 /* MPSideA_PrivacyViewController.swift */; }; + CBCB4FFB2BD11402009760B3 /* MPSideA_PrivacyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FB52BD11402009760B3 /* MPSideA_PrivacyViewController.xib */; }; + CBCB4FFC2BD11402009760B3 /* MPSideA_RenameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FB62BD11402009760B3 /* MPSideA_RenameViewController.swift */; }; + CBCB4FFD2BD11402009760B3 /* MPSideA_RenameViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FB72BD11402009760B3 /* MPSideA_RenameViewController.xib */; }; + CBCB4FFE2BD11402009760B3 /* MPSideA_ServiceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FB82BD11402009760B3 /* MPSideA_ServiceViewController.swift */; }; + CBCB4FFF2BD11402009760B3 /* MPSideA_ServiceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FB92BD11402009760B3 /* MPSideA_ServiceViewController.xib */; }; + CBCB50002BD11402009760B3 /* MPSideA_SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FBA2BD11402009760B3 /* MPSideA_SettingViewController.swift */; }; + CBCB50012BD11402009760B3 /* MPSideA_SettingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FBB2BD11402009760B3 /* MPSideA_SettingViewController.xib */; }; + CBCB50022BD11402009760B3 /* MPSideA_CountTimerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FBD2BD11402009760B3 /* MPSideA_CountTimerViewController.swift */; }; + CBCB50032BD11402009760B3 /* MPSideA_CountTimerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FBE2BD11402009760B3 /* MPSideA_CountTimerViewController.xib */; }; + CBCB50042BD11402009760B3 /* MPSideA_HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FBF2BD11402009760B3 /* MPSideA_HomeViewController.swift */; }; + CBCB50052BD11402009760B3 /* MPSideA_HomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FC02BD11402009760B3 /* MPSideA_HomeViewController.xib */; }; + CBCB50062BD11402009760B3 /* MPSideA_PlayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FC12BD11402009760B3 /* MPSideA_PlayerViewController.swift */; }; + CBCB50072BD11402009760B3 /* MPSideA_PlayerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FC22BD11402009760B3 /* MPSideA_PlayerViewController.xib */; }; + CBCB50082BD11402009760B3 /* MPSideA_BottomShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FC72BD11402009760B3 /* MPSideA_BottomShowView.swift */; }; + CBCB50092BD11402009760B3 /* MPSideA_BottomShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FC82BD11402009760B3 /* MPSideA_BottomShowView.xib */; }; + CBCB500A2BD11402009760B3 /* MPSideA_CustomTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FC92BD11402009760B3 /* MPSideA_CustomTabBar.swift */; }; + CBCB500B2BD11402009760B3 /* MPSideA_CustomTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FCA2BD11402009760B3 /* MPSideA_CustomTabBarItem.swift */; }; + CBCB500C2BD11402009760B3 /* MPSideA_CustomTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FCB2BD11402009760B3 /* MPSideA_CustomTabBarView.swift */; }; + CBCB500D2BD11402009760B3 /* MPSideA_CustomTabBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FCC2BD11402009760B3 /* MPSideA_CustomTabBarView.xib */; }; + CBCB500E2BD11402009760B3 /* MPSideA_CenterTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FCE2BD11402009760B3 /* MPSideA_CenterTableViewCell.swift */; }; + CBCB500F2BD11402009760B3 /* MPSideA_CenterTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FCF2BD11402009760B3 /* MPSideA_CenterTableViewCell.xib */; }; + CBCB50102BD11402009760B3 /* MPSideA_SettingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FD02BD11402009760B3 /* MPSideA_SettingTableViewCell.swift */; }; + CBCB50112BD11402009760B3 /* MPSideA_SettingTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FD12BD11402009760B3 /* MPSideA_SettingTableViewCell.xib */; }; + CBCB50122BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FD32BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.swift */; }; + CBCB50132BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FD42BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.xib */; }; + CBCB50142BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FD52BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.swift */; }; + CBCB50152BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FD62BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.xib */; }; + CBCB50162BD11402009760B3 /* MPSideA_Home_HeadBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FD72BD11402009760B3 /* MPSideA_Home_HeadBannerView.swift */; }; + CBCB50172BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FD82BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.swift */; }; + CBCB50182BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FD92BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.xib */; }; + CBCB50192BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FDA2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.swift */; }; + CBCB501A2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBCB4FDB2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.xib */; }; + CBCB501B2BD11402009760B3 /* MPSideA_PlayerActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB4FDC2BD11402009760B3 /* MPSideA_PlayerActionView.swift */; }; + CBCB50252BD118D8009760B3 /* MPPositive_BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCB50242BD118D8009760B3 /* MPPositive_BaseViewController.swift */; }; + CBCC234F2BEE57AC004D7A57 /* MPPositive_PresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCC234E2BEE57AC004D7A57 /* MPPositive_PresentationController.swift */; }; + CBCC23512BEE58C1004D7A57 /* MPPositive_PlayerListShowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCC23502BEE58C1004D7A57 /* MPPositive_PlayerListShowViewController.swift */; }; + CBCC23532BEE596E004D7A57 /* MPPositive_PlayerListShowTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBCC23522BEE596E004D7A57 /* MPPositive_PlayerListShowTableViewCell.swift */; }; + CBD0CC592BDA238100C4B64D /* MPPositive_BrowseLoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD0CC582BDA238100C4B64D /* MPPositive_BrowseLoadViewModel.swift */; }; + CBD0CC5E2BDA260500C4B64D /* MPPositive_BrowseItemViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD0CC5D2BDA260500C4B64D /* MPPositive_BrowseItemViewModel.swift */; }; + CBD313532BD60CD80015D227 /* MPPositive_HomeShowTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD313522BD60CD80015D227 /* MPPositive_HomeShowTableViewCell.swift */; }; + CBD313552BD636150015D227 /* MPPositive_HomeListFirstCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD313542BD636150015D227 /* MPPositive_HomeListFirstCollectionViewCell.swift */; }; + CBD313572BD63B390015D227 /* MPPositive_HomeListSecondCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD313562BD63B390015D227 /* MPPositive_HomeListSecondCollectionViewCell.swift */; }; + CBD313592BD63DDB0015D227 /* MPPositive_HomeListThirdCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD313582BD63DDB0015D227 /* MPPositive_HomeListThirdCollectionViewCell.swift */; }; + CBD3135F2BD642D90015D227 /* MPPositive_HomeListFourthCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD3135E2BD642D90015D227 /* MPPositive_HomeListFourthCollectionViewCell.swift */; }; + CBD313612BD6453A0015D227 /* MPPositive_HomeListFifthCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD313602BD6453A0015D227 /* MPPositive_HomeListFifthCollectionViewCell.swift */; }; CBD5AEE12BBBE45300BF5A43 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD5AEE02BBBE45300BF5A43 /* ImagePicker.swift */; }; - CBD958D22BB6600500666B0D /* Player_Slider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD958D12BB6600500666B0D /* Player_Slider.swift */; }; - CBD958D42BB6942F00666B0D /* MPVolumeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD958D32BB6942F00666B0D /* MPVolumeManager.swift */; }; - CBE2C4C72BC783F700F283A7 /* MPHUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE2C4C62BC783F700F283A7 /* MPHUD.swift */; }; + CBD958D22BB6600500666B0D /* MP_PlayerSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD958D12BB6600500666B0D /* MP_PlayerSlider.swift */; }; + CBD958D42BB6942F00666B0D /* MPSideA_VolumeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD958D32BB6942F00666B0D /* MPSideA_VolumeManager.swift */; }; + CBDD516D2BEC6AFE000F12C5 /* MPPositive_JsonNext.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDD516C2BEC6AFE000F12C5 /* MPPositive_JsonNext.swift */; }; + CBDD516F2BECBA6E000F12C5 /* MPPositive_PlayerLoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDD516E2BECBA6E000F12C5 /* MPPositive_PlayerLoadViewModel.swift */; }; + CBE1CB442BDDEAAD00701D57 /* MPPositive_MoreContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB432BDDEAAD00701D57 /* MPPositive_MoreContentViewController.swift */; }; + CBE1CB4A2BDDEBF000701D57 /* MPPositive_MoreListContentCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB492BDDEBF000701D57 /* MPPositive_MoreListContentCollectionViewCell.swift */; }; + CBE1CB4C2BDE440E00701D57 /* MPPositive_ListHeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB4B2BDE440E00701D57 /* MPPositive_ListHeaderModel.swift */; }; + CBE1CB4E2BDE4BD800701D57 /* MPPositive_ListAlbumListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB4D2BDE4BD800701D57 /* MPPositive_ListAlbumListViewModel.swift */; }; + CBE1CB502BDE4CC500701D57 /* MPPositive_ListHeaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB4F2BDE4CC500701D57 /* MPPositive_ListHeaderViewModel.swift */; }; + CBE1CB522BDE4F6C00701D57 /* MPPositive_JsonListAlbum.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB512BDE4F6C00701D57 /* MPPositive_JsonListAlbum.swift */; }; + CBE1CB582BDE550800701D57 /* MPPositive_ListShowViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE1CB572BDE550800701D57 /* MPPositive_ListShowViewController.swift */; }; + CBE2C4C72BC783F700F283A7 /* MP_HUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE2C4C62BC783F700F283A7 /* MP_HUD.swift */; }; CBE2C4C92BC7B25800F283A7 /* TableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE2C4C82BC7B25800F283A7 /* TableView.swift */; }; - CBE2C4CB2BC7BE5D00F283A7 /* MPNetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE2C4CA2BC7BE5D00F283A7 /* MPNetWorkManager.swift */; }; + CBE2C4CB2BC7BE5D00F283A7 /* MP_NetWorkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE2C4CA2BC7BE5D00F283A7 /* MP_NetWorkManager.swift */; }; CBE477B12BB16CCC0031C14B /* Macro.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE477B02BB16CCC0031C14B /* Macro.swift */; }; - CBF13CB52BC395810025654F /* MPCustomTabBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBF13CB42BC395810025654F /* MPCustomTabBarView.xib */; }; + CBEE8E322BEB0FC0007DA798 /* MPPositive_PlayerCoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE8E312BEB0FC0007DA798 /* MPPositive_PlayerCoverView.swift */; }; + CBEE8E342BEB16BB007DA798 /* MPPositive_PlayerSilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE8E332BEB16BB007DA798 /* MPPositive_PlayerSilder.swift */; }; + CBEE8E362BEB2604007DA798 /* MPPositive_PlayerLyricView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE8E352BEB2604007DA798 /* MPPositive_PlayerLyricView.swift */; }; + CBEE8E382BEB92CC007DA798 /* MPPositive_SongViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBEE8E372BEB92CC007DA798 /* MPPositive_SongViewModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -115,30 +162,28 @@ 0096623D2BB14A5B00FCA65F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 411725AB000C22E50EBD70BA /* Pods_MusicPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MusicPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 531FB1850BFB3FBADB172069 /* Pods-MusicPlayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicPlayer.debug.xcconfig"; path = "Target Support Files/Pods-MusicPlayer/Pods-MusicPlayer.debug.xcconfig"; sourceTree = ""; }; - CB0FBB7D2BC69616006290D4 /* PrivacyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewController.swift; sourceTree = ""; }; - CB0FBB7E2BC69616006290D4 /* PrivacyViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PrivacyViewController.xib; sourceTree = ""; }; - CB0FBB812BC6986E006290D4 /* ServiceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceViewController.swift; sourceTree = ""; }; - CB0FBB822BC6986E006290D4 /* ServiceViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ServiceViewController.xib; sourceTree = ""; }; - CB1181442BC66E7C00586030 /* PlayerActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerActionView.swift; sourceTree = ""; }; - CB1181462BC6874D00586030 /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = ""; }; - CB1181472BC6874D00586030 /* SettingViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingViewController.xib; sourceTree = ""; }; - CB11814A2BC68B0500586030 /* SettingTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingTableViewCell.swift; sourceTree = ""; }; - CB11814B2BC68B0500586030 /* SettingTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SettingTableViewCell.xib; sourceTree = ""; }; - CB11814E2BC68DD800586030 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; - CB11814F2BC68DD800586030 /* AboutViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AboutViewController.xib; sourceTree = ""; }; - CB1C16512BC80BF100B96AB3 /* MPMediaCenterManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPMediaCenterManager.swift; sourceTree = ""; }; - CB7B778D2BB50B1300C34894 /* CountTimerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountTimerViewController.swift; sourceTree = ""; }; - CB7B778E2BB50B1300C34894 /* CountTimerViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CountTimerViewController.xib; sourceTree = ""; }; - CB7B77932BB55A4500C34894 /* PlayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerViewController.swift; sourceTree = ""; }; - CB7B77942BB55A4500C34894 /* PlayerViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PlayerViewController.xib; sourceTree = ""; }; - CBAD14AA2BC3E1C3001430F9 /* MPBottomShowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPBottomShowView.swift; sourceTree = ""; }; - CBAD14AC2BC3E201001430F9 /* MPBottomShowView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPBottomShowView.xib; sourceTree = ""; }; - CBBFA9122BBA71CF00057FD5 /* MusicModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicModel.swift; sourceTree = ""; }; - CBBFA9172BBA83BA00057FD5 /* MPCoreDataHandlerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPCoreDataHandlerManager.swift; sourceTree = ""; }; + CB0918902BD255EA006D2B39 /* MPPositive_NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_NavigationController.swift; sourceTree = ""; }; + CB0918962BD25D8C006D2B39 /* MPPositive_TabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_TabBarController.swift; sourceTree = ""; }; + CB0918982BD25DCC006D2B39 /* MPPositive_CustomTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomTabBar.swift; sourceTree = ""; }; + CB09189A2BD25F50006D2B39 /* MPPositive_CustomTabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomTabBarView.swift; sourceTree = ""; }; + CB09189C2BD25F63006D2B39 /* MPPositive_CustomTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomTabBarItem.swift; sourceTree = ""; }; + CB09189E2BD26AFC006D2B39 /* MPPositive_HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeViewController.swift; sourceTree = ""; }; + CB0918A02BD26B0A006D2B39 /* MPPositive_SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_SearchViewController.swift; sourceTree = ""; }; + CB0918A22BD26B2F006D2B39 /* MPPositive_LibraryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_LibraryViewController.swift; sourceTree = ""; }; + CB0918A42BD26E16006D2B39 /* MPPositive_BottomShowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BottomShowView.swift; sourceTree = ""; }; + CB1C16512BC80BF100B96AB3 /* MPSideA_MediaCenterManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPSideA_MediaCenterManager.swift; sourceTree = ""; }; + CB5661282BE09D0500CFD014 /* MPPositive_JsonPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonPlayer.swift; sourceTree = ""; }; + CB56612C2BE0DF8C00CFD014 /* MP_WebWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_WebWork.swift; sourceTree = ""; }; + CBB5D31C2BDF4E9600CC333D /* MPPositive_MusicItemShowTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_MusicItemShowTableViewCell.swift; sourceTree = ""; }; + CBB5D31E2BDF711600CC333D /* MPPositive_SongItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_SongItemModel.swift; sourceTree = ""; }; + CBB5D3212BDF80C800CC333D /* MPPositive_PlayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerViewController.swift; sourceTree = ""; }; + CBB9F9DC2BEDCFEE008338DE /* MPPositive_JsonLyrics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonLyrics.swift; sourceTree = ""; }; + CBB9F9DE2BEDDCC5008338DE /* MP_PlayerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_PlayerManager.swift; sourceTree = ""; }; + CBBFA9172BBA83BA00057FD5 /* MP_CoreDataHandlerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_CoreDataHandlerManager.swift; sourceTree = ""; }; CBBFA9192BBA846600057FD5 /* CoreDataDelegete.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataDelegete.swift; sourceTree = ""; }; CBBFA91D2BBA9B5C00057FD5 /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = ""; }; - CBBFA91F2BBAB88500057FD5 /* MusicViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicViewModel.swift; sourceTree = ""; }; - CBBFA9212BBAB8FD00057FD5 /* LoadDataMusic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadDataMusic.swift; sourceTree = ""; }; + CBC32A522BD8D9F300687171 /* MPPositive_BrowseItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BrowseItemModel.swift; sourceTree = ""; }; + CBC32A542BD8DFB900687171 /* MPPositive_BrowseModuleListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BrowseModuleListViewModel.swift; sourceTree = ""; }; CBC54E442BC4D5D3003B1901 /* Breathe.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Breathe.mp3; sourceTree = ""; }; CBC54E452BC4D5D3003B1901 /* Shhh….mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "Shhh….mp3"; sourceTree = ""; }; CBC54E462BC4D5D3003B1901 /* Shh Shh.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "Shh Shh.mp3"; sourceTree = ""; }; @@ -156,53 +201,102 @@ CBC54E542BC4D5D3003B1901 /* Seawater Surging.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "Seawater Surging.mp3"; sourceTree = ""; }; CBC54E552BC4D5D3003B1901 /* Summer Insects.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "Summer Insects.mp3"; sourceTree = ""; }; CBC54E662BC4D90F003B1901 /* Resource.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Resource.plist; sourceTree = ""; }; - CBC6873C2BC24FFF0023ECA6 /* MoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreViewController.swift; sourceTree = ""; }; - CBC6873D2BC24FFF0023ECA6 /* MoreViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MoreViewController.xib; sourceTree = ""; }; - CBC687402BC2788D0023ECA6 /* RenameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenameViewController.swift; sourceTree = ""; }; - CBC687412BC2788D0023ECA6 /* RenameViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RenameViewController.xib; sourceTree = ""; }; - CBC687442BC27AE70023ECA6 /* DeleteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteViewController.swift; sourceTree = ""; }; - CBC687452BC27AE70023ECA6 /* DeleteViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeleteViewController.xib; sourceTree = ""; }; CBC687482BC2882B0023ECA6 /* MPTableManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPTableManager.swift; sourceTree = ""; }; CBC6874A2BC2B0710023ECA6 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; CBCAFB592BB3C2A000BC6520 /* LayoutConstraint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutConstraint.swift; sourceTree = ""; }; CBCAFB5C2BB3C52100BC6520 /* HexColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexColor.swift; sourceTree = ""; }; CBCAFB5E2BB3C55500BC6520 /* DateTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTime.swift; sourceTree = ""; }; CBCAFB602BB3C59500BC6520 /* InstanceFromNib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceFromNib.swift; sourceTree = ""; }; - CBCAFB622BB3C67A00BC6520 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; - CBCAFB642BB3C82C00BC6520 /* LunchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LunchViewController.swift; sourceTree = ""; }; - CBCAFB652BB3C82C00BC6520 /* LunchViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LunchViewController.xib; sourceTree = ""; }; - CBCAFB682BB3CAC400BC6520 /* Lunch_ProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lunch_ProgressView.swift; sourceTree = ""; }; - CBCAFB6A2BB3EB4500BC6520 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; - CBCAFB6B2BB3EB4500BC6520 /* HomeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeViewController.xib; sourceTree = ""; }; - CBCAFB6E2BB3EB7000BC6520 /* MPNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPNavigationController.swift; sourceTree = ""; }; - CBCAFB702BB3EB9100BC6520 /* MPTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPTabBarController.swift; sourceTree = ""; }; - CBCAFB722BB3EDAE00BC6520 /* MPCustomTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPCustomTabBar.swift; sourceTree = ""; }; - CBCAFB742BB3EDCD00BC6520 /* MPCustomTabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPCustomTabBarView.swift; sourceTree = ""; }; - CBCAFB762BB3EE4800BC6520 /* MPCustomTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPCustomTabBarItem.swift; sourceTree = ""; }; - CBCAFB7A2BB3F98800BC6520 /* AddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddViewController.swift; sourceTree = ""; }; - CBCAFB7B2BB3F98800BC6520 /* AddViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AddViewController.xib; sourceTree = ""; }; - CBCAFB7E2BB3F99300BC6520 /* CenterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterViewController.swift; sourceTree = ""; }; - CBCAFB7F2BB3F99300BC6520 /* CenterViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CenterViewController.xib; sourceTree = ""; }; - CBCAFB822BB40C1000BC6520 /* Home_HeadBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_HeadBannerView.swift; sourceTree = ""; }; - CBCAFB842BB40ED800BC6520 /* Home_RowListsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_RowListsTableViewCell.swift; sourceTree = ""; }; - CBCAFB852BB40ED800BC6520 /* Home_RowListsTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Home_RowListsTableViewCell.xib; sourceTree = ""; }; - CBCAFB882BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_FirstListCollectionViewCell.swift; sourceTree = ""; }; - CBCAFB892BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Home_FirstListCollectionViewCell.xib; sourceTree = ""; }; - CBCAFB8C2BB4170000BC6520 /* Home_SecondListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_SecondListCollectionViewCell.swift; sourceTree = ""; }; - CBCAFB8D2BB4170000BC6520 /* Home_SecondListCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Home_SecondListCollectionViewCell.xib; sourceTree = ""; }; - CBCAFB902BB4185700BC6520 /* Home_FourthListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Home_FourthListCollectionViewCell.swift; sourceTree = ""; }; - CBCAFB912BB4185700BC6520 /* Home_FourthListCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Home_FourthListCollectionViewCell.xib; sourceTree = ""; }; - CBCAFB982BB4309C00BC6520 /* MPPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPresentationController.swift; sourceTree = ""; }; - CBD5AEDC2BBBA7B600BF5A43 /* CenterTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTableViewCell.swift; sourceTree = ""; }; - CBD5AEDD2BBBA7B600BF5A43 /* CenterTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CenterTableViewCell.xib; sourceTree = ""; }; + CBCAFB642BB3C82C00BC6520 /* MP_LunchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_LunchViewController.swift; sourceTree = ""; }; + CBCAFB652BB3C82C00BC6520 /* MP_LunchViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_LunchViewController.xib; sourceTree = ""; }; + CBCAFB682BB3CAC400BC6520 /* MP_Lunch_ProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_Lunch_ProgressView.swift; sourceTree = ""; }; + CBCB32192BD7578500802900 /* MP_LocationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_LocationManager.swift; sourceTree = ""; }; + CBCB34DA2BD7ACE900802900 /* MPPositive_JsonBrowse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonBrowse.swift; sourceTree = ""; }; + CBCB4F972BD11054009760B3 /* MP_BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_BaseViewController.swift; sourceTree = ""; }; + CBCB4F992BD11089009760B3 /* MP_NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_NavigationController.swift; sourceTree = ""; }; + CBCB4F9D2BD11402009760B3 /* MPSideA_LoadDataMusic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_LoadDataMusic.swift; sourceTree = ""; }; + CBCB4F9F2BD11402009760B3 /* MPSideA_MusicModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_MusicModel.swift; sourceTree = ""; }; + CBCB4FA12BD11402009760B3 /* MPSideA_MusicViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_MusicViewModel.swift; sourceTree = ""; }; + CBCB4FA42BD11402009760B3 /* MPSideA_AddViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_AddViewController.swift; sourceTree = ""; }; + CBCB4FA52BD11402009760B3 /* MPSideA_AddViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_AddViewController.xib; sourceTree = ""; }; + CBCB4FA72BD11402009760B3 /* MPSideA_BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_BaseViewController.swift; sourceTree = ""; }; + CBCB4FA82BD11402009760B3 /* MPSideA_NavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_NavigationController.swift; sourceTree = ""; }; + CBCB4FA92BD11402009760B3 /* MPSideA_PresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_PresentationController.swift; sourceTree = ""; }; + CBCB4FAA2BD11402009760B3 /* MPSideA_TabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_TabBarController.swift; sourceTree = ""; }; + CBCB4FAC2BD11402009760B3 /* MPSideA_AboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_AboutViewController.swift; sourceTree = ""; }; + CBCB4FAD2BD11402009760B3 /* MPSideA_AboutViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_AboutViewController.xib; sourceTree = ""; }; + CBCB4FAE2BD11402009760B3 /* MPSideA_CenterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CenterViewController.swift; sourceTree = ""; }; + CBCB4FAF2BD11402009760B3 /* MPSideA_CenterViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_CenterViewController.xib; sourceTree = ""; }; + CBCB4FB02BD11402009760B3 /* MPSideA_DeleteViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_DeleteViewController.swift; sourceTree = ""; }; + CBCB4FB12BD11402009760B3 /* MPSideA_DeleteViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_DeleteViewController.xib; sourceTree = ""; }; + CBCB4FB22BD11402009760B3 /* MPSideA_MoreViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_MoreViewController.swift; sourceTree = ""; }; + CBCB4FB32BD11402009760B3 /* MPSideA_MoreViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_MoreViewController.xib; sourceTree = ""; }; + CBCB4FB42BD11402009760B3 /* MPSideA_PrivacyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_PrivacyViewController.swift; sourceTree = ""; }; + CBCB4FB52BD11402009760B3 /* MPSideA_PrivacyViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_PrivacyViewController.xib; sourceTree = ""; }; + CBCB4FB62BD11402009760B3 /* MPSideA_RenameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_RenameViewController.swift; sourceTree = ""; }; + CBCB4FB72BD11402009760B3 /* MPSideA_RenameViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_RenameViewController.xib; sourceTree = ""; }; + CBCB4FB82BD11402009760B3 /* MPSideA_ServiceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_ServiceViewController.swift; sourceTree = ""; }; + CBCB4FB92BD11402009760B3 /* MPSideA_ServiceViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_ServiceViewController.xib; sourceTree = ""; }; + CBCB4FBA2BD11402009760B3 /* MPSideA_SettingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_SettingViewController.swift; sourceTree = ""; }; + CBCB4FBB2BD11402009760B3 /* MPSideA_SettingViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_SettingViewController.xib; sourceTree = ""; }; + CBCB4FBD2BD11402009760B3 /* MPSideA_CountTimerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CountTimerViewController.swift; sourceTree = ""; }; + CBCB4FBE2BD11402009760B3 /* MPSideA_CountTimerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_CountTimerViewController.xib; sourceTree = ""; }; + CBCB4FBF2BD11402009760B3 /* MPSideA_HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_HomeViewController.swift; sourceTree = ""; }; + CBCB4FC02BD11402009760B3 /* MPSideA_HomeViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_HomeViewController.xib; sourceTree = ""; }; + CBCB4FC12BD11402009760B3 /* MPSideA_PlayerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_PlayerViewController.swift; sourceTree = ""; }; + CBCB4FC22BD11402009760B3 /* MPSideA_PlayerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_PlayerViewController.xib; sourceTree = ""; }; + CBCB4FC72BD11402009760B3 /* MPSideA_BottomShowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_BottomShowView.swift; sourceTree = ""; }; + CBCB4FC82BD11402009760B3 /* MPSideA_BottomShowView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_BottomShowView.xib; sourceTree = ""; }; + CBCB4FC92BD11402009760B3 /* MPSideA_CustomTabBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CustomTabBar.swift; sourceTree = ""; }; + CBCB4FCA2BD11402009760B3 /* MPSideA_CustomTabBarItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CustomTabBarItem.swift; sourceTree = ""; }; + CBCB4FCB2BD11402009760B3 /* MPSideA_CustomTabBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CustomTabBarView.swift; sourceTree = ""; }; + CBCB4FCC2BD11402009760B3 /* MPSideA_CustomTabBarView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_CustomTabBarView.xib; sourceTree = ""; }; + CBCB4FCE2BD11402009760B3 /* MPSideA_CenterTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_CenterTableViewCell.swift; sourceTree = ""; }; + CBCB4FCF2BD11402009760B3 /* MPSideA_CenterTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_CenterTableViewCell.xib; sourceTree = ""; }; + CBCB4FD02BD11402009760B3 /* MPSideA_SettingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_SettingTableViewCell.swift; sourceTree = ""; }; + CBCB4FD12BD11402009760B3 /* MPSideA_SettingTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_SettingTableViewCell.xib; sourceTree = ""; }; + CBCB4FD32BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_Home_FirstListCollectionViewCell.swift; sourceTree = ""; }; + CBCB4FD42BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_Home_FirstListCollectionViewCell.xib; sourceTree = ""; }; + CBCB4FD52BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_Home_FourthListCollectionViewCell.swift; sourceTree = ""; }; + CBCB4FD62BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_Home_FourthListCollectionViewCell.xib; sourceTree = ""; }; + CBCB4FD72BD11402009760B3 /* MPSideA_Home_HeadBannerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_Home_HeadBannerView.swift; sourceTree = ""; }; + CBCB4FD82BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_Home_RowListsTableViewCell.swift; sourceTree = ""; }; + CBCB4FD92BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_Home_RowListsTableViewCell.xib; sourceTree = ""; }; + CBCB4FDA2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_Home_SecondListCollectionViewCell.swift; sourceTree = ""; }; + CBCB4FDB2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPSideA_Home_SecondListCollectionViewCell.xib; sourceTree = ""; }; + CBCB4FDC2BD11402009760B3 /* MPSideA_PlayerActionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_PlayerActionView.swift; sourceTree = ""; }; + CBCB50242BD118D8009760B3 /* MPPositive_BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BaseViewController.swift; sourceTree = ""; }; + CBCC234E2BEE57AC004D7A57 /* MPPositive_PresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PresentationController.swift; sourceTree = ""; }; + CBCC23502BEE58C1004D7A57 /* MPPositive_PlayerListShowViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerListShowViewController.swift; sourceTree = ""; }; + CBCC23522BEE596E004D7A57 /* MPPositive_PlayerListShowTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerListShowTableViewCell.swift; sourceTree = ""; }; + CBD0CC582BDA238100C4B64D /* MPPositive_BrowseLoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BrowseLoadViewModel.swift; sourceTree = ""; }; + CBD0CC5D2BDA260500C4B64D /* MPPositive_BrowseItemViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BrowseItemViewModel.swift; sourceTree = ""; }; + CBD313522BD60CD80015D227 /* MPPositive_HomeShowTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeShowTableViewCell.swift; sourceTree = ""; }; + CBD313542BD636150015D227 /* MPPositive_HomeListFirstCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeListFirstCollectionViewCell.swift; sourceTree = ""; }; + CBD313562BD63B390015D227 /* MPPositive_HomeListSecondCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeListSecondCollectionViewCell.swift; sourceTree = ""; }; + CBD313582BD63DDB0015D227 /* MPPositive_HomeListThirdCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeListThirdCollectionViewCell.swift; sourceTree = ""; }; + CBD3135E2BD642D90015D227 /* MPPositive_HomeListFourthCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeListFourthCollectionViewCell.swift; sourceTree = ""; }; + CBD313602BD6453A0015D227 /* MPPositive_HomeListFifthCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_HomeListFifthCollectionViewCell.swift; sourceTree = ""; }; CBD5AEE02BBBE45300BF5A43 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; - CBD958D12BB6600500666B0D /* Player_Slider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Player_Slider.swift; sourceTree = ""; }; - CBD958D32BB6942F00666B0D /* MPVolumeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPVolumeManager.swift; sourceTree = ""; }; - CBE2C4C62BC783F700F283A7 /* MPHUD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPHUD.swift; sourceTree = ""; }; + CBD958D12BB6600500666B0D /* MP_PlayerSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_PlayerSlider.swift; sourceTree = ""; }; + CBD958D32BB6942F00666B0D /* MPSideA_VolumeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPSideA_VolumeManager.swift; sourceTree = ""; }; + CBDD516C2BEC6AFE000F12C5 /* MPPositive_JsonNext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonNext.swift; sourceTree = ""; }; + CBDD516E2BECBA6E000F12C5 /* MPPositive_PlayerLoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerLoadViewModel.swift; sourceTree = ""; }; + CBE1CB432BDDEAAD00701D57 /* MPPositive_MoreContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_MoreContentViewController.swift; sourceTree = ""; }; + CBE1CB492BDDEBF000701D57 /* MPPositive_MoreListContentCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_MoreListContentCollectionViewCell.swift; sourceTree = ""; }; + CBE1CB4B2BDE440E00701D57 /* MPPositive_ListHeaderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_ListHeaderModel.swift; sourceTree = ""; }; + CBE1CB4D2BDE4BD800701D57 /* MPPositive_ListAlbumListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_ListAlbumListViewModel.swift; sourceTree = ""; }; + CBE1CB4F2BDE4CC500701D57 /* MPPositive_ListHeaderViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_ListHeaderViewModel.swift; sourceTree = ""; }; + CBE1CB512BDE4F6C00701D57 /* MPPositive_JsonListAlbum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonListAlbum.swift; sourceTree = ""; }; + CBE1CB572BDE550800701D57 /* MPPositive_ListShowViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_ListShowViewController.swift; sourceTree = ""; }; + CBE2C4C62BC783F700F283A7 /* MP_HUD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_HUD.swift; sourceTree = ""; }; CBE2C4C82BC7B25800F283A7 /* TableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableView.swift; sourceTree = ""; }; - CBE2C4CA2BC7BE5D00F283A7 /* MPNetWorkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPNetWorkManager.swift; sourceTree = ""; }; + CBE2C4CA2BC7BE5D00F283A7 /* MP_NetWorkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_NetWorkManager.swift; sourceTree = ""; }; CBE477B02BB16CCC0031C14B /* Macro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Macro.swift; sourceTree = ""; }; - CBF13CB42BC395810025654F /* MPCustomTabBarView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPCustomTabBarView.xib; sourceTree = ""; }; + CBEE8E312BEB0FC0007DA798 /* MPPositive_PlayerCoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerCoverView.swift; sourceTree = ""; }; + CBEE8E332BEB16BB007DA798 /* MPPositive_PlayerSilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerSilder.swift; sourceTree = ""; }; + CBEE8E352BEB2604007DA798 /* MPPositive_PlayerLyricView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayerLyricView.swift; sourceTree = ""; }; + CBEE8E372BEB92CC007DA798 /* MPPositive_SongViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_SongViewModel.swift; sourceTree = ""; }; E2C6C85BFD4CD80DBA96D149 /* Pods-MusicPlayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MusicPlayer.release.xcconfig"; path = "Target Support Files/Pods-MusicPlayer/Pods-MusicPlayer.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -267,21 +361,15 @@ path = Pods; sourceTree = ""; }; - CBBFA90F2BBA719600057FD5 /* ViewModels */ = { + CBB5D3202BDF7DF100CC333D /* Player(播放器) */ = { isa = PBXGroup; children = ( - CBBFA91F2BBAB88500057FD5 /* MusicViewModel.swift */, + CBB5D3212BDF80C800CC333D /* MPPositive_PlayerViewController.swift */, + CBCC23502BEE58C1004D7A57 /* MPPositive_PlayerListShowViewController.swift */, ); - path = ViewModels; - sourceTree = ""; - }; - CBBFA9102BBA719600057FD5 /* Models */ = { - isa = PBXGroup; - children = ( - CBBFA9122BBA71CF00057FD5 /* MusicModel.swift */, - ); - path = Models; - sourceTree = ""; + name = "Player(播放器)"; + path = "MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)"; + sourceTree = SOURCE_ROOT; }; CBBFA9112BBA71AF00057FD5 /* DataBase */ = { isa = PBXGroup; @@ -289,7 +377,7 @@ 009662352BB14A5A00FCA65F /* MusicPlayer.xcdatamodeld */, ); name = DataBase; - path = MusicPlayer/MP/Models/DataBase; + path = MusicPlayer/MP/Common/DataBase; sourceTree = SOURCE_ROOT; }; CBBFA9142BBA81C400057FD5 /* Resource(资源) */ = { @@ -304,14 +392,6 @@ path = "MusicPlayer/MP/Common/Resource(资源)"; sourceTree = SOURCE_ROOT; }; - CBBFA9232BBABFCE00057FD5 /* Load */ = { - isa = PBXGroup; - children = ( - CBBFA9212BBAB8FD00057FD5 /* LoadDataMusic.swift */, - ); - path = Load; - sourceTree = ""; - }; CBC54E432BC4D5D3003B1901 /* Real human voice */ = { isa = PBXGroup; children = ( @@ -359,205 +439,414 @@ path = "MusicPlayer/MP/Common/Protocol(公用协议)"; sourceTree = SOURCE_ROOT; }; - CBCAFB782BB3F95300BC6520 /* Add(新增资源) */ = { + CBCB4F942BD10FB2009760B3 /* Base(公用基类) */ = { isa = PBXGroup; children = ( - CBCAFB7A2BB3F98800BC6520 /* AddViewController.swift */, - CBCAFB7B2BB3F98800BC6520 /* AddViewController.xib */, + CBCB4F952BD11040009760B3 /* Controllers */, + CBCB4F962BD11040009760B3 /* Views */, ); - name = "Add(新增资源)"; - path = "MusicPlayer/MP/ViewControllers/Add(新增资源)"; - sourceTree = SOURCE_ROOT; + path = "Base(公用基类)"; + sourceTree = ""; }; - CBCAFB792BB3F97500BC6520 /* Add(新增资源) */ = { + CBCB4F952BD11040009760B3 /* Controllers */ = { + isa = PBXGroup; + children = ( + CBCB4F972BD11054009760B3 /* MP_BaseViewController.swift */, + CBCB4F992BD11089009760B3 /* MP_NavigationController.swift */, + CBCAFB642BB3C82C00BC6520 /* MP_LunchViewController.swift */, + CBCAFB652BB3C82C00BC6520 /* MP_LunchViewController.xib */, + ); + path = Controllers; + sourceTree = ""; + }; + CBCB4F962BD11040009760B3 /* Views */ = { + isa = PBXGroup; + children = ( + CBCAFB682BB3CAC400BC6520 /* MP_Lunch_ProgressView.swift */, + ); + path = Views; + sourceTree = ""; + }; + CBCB4F9E2BD11402009760B3 /* Load */ = { + isa = PBXGroup; + children = ( + CBCB4F9D2BD11402009760B3 /* MPSideA_LoadDataMusic.swift */, + ); + path = Load; + sourceTree = ""; + }; + CBCB4FA02BD11402009760B3 /* Models */ = { + isa = PBXGroup; + children = ( + CBCB4F9F2BD11402009760B3 /* MPSideA_MusicModel.swift */, + ); + path = Models; + sourceTree = ""; + }; + CBCB4FA22BD11402009760B3 /* ViewModels */ = { + isa = PBXGroup; + children = ( + CBCB4FA12BD11402009760B3 /* MPSideA_MusicViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + CBCB4FA32BD11402009760B3 /* Models */ = { + isa = PBXGroup; + children = ( + CBCB4F9E2BD11402009760B3 /* Load */, + CBCB4FA22BD11402009760B3 /* ViewModels */, + CBCB4FA02BD11402009760B3 /* Models */, + ); + path = Models; + sourceTree = ""; + }; + CBCB4FA62BD11402009760B3 /* Add(新增资源) */ = { + isa = PBXGroup; + children = ( + CBCB4FA42BD11402009760B3 /* MPSideA_AddViewController.swift */, + CBCB4FA52BD11402009760B3 /* MPSideA_AddViewController.xib */, + ); + path = "Add(新增资源)"; + sourceTree = ""; + }; + CBCB4FAB2BD11402009760B3 /* Base(基类-导航栏-标签栏-计时器-播放器) */ = { + isa = PBXGroup; + children = ( + CBCB4FA72BD11402009760B3 /* MPSideA_BaseViewController.swift */, + CBCB4FA82BD11402009760B3 /* MPSideA_NavigationController.swift */, + CBCB4FA92BD11402009760B3 /* MPSideA_PresentationController.swift */, + CBCB4FAA2BD11402009760B3 /* MPSideA_TabBarController.swift */, + ); + path = "Base(基类-导航栏-标签栏-计时器-播放器)"; + sourceTree = ""; + }; + CBCB4FBC2BD11402009760B3 /* Center(个人资源) */ = { + isa = PBXGroup; + children = ( + CBCB4FAE2BD11402009760B3 /* MPSideA_CenterViewController.swift */, + CBCB4FAF2BD11402009760B3 /* MPSideA_CenterViewController.xib */, + CBCB4FAC2BD11402009760B3 /* MPSideA_AboutViewController.swift */, + CBCB4FAD2BD11402009760B3 /* MPSideA_AboutViewController.xib */, + CBCB4FB02BD11402009760B3 /* MPSideA_DeleteViewController.swift */, + CBCB4FB12BD11402009760B3 /* MPSideA_DeleteViewController.xib */, + CBCB4FB22BD11402009760B3 /* MPSideA_MoreViewController.swift */, + CBCB4FB32BD11402009760B3 /* MPSideA_MoreViewController.xib */, + CBCB4FB42BD11402009760B3 /* MPSideA_PrivacyViewController.swift */, + CBCB4FB52BD11402009760B3 /* MPSideA_PrivacyViewController.xib */, + CBCB4FB62BD11402009760B3 /* MPSideA_RenameViewController.swift */, + CBCB4FB72BD11402009760B3 /* MPSideA_RenameViewController.xib */, + CBCB4FB82BD11402009760B3 /* MPSideA_ServiceViewController.swift */, + CBCB4FB92BD11402009760B3 /* MPSideA_ServiceViewController.xib */, + CBCB4FBA2BD11402009760B3 /* MPSideA_SettingViewController.swift */, + CBCB4FBB2BD11402009760B3 /* MPSideA_SettingViewController.xib */, + ); + path = "Center(个人资源)"; + sourceTree = ""; + }; + CBCB4FC32BD11402009760B3 /* Home(音乐资源列表) */ = { + isa = PBXGroup; + children = ( + CBCB4FBF2BD11402009760B3 /* MPSideA_HomeViewController.swift */, + CBCB4FC02BD11402009760B3 /* MPSideA_HomeViewController.xib */, + CBCB4FBD2BD11402009760B3 /* MPSideA_CountTimerViewController.swift */, + CBCB4FBE2BD11402009760B3 /* MPSideA_CountTimerViewController.xib */, + CBCB4FC12BD11402009760B3 /* MPSideA_PlayerViewController.swift */, + CBCB4FC22BD11402009760B3 /* MPSideA_PlayerViewController.xib */, + ); + path = "Home(音乐资源列表)"; + sourceTree = ""; + }; + CBCB4FC52BD11402009760B3 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + CBCB4FAB2BD11402009760B3 /* Base(基类-导航栏-标签栏-计时器-播放器) */, + CBCB4FC32BD11402009760B3 /* Home(音乐资源列表) */, + CBCB4FA62BD11402009760B3 /* Add(新增资源) */, + CBCB4FBC2BD11402009760B3 /* Center(个人资源) */, + ); + path = ViewControllers; + sourceTree = ""; + }; + CBCB4FC62BD11402009760B3 /* Add(新增资源) */ = { isa = PBXGroup; children = ( ); - name = "Add(新增资源)"; - path = "MusicPlayer/MP/Views/Add(新增资源)"; - sourceTree = SOURCE_ROOT; + path = "Add(新增资源)"; + sourceTree = ""; + }; + CBCB4FCD2BD11402009760B3 /* Base(基类-导航栏-标签栏) */ = { + isa = PBXGroup; + children = ( + CBCB4FC92BD11402009760B3 /* MPSideA_CustomTabBar.swift */, + CBCB4FCA2BD11402009760B3 /* MPSideA_CustomTabBarItem.swift */, + CBCB4FCB2BD11402009760B3 /* MPSideA_CustomTabBarView.swift */, + CBCB4FCC2BD11402009760B3 /* MPSideA_CustomTabBarView.xib */, + CBCB4FC72BD11402009760B3 /* MPSideA_BottomShowView.swift */, + CBCB4FC82BD11402009760B3 /* MPSideA_BottomShowView.xib */, + ); + path = "Base(基类-导航栏-标签栏)"; + sourceTree = ""; + }; + CBCB4FD22BD11402009760B3 /* Center(个人资源) */ = { + isa = PBXGroup; + children = ( + CBCB4FCE2BD11402009760B3 /* MPSideA_CenterTableViewCell.swift */, + CBCB4FCF2BD11402009760B3 /* MPSideA_CenterTableViewCell.xib */, + CBCB4FD02BD11402009760B3 /* MPSideA_SettingTableViewCell.swift */, + CBCB4FD12BD11402009760B3 /* MPSideA_SettingTableViewCell.xib */, + ); + path = "Center(个人资源)"; + sourceTree = ""; + }; + CBCB4FDD2BD11402009760B3 /* Home(音乐资源列表-播放器) */ = { + isa = PBXGroup; + children = ( + CBCB4FD72BD11402009760B3 /* MPSideA_Home_HeadBannerView.swift */, + CBCB4FD82BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.swift */, + CBCB4FD92BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.xib */, + CBCB4FD32BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.swift */, + CBCB4FD42BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.xib */, + CBCB4FD52BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.swift */, + CBCB4FD62BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.xib */, + CBCB4FDA2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.swift */, + CBCB4FDB2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.xib */, + CBCB4FDC2BD11402009760B3 /* MPSideA_PlayerActionView.swift */, + ); + path = "Home(音乐资源列表-播放器)"; + sourceTree = ""; + }; + CBCB4FDF2BD11402009760B3 /* Views */ = { + isa = PBXGroup; + children = ( + CBCB4FCD2BD11402009760B3 /* Base(基类-导航栏-标签栏) */, + CBCB4FDD2BD11402009760B3 /* Home(音乐资源列表-播放器) */, + CBCB4FC62BD11402009760B3 /* Add(新增资源) */, + CBCB4FD22BD11402009760B3 /* Center(个人资源) */, + ); + path = Views; + sourceTree = ""; + }; + CBCB4FE02BD11402009760B3 /* MPSideA */ = { + isa = PBXGroup; + children = ( + CBCB4FC52BD11402009760B3 /* ViewControllers */, + CBCB4FDF2BD11402009760B3 /* Views */, + CBCB4FA32BD11402009760B3 /* Models */, + ); + path = MPSideA; + sourceTree = ""; + }; + CBCB4FE12BD11402009760B3 /* Models */ = { + isa = PBXGroup; + children = ( + CBC32A522BD8D9F300687171 /* MPPositive_BrowseItemModel.swift */, + CBE1CB4B2BDE440E00701D57 /* MPPositive_ListHeaderModel.swift */, + CBB5D31E2BDF711600CC333D /* MPPositive_SongItemModel.swift */, + ); + path = Models; + sourceTree = ""; + }; + CBCB4FE22BD11402009760B3 /* ListViewModels */ = { + isa = PBXGroup; + children = ( + CBC32A542BD8DFB900687171 /* MPPositive_BrowseModuleListViewModel.swift */, + CBD0CC5D2BDA260500C4B64D /* MPPositive_BrowseItemViewModel.swift */, + CBE1CB4D2BDE4BD800701D57 /* MPPositive_ListAlbumListViewModel.swift */, + CBE1CB4F2BDE4CC500701D57 /* MPPositive_ListHeaderViewModel.swift */, + CBEE8E372BEB92CC007DA798 /* MPPositive_SongViewModel.swift */, + ); + path = ListViewModels; + sourceTree = ""; + }; + CBCB4FE32BD11402009760B3 /* LoadViewModels */ = { + isa = PBXGroup; + children = ( + CBD0CC582BDA238100C4B64D /* MPPositive_BrowseLoadViewModel.swift */, + CBDD516E2BECBA6E000F12C5 /* MPPositive_PlayerLoadViewModel.swift */, + ); + path = LoadViewModels; + sourceTree = ""; + }; + CBCB4FE42BD11402009760B3 /* ViewModels */ = { + isa = PBXGroup; + children = ( + CBCB4FE32BD11402009760B3 /* LoadViewModels */, + CBCB4FE22BD11402009760B3 /* ListViewModels */, + ); + path = ViewModels; + sourceTree = ""; + }; + CBCB4FE52BD11402009760B3 /* Models */ = { + isa = PBXGroup; + children = ( + CBD0CC5C2BDA253800C4B64D /* JsonStructs */, + CBCB4FE42BD11402009760B3 /* ViewModels */, + CBCB4FE12BD11402009760B3 /* Models */, + ); + path = Models; + sourceTree = ""; + }; + CBCB4FE62BD11402009760B3 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + CBCB501D2BD118AA009760B3 /* Base(基类,导航栏,标签栏) */, + CBCB501C2BD118AA009760B3 /* Home(首页,各项列表页,播放器页) */, + CBB5D3202BDF7DF100CC333D /* Player(播放器) */, + CBCB501F2BD118AA009760B3 /* Search(搜索页) */, + CBCB501E2BD118AA009760B3 /* Center(个人曲库页) */, + ); + path = ViewControllers; + sourceTree = ""; + }; + CBCB4FE72BD11402009760B3 /* Views */ = { + isa = PBXGroup; + children = ( + CBCB50222BD118BB009760B3 /* Base */, + CBCB50232BD118BB009760B3 /* Home */, + CBEE8E302BEB0F87007DA798 /* Player */, + CBCB50212BD118BB009760B3 /* Search */, + CBCB50202BD118BB009760B3 /* Center */, + ); + path = Views; + sourceTree = ""; + }; + CBCB4FE82BD11402009760B3 /* MPPositive */ = { + isa = PBXGroup; + children = ( + CBCB4FE62BD11402009760B3 /* ViewControllers */, + CBCB4FE72BD11402009760B3 /* Views */, + CBCB4FE52BD11402009760B3 /* Models */, + ); + path = MPPositive; + sourceTree = ""; + }; + CBCB501C2BD118AA009760B3 /* Home(首页,各项列表页,播放器页) */ = { + isa = PBXGroup; + children = ( + CB09189E2BD26AFC006D2B39 /* MPPositive_HomeViewController.swift */, + CBE1CB432BDDEAAD00701D57 /* MPPositive_MoreContentViewController.swift */, + CBE1CB572BDE550800701D57 /* MPPositive_ListShowViewController.swift */, + ); + path = "Home(首页,各项列表页,播放器页)"; + sourceTree = ""; + }; + CBCB501D2BD118AA009760B3 /* Base(基类,导航栏,标签栏) */ = { + isa = PBXGroup; + children = ( + CBCB50242BD118D8009760B3 /* MPPositive_BaseViewController.swift */, + CB0918902BD255EA006D2B39 /* MPPositive_NavigationController.swift */, + CB0918962BD25D8C006D2B39 /* MPPositive_TabBarController.swift */, + CBCC234E2BEE57AC004D7A57 /* MPPositive_PresentationController.swift */, + ); + path = "Base(基类,导航栏,标签栏)"; + sourceTree = ""; + }; + CBCB501E2BD118AA009760B3 /* Center(个人曲库页) */ = { + isa = PBXGroup; + children = ( + CB0918A22BD26B2F006D2B39 /* MPPositive_LibraryViewController.swift */, + ); + path = "Center(个人曲库页)"; + sourceTree = ""; + }; + CBCB501F2BD118AA009760B3 /* Search(搜索页) */ = { + isa = PBXGroup; + children = ( + CB0918A02BD26B0A006D2B39 /* MPPositive_SearchViewController.swift */, + ); + path = "Search(搜索页)"; + sourceTree = ""; + }; + CBCB50202BD118BB009760B3 /* Center */ = { + isa = PBXGroup; + children = ( + ); + path = Center; + sourceTree = ""; + }; + CBCB50212BD118BB009760B3 /* Search */ = { + isa = PBXGroup; + children = ( + ); + path = Search; + sourceTree = ""; + }; + CBCB50222BD118BB009760B3 /* Base */ = { + isa = PBXGroup; + children = ( + CB0918982BD25DCC006D2B39 /* MPPositive_CustomTabBar.swift */, + CB09189A2BD25F50006D2B39 /* MPPositive_CustomTabBarView.swift */, + CB09189C2BD25F63006D2B39 /* MPPositive_CustomTabBarItem.swift */, + CB0918A42BD26E16006D2B39 /* MPPositive_BottomShowView.swift */, + ); + path = Base; + sourceTree = ""; + }; + CBCB50232BD118BB009760B3 /* Home */ = { + isa = PBXGroup; + children = ( + CBD313522BD60CD80015D227 /* MPPositive_HomeShowTableViewCell.swift */, + CBD313542BD636150015D227 /* MPPositive_HomeListFirstCollectionViewCell.swift */, + CBD313562BD63B390015D227 /* MPPositive_HomeListSecondCollectionViewCell.swift */, + CBD313582BD63DDB0015D227 /* MPPositive_HomeListThirdCollectionViewCell.swift */, + CBD3135E2BD642D90015D227 /* MPPositive_HomeListFourthCollectionViewCell.swift */, + CBD313602BD6453A0015D227 /* MPPositive_HomeListFifthCollectionViewCell.swift */, + CBE1CB492BDDEBF000701D57 /* MPPositive_MoreListContentCollectionViewCell.swift */, + CBB5D31C2BDF4E9600CC333D /* MPPositive_MusicItemShowTableViewCell.swift */, + ); + path = Home; + sourceTree = ""; + }; + CBD0CC5C2BDA253800C4B64D /* JsonStructs */ = { + isa = PBXGroup; + children = ( + CBCB34DA2BD7ACE900802900 /* MPPositive_JsonBrowse.swift */, + CBE1CB512BDE4F6C00701D57 /* MPPositive_JsonListAlbum.swift */, + CBDD516C2BEC6AFE000F12C5 /* MPPositive_JsonNext.swift */, + CB5661282BE09D0500CFD014 /* MPPositive_JsonPlayer.swift */, + CBB9F9DC2BEDCFEE008338DE /* MPPositive_JsonLyrics.swift */, + ); + path = JsonStructs; + sourceTree = ""; }; CBE4779F2BB16ABD0031C14B /* MP */ = { isa = PBXGroup; children = ( CBE477A22BB16ABD0031C14B /* Common */, - CBE477A32BB16ABD0031C14B /* ViewControllers */, - CBE477A82BB16ABD0031C14B /* Views */, - CBE477A02BB16ABD0031C14B /* ViewModels */, - CBE477A12BB16ABD0031C14B /* Models */, + CBCB4FE02BD11402009760B3 /* MPSideA */, + CBCB4FE82BD11402009760B3 /* MPPositive */, ); path = MP; sourceTree = ""; }; - CBE477A02BB16ABD0031C14B /* ViewModels */ = { - isa = PBXGroup; - children = ( - ); - path = ViewModels; - sourceTree = ""; - }; - CBE477A12BB16ABD0031C14B /* Models */ = { - isa = PBXGroup; - children = ( - CBBFA9232BBABFCE00057FD5 /* Load */, - CBBFA90F2BBA719600057FD5 /* ViewModels */, - CBBFA9102BBA719600057FD5 /* Models */, - CBBFA9112BBA71AF00057FD5 /* DataBase */, - ); - path = Models; - sourceTree = ""; - }; CBE477A22BB16ABD0031C14B /* Common */ = { isa = PBXGroup; children = ( + CBCB4F942BD10FB2009760B3 /* Base(公用基类) */, CBE477AF2BB16C480031C14B /* Macro(宏定义与全局量) */, CBE477AE2BB16C480031C14B /* Extension(扩展) */, CBE477AD2BB16C480031C14B /* Tool(工具封装) */, CBCAFB5B2BB3C35600BC6520 /* Protocol(公用协议) */, + CBBFA9112BBA71AF00057FD5 /* DataBase */, CBBFA9142BBA81C400057FD5 /* Resource(资源) */, ); path = Common; sourceTree = ""; }; - CBE477A32BB16ABD0031C14B /* ViewControllers */ = { - isa = PBXGroup; - children = ( - CBE477A42BB16ABD0031C14B /* Base(基类-导航栏-标签栏-计时器-播放器) */, - CBE477A72BB16ABD0031C14B /* Lunch(启动页) */, - CBE477A62BB16ABD0031C14B /* Home(音乐资源列表) */, - CBCAFB782BB3F95300BC6520 /* Add(新增资源) */, - CBE477A52BB16ABD0031C14B /* Center(个人资源) */, - ); - path = ViewControllers; - sourceTree = ""; - }; - CBE477A42BB16ABD0031C14B /* Base(基类-导航栏-标签栏-计时器-播放器) */ = { - isa = PBXGroup; - children = ( - CBCAFB622BB3C67A00BC6520 /* BaseViewController.swift */, - CBCAFB6E2BB3EB7000BC6520 /* MPNavigationController.swift */, - CBCAFB702BB3EB9100BC6520 /* MPTabBarController.swift */, - CBCAFB982BB4309C00BC6520 /* MPPresentationController.swift */, - CB7B778D2BB50B1300C34894 /* CountTimerViewController.swift */, - CB7B778E2BB50B1300C34894 /* CountTimerViewController.xib */, - CB7B77932BB55A4500C34894 /* PlayerViewController.swift */, - CB7B77942BB55A4500C34894 /* PlayerViewController.xib */, - ); - path = "Base(基类-导航栏-标签栏-计时器-播放器)"; - sourceTree = ""; - }; - CBE477A52BB16ABD0031C14B /* Center(个人资源) */ = { - isa = PBXGroup; - children = ( - CBCAFB7E2BB3F99300BC6520 /* CenterViewController.swift */, - CBCAFB7F2BB3F99300BC6520 /* CenterViewController.xib */, - CBC6873C2BC24FFF0023ECA6 /* MoreViewController.swift */, - CBC6873D2BC24FFF0023ECA6 /* MoreViewController.xib */, - CBC687402BC2788D0023ECA6 /* RenameViewController.swift */, - CBC687412BC2788D0023ECA6 /* RenameViewController.xib */, - CBC687442BC27AE70023ECA6 /* DeleteViewController.swift */, - CBC687452BC27AE70023ECA6 /* DeleteViewController.xib */, - CB1181462BC6874D00586030 /* SettingViewController.swift */, - CB1181472BC6874D00586030 /* SettingViewController.xib */, - CB11814E2BC68DD800586030 /* AboutViewController.swift */, - CB11814F2BC68DD800586030 /* AboutViewController.xib */, - CB0FBB7D2BC69616006290D4 /* PrivacyViewController.swift */, - CB0FBB7E2BC69616006290D4 /* PrivacyViewController.xib */, - CB0FBB812BC6986E006290D4 /* ServiceViewController.swift */, - CB0FBB822BC6986E006290D4 /* ServiceViewController.xib */, - ); - path = "Center(个人资源)"; - sourceTree = ""; - }; - CBE477A62BB16ABD0031C14B /* Home(音乐资源列表) */ = { - isa = PBXGroup; - children = ( - CBCAFB6A2BB3EB4500BC6520 /* HomeViewController.swift */, - CBCAFB6B2BB3EB4500BC6520 /* HomeViewController.xib */, - ); - path = "Home(音乐资源列表)"; - sourceTree = ""; - }; - CBE477A72BB16ABD0031C14B /* Lunch(启动页) */ = { - isa = PBXGroup; - children = ( - CBCAFB642BB3C82C00BC6520 /* LunchViewController.swift */, - CBCAFB652BB3C82C00BC6520 /* LunchViewController.xib */, - ); - path = "Lunch(启动页)"; - sourceTree = ""; - }; - CBE477A82BB16ABD0031C14B /* Views */ = { - isa = PBXGroup; - children = ( - CBE477A92BB16ABD0031C14B /* Base(基类-导航栏-标签栏) */, - CBE477AC2BB16ABD0031C14B /* Lunch(启动页) */, - CBE477AB2BB16ABD0031C14B /* Home(音乐资源列表-播放器) */, - CBCAFB792BB3F97500BC6520 /* Add(新增资源) */, - CBE477AA2BB16ABD0031C14B /* Center(个人资源) */, - ); - path = Views; - sourceTree = ""; - }; - CBE477A92BB16ABD0031C14B /* Base(基类-导航栏-标签栏) */ = { - isa = PBXGroup; - children = ( - CBCAFB722BB3EDAE00BC6520 /* MPCustomTabBar.swift */, - CBCAFB742BB3EDCD00BC6520 /* MPCustomTabBarView.swift */, - CBF13CB42BC395810025654F /* MPCustomTabBarView.xib */, - CBCAFB762BB3EE4800BC6520 /* MPCustomTabBarItem.swift */, - CBAD14AA2BC3E1C3001430F9 /* MPBottomShowView.swift */, - CBAD14AC2BC3E201001430F9 /* MPBottomShowView.xib */, - CB1181442BC66E7C00586030 /* PlayerActionView.swift */, - ); - path = "Base(基类-导航栏-标签栏)"; - sourceTree = ""; - }; - CBE477AA2BB16ABD0031C14B /* Center(个人资源) */ = { - isa = PBXGroup; - children = ( - CBD5AEDC2BBBA7B600BF5A43 /* CenterTableViewCell.swift */, - CBD5AEDD2BBBA7B600BF5A43 /* CenterTableViewCell.xib */, - CB11814A2BC68B0500586030 /* SettingTableViewCell.swift */, - CB11814B2BC68B0500586030 /* SettingTableViewCell.xib */, - ); - path = "Center(个人资源)"; - sourceTree = ""; - }; - CBE477AB2BB16ABD0031C14B /* Home(音乐资源列表-播放器) */ = { - isa = PBXGroup; - children = ( - CBCAFB822BB40C1000BC6520 /* Home_HeadBannerView.swift */, - CBCAFB842BB40ED800BC6520 /* Home_RowListsTableViewCell.swift */, - CBCAFB852BB40ED800BC6520 /* Home_RowListsTableViewCell.xib */, - CBCAFB882BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.swift */, - CBCAFB892BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.xib */, - CBCAFB8C2BB4170000BC6520 /* Home_SecondListCollectionViewCell.swift */, - CBCAFB8D2BB4170000BC6520 /* Home_SecondListCollectionViewCell.xib */, - CBCAFB902BB4185700BC6520 /* Home_FourthListCollectionViewCell.swift */, - CBCAFB912BB4185700BC6520 /* Home_FourthListCollectionViewCell.xib */, - CBD958D12BB6600500666B0D /* Player_Slider.swift */, - ); - path = "Home(音乐资源列表-播放器)"; - sourceTree = ""; - }; - CBE477AC2BB16ABD0031C14B /* Lunch(启动页) */ = { - isa = PBXGroup; - children = ( - CBCAFB682BB3CAC400BC6520 /* Lunch_ProgressView.swift */, - ); - path = "Lunch(启动页)"; - sourceTree = ""; - }; CBE477AD2BB16C480031C14B /* Tool(工具封装) */ = { isa = PBXGroup; children = ( - CB1C16512BC80BF100B96AB3 /* MPMediaCenterManager.swift */, - CBD958D32BB6942F00666B0D /* MPVolumeManager.swift */, - CBE2C4CA2BC7BE5D00F283A7 /* MPNetWorkManager.swift */, - CBBFA9172BBA83BA00057FD5 /* MPCoreDataHandlerManager.swift */, - CBE2C4C62BC783F700F283A7 /* MPHUD.swift */, + CB1C16512BC80BF100B96AB3 /* MPSideA_MediaCenterManager.swift */, + CBD958D32BB6942F00666B0D /* MPSideA_VolumeManager.swift */, + CBE2C4CA2BC7BE5D00F283A7 /* MP_NetWorkManager.swift */, + CB56612C2BE0DF8C00CFD014 /* MP_WebWork.swift */, + CBB9F9DE2BEDDCC5008338DE /* MP_PlayerManager.swift */, + CBCB32192BD7578500802900 /* MP_LocationManager.swift */, + CBBFA9172BBA83BA00057FD5 /* MP_CoreDataHandlerManager.swift */, + CBE2C4C62BC783F700F283A7 /* MP_HUD.swift */, CBC687482BC2882B0023ECA6 /* MPTableManager.swift */, + CBD958D12BB6600500666B0D /* MP_PlayerSlider.swift */, ); path = "Tool(工具封装)"; sourceTree = ""; @@ -584,6 +873,17 @@ path = "Macro(宏定义与全局量)"; sourceTree = ""; }; + CBEE8E302BEB0F87007DA798 /* Player */ = { + isa = PBXGroup; + children = ( + CBEE8E312BEB0FC0007DA798 /* MPPositive_PlayerCoverView.swift */, + CBEE8E332BEB16BB007DA798 /* MPPositive_PlayerSilder.swift */, + CBEE8E352BEB2604007DA798 /* MPPositive_PlayerLyricView.swift */, + CBCC23522BEE596E004D7A57 /* MPPositive_PlayerListShowTableViewCell.swift */, + ); + path = Player; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -613,7 +913,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - CLASSPREFIX = ""; + CLASSPREFIX = MPPositive_; LastSwiftUpdateCheck = 1520; LastUpgradeCheck = 1520; TargetAttributes = { @@ -645,47 +945,47 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + CBCB50092BD11402009760B3 /* MPSideA_BottomShowView.xib in Resources */, CBC54E5A2BC4D5D3003B1901 /* Fireplace.mp3 in Resources */, CBC54E562BC4D5D3003B1901 /* Breathe.mp3 in Resources */, - CB11814D2BC68B0500586030 /* SettingTableViewCell.xib in Resources */, - CBCAFB812BB3F99300BC6520 /* CenterViewController.xib in Resources */, - CB1181492BC6874D00586030 /* SettingViewController.xib in Resources */, CBC54E602BC4D5D3003B1901 /* Call of Seagulls.mp3 in Resources */, - CB7B77962BB55A4500C34894 /* PlayerViewController.xib in Resources */, - CB0FBB802BC69616006290D4 /* PrivacyViewController.xib in Resources */, CBC54E5E2BC4D5D3003B1901 /* waterfall.mp3 in Resources */, - CBF13CB52BC395810025654F /* MPCustomTabBarView.xib in Resources */, - CBCAFB8F2BB4170000BC6520 /* Home_SecondListCollectionViewCell.xib in Resources */, CBC54E5F2BC4D5D3003B1901 /* Beach.mp3 in Resources */, CBC54E5D2BC4D5D3003B1901 /* Chirping of Birds.mp3 in Resources */, - CBCAFB7D2BB3F98800BC6520 /* AddViewController.xib in Resources */, CBC54E572BC4D5D3003B1901 /* Shhh….mp3 in Resources */, + CBCB500D2BD11402009760B3 /* MPSideA_CustomTabBarView.xib in Resources */, + CBCB50072BD11402009760B3 /* MPSideA_PlayerViewController.xib in Resources */, 0096623C2BB14A5B00FCA65F /* LaunchScreen.storyboard in Resources */, CBC54E5C2BC4D5D3003B1901 /* TV.mp3 in Resources */, + CBCB50152BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.xib in Resources */, CBC54E592BC4D5D3003B1901 /* Mountain stream.mp3 in Resources */, CBC54E622BC4D5D3003B1901 /* Nocturnal Insects.mp3 in Resources */, - CBCAFB672BB3C82C00BC6520 /* LunchViewController.xib in Resources */, - CB1181512BC68DD800586030 /* AboutViewController.xib in Resources */, - CBC6873F2BC24FFF0023ECA6 /* MoreViewController.xib in Resources */, - CBCAFB8B2BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.xib in Resources */, + CBCAFB672BB3C82C00BC6520 /* MP_LunchViewController.xib in Resources */, + CBCB4FFD2BD11402009760B3 /* MPSideA_RenameViewController.xib in Resources */, + CBCB4FF72BD11402009760B3 /* MPSideA_DeleteViewController.xib in Resources */, CBC54E612BC4D5D3003B1901 /* Cicada Chirping.mp3 in Resources */, - CBCAFB6D2BB3EB4500BC6520 /* HomeViewController.xib in Resources */, - CBC687432BC2788D0023ECA6 /* RenameViewController.xib in Resources */, 009662392BB14A5B00FCA65F /* Assets.xcassets in Resources */, + CBCB50032BD11402009760B3 /* MPSideA_CountTimerViewController.xib in Resources */, + CBCB4FF52BD11402009760B3 /* MPSideA_CenterViewController.xib in Resources */, + CBCB50012BD11402009760B3 /* MPSideA_SettingViewController.xib in Resources */, + CBCB501A2BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.xib in Resources */, + CBCB50132BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.xib in Resources */, + CBCB50112BD11402009760B3 /* MPSideA_SettingTableViewCell.xib in Resources */, + CBCB4FED2BD11402009760B3 /* MPSideA_AddViewController.xib in Resources */, + CBCB4FFF2BD11402009760B3 /* MPSideA_ServiceViewController.xib in Resources */, + CBCB50182BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.xib in Resources */, + CBCB4FFB2BD11402009760B3 /* MPSideA_PrivacyViewController.xib in Resources */, CBC54E672BC4D90F003B1901 /* Resource.plist in Resources */, - CBCAFB872BB40ED800BC6520 /* Home_RowListsTableViewCell.xib in Resources */, - CBC687472BC27AE70023ECA6 /* DeleteViewController.xib in Resources */, CBC54E5B2BC4D5D3003B1901 /* Water droplet.mp3 in Resources */, - CBAD14AD2BC3E201001430F9 /* MPBottomShowView.xib in Resources */, - CBD5AEDF2BBBA7B600BF5A43 /* CenterTableViewCell.xib in Resources */, - CB7B77902BB50B1300C34894 /* CountTimerViewController.xib in Resources */, - CBCAFB932BB4185700BC6520 /* Home_FourthListCollectionViewCell.xib in Resources */, 009662342BB14A5A00FCA65F /* Main.storyboard in Resources */, + CBCB50052BD11402009760B3 /* MPSideA_HomeViewController.xib in Resources */, CBC54E642BC4D5D3003B1901 /* Seawater Surging.mp3 in Resources */, + CBCB500F2BD11402009760B3 /* MPSideA_CenterTableViewCell.xib in Resources */, + CBCB4FF32BD11402009760B3 /* MPSideA_AboutViewController.xib in Resources */, CBC54E582BC4D5D3003B1901 /* Shh Shh.mp3 in Resources */, CBC54E632BC4D5D3003B1901 /* Howling Wind.mp3 in Resources */, - CB0FBB842BC6986E006290D4 /* ServiceViewController.xib in Resources */, CBC54E652BC4D5D3003B1901 /* Summer Insects.mp3 in Resources */, + CBCB4FF92BD11402009760B3 /* MPSideA_MoreViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -738,59 +1038,106 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - CBCAFB712BB3EB9100BC6520 /* MPTabBarController.swift in Sources */, + CBB5D3222BDF80C800CC333D /* MPPositive_PlayerViewController.swift in Sources */, + CBE1CB4C2BDE440E00701D57 /* MPPositive_ListHeaderModel.swift in Sources */, + CBEE8E362BEB2604007DA798 /* MPPositive_PlayerLyricView.swift in Sources */, + CBCB4FF22BD11402009760B3 /* MPSideA_AboutViewController.swift in Sources */, + CB0918A52BD26E16006D2B39 /* MPPositive_BottomShowView.swift in Sources */, + CBB5D31F2BDF711600CC333D /* MPPositive_SongItemModel.swift in Sources */, CBCAFB5A2BB3C2A000BC6520 /* LayoutConstraint.swift in Sources */, - CB7B778F2BB50B1300C34894 /* CountTimerViewController.swift in Sources */, - CBC687422BC2788D0023ECA6 /* RenameViewController.swift in Sources */, - CBBFA9202BBAB88500057FD5 /* MusicViewModel.swift in Sources */, - CB1C16522BC80BF100B96AB3 /* MPMediaCenterManager.swift in Sources */, - CBAD14AB2BC3E1C3001430F9 /* MPBottomShowView.swift in Sources */, - CBCAFB7C2BB3F98800BC6520 /* AddViewController.swift in Sources */, - CBD958D42BB6942F00666B0D /* MPVolumeManager.swift in Sources */, - CBCAFB752BB3EDCD00BC6520 /* MPCustomTabBarView.swift in Sources */, - CBBFA9182BBA83BA00057FD5 /* MPCoreDataHandlerManager.swift in Sources */, - CBCAFB662BB3C82C00BC6520 /* LunchViewController.swift in Sources */, - CB7B77952BB55A4500C34894 /* PlayerViewController.swift in Sources */, - CB0FBB7F2BC69616006290D4 /* PrivacyViewController.swift in Sources */, + CBCB4FEF2BD11402009760B3 /* MPSideA_NavigationController.swift in Sources */, + CBCB35212BD7ACE900802900 /* MPPositive_JsonBrowse.swift in Sources */, + CBCB4FF62BD11402009760B3 /* MPSideA_DeleteViewController.swift in Sources */, + CBDD516F2BECBA6E000F12C5 /* MPPositive_PlayerLoadViewModel.swift in Sources */, + CBEE8E382BEB92CC007DA798 /* MPPositive_SongViewModel.swift in Sources */, + CBCB50122BD11402009760B3 /* MPSideA_Home_FirstListCollectionViewCell.swift in Sources */, + CB1C16522BC80BF100B96AB3 /* MPSideA_MediaCenterManager.swift in Sources */, + CBD313552BD636150015D227 /* MPPositive_HomeListFirstCollectionViewCell.swift in Sources */, + CBCB50002BD11402009760B3 /* MPSideA_SettingViewController.swift in Sources */, + CBCB50252BD118D8009760B3 /* MPPositive_BaseViewController.swift in Sources */, + CBD313592BD63DDB0015D227 /* MPPositive_HomeListThirdCollectionViewCell.swift in Sources */, + CBD958D42BB6942F00666B0D /* MPSideA_VolumeManager.swift in Sources */, + CBBFA9182BBA83BA00057FD5 /* MP_CoreDataHandlerManager.swift in Sources */, + CBE1CB442BDDEAAD00701D57 /* MPPositive_MoreContentViewController.swift in Sources */, + CBE1CB522BDE4F6C00701D57 /* MPPositive_JsonListAlbum.swift in Sources */, + CB0918992BD25DCC006D2B39 /* MPPositive_CustomTabBar.swift in Sources */, + CBCB50192BD11402009760B3 /* MPSideA_Home_SecondListCollectionViewCell.swift in Sources */, + CBCB50022BD11402009760B3 /* MPSideA_CountTimerViewController.swift in Sources */, + CBCAFB662BB3C82C00BC6520 /* MP_LunchViewController.swift in Sources */, + CBCB4FEA2BD11402009760B3 /* MPSideA_MusicModel.swift in Sources */, CBBFA91A2BBA846600057FD5 /* CoreDataDelegete.swift in Sources */, - CBCAFB692BB3CAC400BC6520 /* Lunch_ProgressView.swift in Sources */, - CB11814C2BC68B0500586030 /* SettingTableViewCell.swift in Sources */, - CBCAFB832BB40C1000BC6520 /* Home_HeadBannerView.swift in Sources */, - CB1181502BC68DD800586030 /* AboutViewController.swift in Sources */, + CB56612D2BE0DF8C00CFD014 /* MP_WebWork.swift in Sources */, + CBCB50042BD11402009760B3 /* MPSideA_HomeViewController.swift in Sources */, + CB09189D2BD25F63006D2B39 /* MPPositive_CustomTabBarItem.swift in Sources */, + CBCB4FFC2BD11402009760B3 /* MPSideA_RenameViewController.swift in Sources */, + CBCB50162BD11402009760B3 /* MPSideA_Home_HeadBannerView.swift in Sources */, + CBCC234F2BEE57AC004D7A57 /* MPPositive_PresentationController.swift in Sources */, + CBCB500A2BD11402009760B3 /* MPSideA_CustomTabBar.swift in Sources */, + CBCAFB692BB3CAC400BC6520 /* MP_Lunch_ProgressView.swift in Sources */, + CBCB50102BD11402009760B3 /* MPSideA_SettingTableViewCell.swift in Sources */, CBCAFB5D2BB3C52100BC6520 /* HexColor.swift in Sources */, - CBD5AEDE2BBBA7B600BF5A43 /* CenterTableViewCell.swift in Sources */, - CB0FBB832BC6986E006290D4 /* ServiceViewController.swift in Sources */, + CB0918A12BD26B0A006D2B39 /* MPPositive_SearchViewController.swift in Sources */, CBD5AEE12BBBE45300BF5A43 /* ImagePicker.swift in Sources */, + CBCB4FF12BD11402009760B3 /* MPSideA_TabBarController.swift in Sources */, + CBD0CC592BDA238100C4B64D /* MPPositive_BrowseLoadViewModel.swift in Sources */, + CBCB50082BD11402009760B3 /* MPSideA_BottomShowView.swift in Sources */, + CBEE8E342BEB16BB007DA798 /* MPPositive_PlayerSilder.swift in Sources */, + CB09189F2BD26AFC006D2B39 /* MPPositive_HomeViewController.swift in Sources */, CBCAFB612BB3C59500BC6520 /* InstanceFromNib.swift in Sources */, - CBCAFB8A2BB40FBB00BC6520 /* Home_FirstListCollectionViewCell.swift in Sources */, - CBCAFB992BB4309C00BC6520 /* MPPresentationController.swift in Sources */, - CBBFA9222BBAB8FD00057FD5 /* LoadDataMusic.swift in Sources */, - CBCAFB732BB3EDAE00BC6520 /* MPCustomTabBar.swift in Sources */, + CBCB4FFA2BD11402009760B3 /* MPSideA_PrivacyViewController.swift in Sources */, + CBCB500E2BD11402009760B3 /* MPSideA_CenterTableViewCell.swift in Sources */, 009662312BB14A5A00FCA65F /* ViewController.swift in Sources */, - CBE2C4C72BC783F700F283A7 /* MPHUD.swift in Sources */, + CBE2C4C72BC783F700F283A7 /* MP_HUD.swift in Sources */, CBE2C4C92BC7B25800F283A7 /* TableView.swift in Sources */, + CBCB4F9A2BD11089009760B3 /* MP_NavigationController.swift in Sources */, + CB0918A32BD26B2F006D2B39 /* MPPositive_LibraryViewController.swift in Sources */, + CBEE8E322BEB0FC0007DA798 /* MPPositive_PlayerCoverView.swift in Sources */, + CBC32A552BD8DFB900687171 /* MPPositive_BrowseModuleListViewModel.swift in Sources */, + CBE1CB4E2BDE4BD800701D57 /* MPPositive_ListAlbumListViewModel.swift in Sources */, + CBD313572BD63B390015D227 /* MPPositive_HomeListSecondCollectionViewCell.swift in Sources */, 0096622D2BB14A5A00FCA65F /* AppDelegate.swift in Sources */, - CBCAFB922BB4185700BC6520 /* Home_FourthListCollectionViewCell.swift in Sources */, - CBCAFB772BB3EE4800BC6520 /* MPCustomTabBarItem.swift in Sources */, - CBCAFB6F2BB3EB7000BC6520 /* MPNavigationController.swift in Sources */, - CBC6873E2BC24FFF0023ECA6 /* MoreViewController.swift in Sources */, - CBCAFB862BB40ED800BC6520 /* Home_RowListsTableViewCell.swift in Sources */, - CB1181452BC66E7C00586030 /* PlayerActionView.swift in Sources */, - CBC687462BC27AE70023ECA6 /* DeleteViewController.swift in Sources */, - CB1181482BC6874D00586030 /* SettingViewController.swift in Sources */, - CBCAFB632BB3C67A00BC6520 /* BaseViewController.swift in Sources */, + CBC32A532BD8D9F300687171 /* MPPositive_BrowseItemModel.swift in Sources */, + CBCB4FEC2BD11402009760B3 /* MPSideA_AddViewController.swift in Sources */, + CBCB50172BD11402009760B3 /* MPSideA_Home_RowListsTableViewCell.swift in Sources */, + CBCB4F982BD11054009760B3 /* MP_BaseViewController.swift in Sources */, + CBD0CC5E2BDA260500C4B64D /* MPPositive_BrowseItemViewModel.swift in Sources */, + CBD313612BD6453A0015D227 /* MPPositive_HomeListFifthCollectionViewCell.swift in Sources */, + CBE1CB4A2BDDEBF000701D57 /* MPPositive_MoreListContentCollectionViewCell.swift in Sources */, + CBCB4FF82BD11402009760B3 /* MPSideA_MoreViewController.swift in Sources */, + CBCB50142BD11402009760B3 /* MPSideA_Home_FourthListCollectionViewCell.swift in Sources */, + CB5661292BE09D0500CFD014 /* MPPositive_JsonPlayer.swift in Sources */, + CBCB50062BD11402009760B3 /* MPSideA_PlayerViewController.swift in Sources */, + CBCB4FE92BD11402009760B3 /* MPSideA_LoadDataMusic.swift in Sources */, + CBCB4FEE2BD11402009760B3 /* MPSideA_BaseViewController.swift in Sources */, + CBE1CB582BDE550800701D57 /* MPPositive_ListShowViewController.swift in Sources */, + CBCB500B2BD11402009760B3 /* MPSideA_CustomTabBarItem.swift in Sources */, + CBB5D31D2BDF4E9600CC333D /* MPPositive_MusicItemShowTableViewCell.swift in Sources */, + CBCC23512BEE58C1004D7A57 /* MPPositive_PlayerListShowViewController.swift in Sources */, + CBDD516D2BEC6AFE000F12C5 /* MPPositive_JsonNext.swift in Sources */, + CB0918912BD255EA006D2B39 /* MPPositive_NavigationController.swift in Sources */, + CBCB4FF42BD11402009760B3 /* MPSideA_CenterViewController.swift in Sources */, 009662372BB14A5A00FCA65F /* MusicPlayer.xcdatamodeld in Sources */, - CBBFA9132BBA71CF00057FD5 /* MusicModel.swift in Sources */, + CB09189B2BD25F50006D2B39 /* MPPositive_CustomTabBarView.swift in Sources */, + CBE1CB502BDE4CC500701D57 /* MPPositive_ListHeaderViewModel.swift in Sources */, CBCAFB5F2BB3C55500BC6520 /* DateTime.swift in Sources */, - CBD958D22BB6600500666B0D /* Player_Slider.swift in Sources */, - CBCAFB802BB3F99300BC6520 /* CenterViewController.swift in Sources */, + CBD958D22BB6600500666B0D /* MP_PlayerSlider.swift in Sources */, + CBCC23532BEE596E004D7A57 /* MPPositive_PlayerListShowTableViewCell.swift in Sources */, CBC687492BC2882B0023ECA6 /* MPTableManager.swift in Sources */, + CBD313532BD60CD80015D227 /* MPPositive_HomeShowTableViewCell.swift in Sources */, + CB0918972BD25D8C006D2B39 /* MPPositive_TabBarController.swift in Sources */, + CBCB500C2BD11402009760B3 /* MPSideA_CustomTabBarView.swift in Sources */, + CBB9F9DD2BEDCFEE008338DE /* MPPositive_JsonLyrics.swift in Sources */, + CBB9F9DF2BEDDCC5008338DE /* MP_PlayerManager.swift in Sources */, + CBCB501B2BD11402009760B3 /* MPSideA_PlayerActionView.swift in Sources */, CBE477B12BB16CCC0031C14B /* Macro.swift in Sources */, - CBCAFB8E2BB4170000BC6520 /* Home_SecondListCollectionViewCell.swift in Sources */, - CBE2C4CB2BC7BE5D00F283A7 /* MPNetWorkManager.swift in Sources */, - CBCAFB6C2BB3EB4500BC6520 /* HomeViewController.swift in Sources */, + CBCB4FFE2BD11402009760B3 /* MPSideA_ServiceViewController.swift in Sources */, + CBE2C4CB2BC7BE5D00F283A7 /* MP_NetWorkManager.swift in Sources */, CBBFA91E2BBA9B5C00057FD5 /* Notification.swift in Sources */, + CBCB321A2BD7578500802900 /* MP_LocationManager.swift in Sources */, + CBCB4FEB2BD11402009760B3 /* MPSideA_MusicViewModel.swift in Sources */, + CBCB4FF02BD11402009760B3 /* MPSideA_PresentationController.swift in Sources */, CBC6874B2BC2B0710023ECA6 /* String.swift in Sources */, + CBD3135F2BD642D90015D227 /* MPPositive_HomeListFourthCollectionViewCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -943,7 +1290,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1.1; + CURRENT_PROJECT_VERSION = 1.2; DEVELOPMENT_TEAM = T93S37G27F; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; @@ -966,6 +1313,7 @@ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -980,7 +1328,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1.1; + CURRENT_PROJECT_VERSION = 1.2; DEVELOPMENT_TEAM = T93S37G27F; ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1003,6 +1351,7 @@ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; diff --git a/MusicPlayer/AppDelegate.swift b/MusicPlayer/AppDelegate.swift index a185125..d757688 100644 --- a/MusicPlayer/AppDelegate.swift +++ b/MusicPlayer/AppDelegate.swift @@ -49,7 +49,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { //MARK: - 页面跳转 ///跳转启动页 func switch_lunch() { - let lunchVC = LunchViewController() + let lunchVC = MP_LunchViewController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 @@ -60,7 +60,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } ///跳转A面 func switch_aSide() { - let tabBarVC = MPTabBarController() + let tabBarVC = MPSideA_TabBarController() //动画设置 let transtition = CATransition() transtition.duration = 0.8 @@ -69,6 +69,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate { window?.rootViewController = tabBarVC window?.makeKeyAndVisible() } + //跳转b面 + func switch_positive() { + let tabBarVC = MPPositive_TabBarController() + //动画设置 + let transtition = CATransition() + transtition.duration = 0.8 + transtition.timingFunction = .init(name: .easeOut)//外层模糊化 + window?.layer.add(transtition, forKey: "positive.easeOut") + window?.rootViewController = tabBarVC + window?.makeKeyAndVisible() + } + // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { /* diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-1024.png index b4b3da6..d50120b 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-1024.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png index 7a9924f..ea0d228 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png index abd8880..39f5418 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png index f78ab20..cea2d48 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png index e668179..41f7012 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png index a61fecd..380210b 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png index ea23953..db5d05f 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png index bf7bf37..c11ac49 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png index da4ee31..c6039c7 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png index da4ee31..c6039c7 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png index 809007b..0752db9 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png index 795e996..b88e66b 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png index a9684b6..aaa732c 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png index d467694..a29fb22 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png index b1dbc08..59dda5c 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png index 7041d75..c321735 100644 Binary files a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png and b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@2x.png b/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@2x.png deleted file mode 100644 index e26fc9c..0000000 Binary files a/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@2x.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@3x.png b/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@3x.png deleted file mode 100644 index f51b09f..0000000 Binary files a/MusicPlayer/Assets.xcassets/Center/About'Icon.imageset/Group_1597880400@3x.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/ICON.imageset/Contents.json b/MusicPlayer/Assets.xcassets/ICON.imageset/Contents.json index 006a126..70d9fd9 100644 --- a/MusicPlayer/Assets.xcassets/ICON.imageset/Contents.json +++ b/MusicPlayer/Assets.xcassets/ICON.imageset/Contents.json @@ -1,16 +1,15 @@ { "images" : [ { + "filename" : "img_v3_02ae_ad486134-21d1-4b05-869c-06e3d548e40g.jpg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "启动图标.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "启动图标 1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/MusicPlayer/Assets.xcassets/ICON.imageset/img_v3_02ae_ad486134-21d1-4b05-869c-06e3d548e40g.jpg b/MusicPlayer/Assets.xcassets/ICON.imageset/img_v3_02ae_ad486134-21d1-4b05-869c-06e3d548e40g.jpg new file mode 100644 index 0000000..495a750 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/ICON.imageset/img_v3_02ae_ad486134-21d1-4b05-869c-06e3d548e40g.jpg differ diff --git a/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标 1.png b/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标 1.png deleted file mode 100644 index ad46ca9..0000000 Binary files a/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标 1.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标.png b/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标.png deleted file mode 100644 index ad46ca9..0000000 Binary files a/MusicPlayer/Assets.xcassets/ICON.imageset/启动图标.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Contents.json index f209603..ac68911 100644 --- a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Contents.json +++ b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "Group_1597880401@2x.png", + "filename" : "img_v3_02ae_c419ebcc-7bcc-4018-a6f4-b4cb25f7d11g.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Group_1597880401@3x.png", + "filename" : "img_v3_02ae_2efa5fb1-c28e-4299-b6c7-abe303cb6f8g.png", "idiom" : "universal", "scale" : "3x" } diff --git a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@2x.png b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@2x.png deleted file mode 100644 index d2668a0..0000000 Binary files a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@2x.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@3x.png b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@3x.png deleted file mode 100644 index 5941238..0000000 Binary files a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/Group_1597880401@3x.png and /dev/null differ diff --git a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_2efa5fb1-c28e-4299-b6c7-abe303cb6f8g.png b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_2efa5fb1-c28e-4299-b6c7-abe303cb6f8g.png new file mode 100644 index 0000000..47eedb3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_2efa5fb1-c28e-4299-b6c7-abe303cb6f8g.png differ diff --git a/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_c419ebcc-7bcc-4018-a6f4-b4cb25f7d11g.png b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_c419ebcc-7bcc-4018-a6f4-b4cb25f7d11g.png new file mode 100644 index 0000000..6ae537b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Lunch/Lunch'bg.imageset/img_v3_02ae_c419ebcc-7bcc-4018-a6f4-b4cb25f7d11g.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/Contents.json new file mode 100644 index 0000000..19d4557 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g 1.png b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g 1.png new file mode 100644 index 0000000..0e4e44b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g 1.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g.png b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g.png new file mode 100644 index 0000000..0e4e44b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_BG'bg.imageset/img_v3_00a6_3b582437-5c9a-4e56-9304-9cbfb9f3a89g.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Contents.json new file mode 100644 index 0000000..757ba94 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880587@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880587@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@2x.png new file mode 100644 index 0000000..16456e0 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@3x.png new file mode 100644 index 0000000..362220f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/B_Home_Video'logo.imageset/Group_1597880587@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@2x.png new file mode 100644 index 0000000..8837609 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@3x.png new file mode 100644 index 0000000..a194a33 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/COCO_Line_Menu_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/Contents.json new file mode 100644 index 0000000..211830a --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Home_Menu'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "COCO_Line_Menu_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "COCO_Line_Menu_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Contents.json new file mode 100644 index 0000000..9278508 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880606@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880606@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@2x.png new file mode 100644 index 0000000..0a851d1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@3x.png new file mode 100644 index 0000000..d7b52a9 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Home_More'logo.imageset/Group_1597880606@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@2x.png new file mode 100644 index 0000000..f6852f6 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@3x.png new file mode 100644 index 0000000..65c4166 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Collectioned'logo.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Contents.json new file mode 100644 index 0000000..2cf7adb --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_161123912@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_161123912@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@2x.png new file mode 100644 index 0000000..220ce26 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@3x.png new file mode 100644 index 0000000..0459ed4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Cover'mask.imageset/Rectangle_161123912@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Contents.json new file mode 100644 index 0000000..da6238a --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880573@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880573@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@2x.png new file mode 100644 index 0000000..ffbbaef Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@3x.png new file mode 100644 index 0000000..0804bad Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_NormolPlay'logo.imageset/Group_1597880573@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Contents.json new file mode 100644 index 0000000..2869ac8 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_161123926@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_161123926@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@2x.png new file mode 100644 index 0000000..f47e6bc Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@3x.png new file mode 100644 index 0000000..10a10f4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_PlayAll'bg.imageset/Rectangle_161123926@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Contents.json new file mode 100644 index 0000000..a8cc34a --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880484@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880484@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@2x.png new file mode 100644 index 0000000..1a1c534 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@3x.png new file mode 100644 index 0000000..cd7984a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_Played'logo.imageset/Group_1597880484@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Contents.json new file mode 100644 index 0000000..ab8b539 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880487@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880487@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@2x.png new file mode 100644 index 0000000..f4862d5 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@3x.png new file mode 100644 index 0000000..1a7783e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_ShufflePlay'logo.imageset/Group_1597880487@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Contents.json new file mode 100644 index 0000000..677d32f --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880490@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880490@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@2x.png new file mode 100644 index 0000000..a21069b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@3x.png new file mode 100644 index 0000000..d744d51 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnCollection'logo.imageset/Group_1597880490@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Contents.json new file mode 100644 index 0000000..a8cc34a --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880484@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880484@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@2x.png new file mode 100644 index 0000000..444d2f0 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@3x.png new file mode 100644 index 0000000..6745087 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/List_UnPlay'logo.imageset/Group_1597880484@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@2x.png new file mode 100644 index 0000000..b9bbba1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@3x.png new file mode 100644 index 0000000..6dab5ff Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/COCO_Line_Arrow_-_Bottom_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/Contents.json new file mode 100644 index 0000000..170839b --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Loaded'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "COCO_Line_Arrow_-_Bottom_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "COCO_Line_Arrow_-_Bottom_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Contents.json new file mode 100644 index 0000000..1773020 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880575@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880575@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@2x.png new file mode 100644 index 0000000..0400107 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@3x.png new file mode 100644 index 0000000..d64a5a1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_More'logo.imageset/Group_1597880575@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@2x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@2x.png new file mode 100644 index 0000000..3f0542f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@3x.png b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@3x.png new file mode 100644 index 0000000..a82fed1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/COCO_Line_Arrow_-_Bottom_2@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/Contents.json new file mode 100644 index 0000000..d43bef4 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Home/Song_Unload'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "COCO_Line_Arrow_-_Bottom_2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "COCO_Line_Arrow_-_Bottom_2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Contents.json new file mode 100644 index 0000000..8507613 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse_2214@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse_2214@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@2x.png new file mode 100644 index 0000000..d9971ae Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@3x.png new file mode 100644 index 0000000..7ee258b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Ellipse_2214.imageset/Ellipse_2214@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Contents.json new file mode 100644 index 0000000..f88f5bc --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_40118@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_40118@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@2x.png new file mode 100644 index 0000000..f3c83a3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@3x.png new file mode 100644 index 0000000..532a096 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Bottom'mask.imageset/Rectangle_40118@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Contents.json new file mode 100644 index 0000000..9215fb3 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_3463306@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_3463306@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@2x.png new file mode 100644 index 0000000..d01b02c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@3x.png new file mode 100644 index 0000000..5c741ce Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Indictor'logo.imageset/Rectangle_3463306@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Contents.json new file mode 100644 index 0000000..7a53e3d --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880583@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880583@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@2x.png new file mode 100644 index 0000000..e4d6839 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@3x.png new file mode 100644 index 0000000..188fe62 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_List'logo.imageset/Group_1597880583@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Contents.json new file mode 100644 index 0000000..3faeb60 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880589@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880589@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@2x.png new file mode 100644 index 0000000..9da97a3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@3x.png new file mode 100644 index 0000000..4473123 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_ListRemove'logo.imageset/Group_1597880589@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Contents.json new file mode 100644 index 0000000..5e88ec1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@2x.png new file mode 100644 index 0000000..c275414 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@3x.png new file mode 100644 index 0000000..9a48c99 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Next'logo.imageset/Frame_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Contents.json new file mode 100644 index 0000000..569cad8 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275566@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275566@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@2x.png new file mode 100644 index 0000000..08c9899 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@3x.png new file mode 100644 index 0000000..72986eb Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pause'logo.imageset/Group_1171275566@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@2x.png new file mode 100644 index 0000000..83d86e1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@3x.png new file mode 100644 index 0000000..f1cf6a0 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pervious'logo.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Contents.json new file mode 100644 index 0000000..569cad8 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275566@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275566@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@2x.png new file mode 100644 index 0000000..8bee73b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@3x.png new file mode 100644 index 0000000..1648e6c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Player'logo.imageset/Group_1171275566@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/Contents.json new file mode 100644 index 0000000..599f113 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_arrow-left@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon_arrow-left@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@2x.png new file mode 100644 index 0000000..7f08900 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@3x.png new file mode 100644 index 0000000..776c5f8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Pop'logo.imageset/icon_arrow-left@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Contents.json new file mode 100644 index 0000000..ebb7e22 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880458@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880458@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@2x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@2x.png new file mode 100644 index 0000000..6cf0f46 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@3x.png b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@3x.png new file mode 100644 index 0000000..59f23e5 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/Player/Player_Related'logo.imageset/Group_1597880458@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Contents.json new file mode 100644 index 0000000..4437b55 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse_1174@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse_1174@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@2x.png new file mode 100644 index 0000000..49f68cb Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@3x.png new file mode 100644 index 0000000..d96d2b9 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Circle.imageset/Ellipse_1174@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/Contents.json new file mode 100644 index 0000000..091cf1b --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home-smile@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home-smile@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@2x.png new file mode 100644 index 0000000..e24d9bc Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@3x.png new file mode 100644 index 0000000..665eeaf Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home 1.imageset/home-smile@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/Contents.json new file mode 100644 index 0000000..091cf1b --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home-smile@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home-smile@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@2x.png new file mode 100644 index 0000000..daeb27e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@3x.png new file mode 100644 index 0000000..18cf713 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Home.imageset/home-smile@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@2x.png new file mode 100644 index 0000000..e5ad5e7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@3x.png new file mode 100644 index 0000000..3c32b5a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine 1.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Contents.json new file mode 100644 index 0000000..7fab082 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880629@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880629@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@2x.png new file mode 100644 index 0000000..9670fec Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@3x.png new file mode 100644 index 0000000..5df9e47 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Mine.imageset/Group_1597880629@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/Contents.json new file mode 100644 index 0000000..bdd5da4 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "search-lg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "search-lg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@2x.png new file mode 100644 index 0000000..18e2ab6 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@3x.png new file mode 100644 index 0000000..97ea5e8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach 1.imageset/search-lg@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/Contents.json new file mode 100644 index 0000000..bdd5da4 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "search-lg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "search-lg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@2x.png new file mode 100644 index 0000000..6b45389 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@3x.png new file mode 100644 index 0000000..28d4357 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/B_Seach.imageset/search-lg@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Contents.json new file mode 100644 index 0000000..992cfad --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880619@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880619@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@2x.png new file mode 100644 index 0000000..f1f501b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@3x.png new file mode 100644 index 0000000..3963a3a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Lists'logo.imageset/Group_1597880619@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Contents.json new file mode 100644 index 0000000..72a1571 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880620@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880620@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@2x.png new file mode 100644 index 0000000..99e32cb Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@3x.png new file mode 100644 index 0000000..ece625d Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Pause'logo.imageset/Group_1597880620@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Contents.json new file mode 100644 index 0000000..72a1571 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880620@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880620@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@2x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@2x.png new file mode 100644 index 0000000..c10409b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@3x.png b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@3x.png new file mode 100644 index 0000000..a28bac2 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/Positive/TabBar/Bottom Play'logo.imageset/Group_1597880620@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/Positive/TabBar/Contents.json b/MusicPlayer/Assets.xcassets/Positive/TabBar/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Positive/TabBar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@2x.png new file mode 100644 index 0000000..2245f64 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@3x.png new file mode 100644 index 0000000..669c4b8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/About.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Contents.json new file mode 100644 index 0000000..63ccbc5 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275560@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275560@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@2x.png new file mode 100644 index 0000000..5603061 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@3x.png new file mode 100644 index 0000000..5e77053 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Add'logo.imageset/Group_1171275560@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Contents.json new file mode 100644 index 0000000..401fabb --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 22@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 22@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@2x.png new file mode 100644 index 0000000..6cc75e7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@3x.png new file mode 100644 index 0000000..14e9266 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Cancel'bg.imageset/Group 22@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Contents.json new file mode 100644 index 0000000..90946c9 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275540@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275540@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@2x.png new file mode 100644 index 0000000..17742c4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@3x.png new file mode 100644 index 0000000..401942b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Center'bg.imageset/Group_1171275540@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/Contents.json new file mode 100644 index 0000000..b7d065d --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "base@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "base@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@2x.png new file mode 100644 index 0000000..e8459e6 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@3x.png new file mode 100644 index 0000000..5bf88f3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Click to import'bg.imageset/base@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Contents.json new file mode 100644 index 0000000..8ddc620 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 23@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 23@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@2x.png new file mode 100644 index 0000000..3747c19 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@3x.png new file mode 100644 index 0000000..606a074 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Confirm'bg.imageset/Group 23@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Contents.json new file mode 100644 index 0000000..8ddc620 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 23@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 23@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@2x.png new file mode 100644 index 0000000..585b148 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@3x.png new file mode 100644 index 0000000..27ac16b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Delete'bg.imageset/Group 23@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Contents.json new file mode 100644 index 0000000..5e88ec1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@2x.png new file mode 100644 index 0000000..4e924dd Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@3x.png new file mode 100644 index 0000000..ffe1095 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Feedback.imageset/Frame_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/Contents.json new file mode 100644 index 0000000..599f113 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_arrow-left@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon_arrow-left@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@2x.png new file mode 100644 index 0000000..7205be3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@3x.png new file mode 100644 index 0000000..59f2e36 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Go'logo.imageset/icon_arrow-left@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/Contents.json new file mode 100644 index 0000000..320c9ff --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "MUSICOO@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "MUSICOO@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@2x.png new file mode 100644 index 0000000..89acfc1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@3x.png new file mode 100644 index 0000000..fa72ce7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/MUSICOO'logo.imageset/MUSICOO@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Contents.json new file mode 100644 index 0000000..f66fa84 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275539@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275539@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@2x.png new file mode 100644 index 0000000..d3f641c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@3x.png new file mode 100644 index 0000000..dc17be7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/More'logo.imageset/Group_1171275539@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/Contents.json new file mode 100644 index 0000000..3ee24a1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "btn_square@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "btn_square@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@2x.png new file mode 100644 index 0000000..b0acad2 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@3x.png new file mode 100644 index 0000000..f497fab Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Pop‘logo.imageset/btn_square@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Contents.json new file mode 100644 index 0000000..12f94d4 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_3@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_3@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@2x.png new file mode 100644 index 0000000..08e04c6 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@3x.png new file mode 100644 index 0000000..255c9fe Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Privacy Policy.imageset/Frame_3@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@2x.png new file mode 100644 index 0000000..08e2385 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@3x.png new file mode 100644 index 0000000..793032a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Category@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Contents.json new file mode 100644 index 0000000..869398c --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Set'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Category@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Category@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Contents.json new file mode 100644 index 0000000..73ff453 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Elements@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Elements@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@2x.png new file mode 100644 index 0000000..004eea2 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@3x.png new file mode 100644 index 0000000..8d423d0 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Set'mask.imageset/Elements@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Contents.json new file mode 100644 index 0000000..bec1dcc --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@2x.png new file mode 100644 index 0000000..6a32b0f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@3x.png new file mode 100644 index 0000000..50ed16a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Share.imageset/Frame_2@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Contents.json new file mode 100644 index 0000000..2d5bf9c --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame_4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame_4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@2x.png new file mode 100644 index 0000000..ce5cf3a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@3x.png new file mode 100644 index 0000000..612a071 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/Terms of Use.imageset/Frame_4@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Contents.json new file mode 100644 index 0000000..61de948 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1597880408@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1597880408@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@2x.png b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@2x.png new file mode 100644 index 0000000..ee8c976 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@3x.png b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@3x.png new file mode 100644 index 0000000..c10e2b3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Center/empty.imageset/Group_1597880408@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Contents.json new file mode 100644 index 0000000..1fbd3d9 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275452_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275452_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@2x.png new file mode 100644 index 0000000..2831694 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@3x.png new file mode 100644 index 0000000..7858f3b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'pause.imageset/Group_1171275452_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Contents.json new file mode 100644 index 0000000..5b983e4 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_40101@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_40101@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@2x.png new file mode 100644 index 0000000..1c036e7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@3x.png new file mode 100644 index 0000000..16bcab7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'placeholder.imageset/Rectangle_40101@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Contents.json new file mode 100644 index 0000000..940c4bd --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275452@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275452@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@2x.png new file mode 100644 index 0000000..9067e6b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@3x.png new file mode 100644 index 0000000..ae59a01 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home First'play.imageset/Group_1171275452@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@2x.png new file mode 100644 index 0000000..26968fc Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@3x.png new file mode 100644 index 0000000..e5a5769 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'pause.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Contents.json new file mode 100644 index 0000000..8e69084 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_40109@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_40109@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@2x.png new file mode 100644 index 0000000..a73b6ab Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@3x.png new file mode 100644 index 0000000..d1093f3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'placeholder.imageset/Rectangle_40109@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Contents.json new file mode 100644 index 0000000..1ab8c19 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275513@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275513@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@2x.png new file mode 100644 index 0000000..64a6f25 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@3x.png new file mode 100644 index 0000000..8ff4a8b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play 1.imageset/Group_1171275513@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Contents.json new file mode 100644 index 0000000..6a4d508 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@2x.png new file mode 100644 index 0000000..f12c195 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@3x.png new file mode 100644 index 0000000..f22087e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Fourth'play.imageset/Vector@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Contents.json new file mode 100644 index 0000000..a0aac2f --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_40105@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_40105@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@2x.png new file mode 100644 index 0000000..d20956c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@3x.png new file mode 100644 index 0000000..0860cb3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'placeholder.imageset/Rectangle_40105@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Contents.json new file mode 100644 index 0000000..a6e3ffd --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@2x.png new file mode 100644 index 0000000..5ec4566 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@3x.png new file mode 100644 index 0000000..6337f31 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home Second'play.imageset/Vector_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Contents.json new file mode 100644 index 0000000..dc6c167 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275509@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275509@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@2x.png new file mode 100644 index 0000000..545d1dd Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@3x.png new file mode 100644 index 0000000..959abde Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home'banner.imageset/Group_1171275509@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/Contents.json new file mode 100644 index 0000000..1057d71 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "背景@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "背景@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@2x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@2x.png new file mode 100644 index 0000000..e00fc3e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@3x.png b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@3x.png new file mode 100644 index 0000000..67a3141 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Home/Home'bg.imageset/背景@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Contents.json new file mode 100644 index 0000000..e2f920e --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275591@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275591@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@2x.png new file mode 100644 index 0000000..6fe7f66 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@3x.png new file mode 100644 index 0000000..07fa7ce Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto dark'logo.imageset/Group_1171275591@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Contents.json new file mode 100644 index 0000000..96bd0ba --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275591_1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275591_1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@2x.png new file mode 100644 index 0000000..4396c4a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@3x.png new file mode 100644 index 0000000..eac5ee8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto light'logo.imageset/Group_1171275591_1@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Contents.json new file mode 100644 index 0000000..e2f920e --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275591@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275591@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@2x.png new file mode 100644 index 0000000..b834084 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@3x.png new file mode 100644 index 0000000..811af69 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Auto playing'logo.imageset/Group_1171275591@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@2x.png new file mode 100644 index 0000000..93047c4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@3x.png new file mode 100644 index 0000000..9a63c2e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss dark'logo.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@2x.png new file mode 100644 index 0000000..e61eefe Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@3x.png new file mode 100644 index 0000000..5088bbe Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Dismiss light'logo.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Contents.json new file mode 100644 index 0000000..8755efe --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275592@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275592@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@2x.png new file mode 100644 index 0000000..defc42a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@3x.png new file mode 100644 index 0000000..ff01d99 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp dark'logo.imageset/Group_1171275592@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Contents.json new file mode 100644 index 0000000..3c59bd7 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275592_2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275592_2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@2x.png new file mode 100644 index 0000000..ebb69d6 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@3x.png new file mode 100644 index 0000000..8af954a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Lamp light'logo.imageset/Group_1171275592_2@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Contents.json new file mode 100644 index 0000000..2f9086d --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275600@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275600@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@2x.png new file mode 100644 index 0000000..55bccdf Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@3x.png new file mode 100644 index 0000000..8d38818 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'pause.imageset/Group_1171275600@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Contents.json new file mode 100644 index 0000000..569cad8 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275566@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275566@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@2x.png new file mode 100644 index 0000000..349da62 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@3x.png new file mode 100644 index 0000000..16c830d Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player State'play.imageset/Group_1171275566@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/Contents.json new file mode 100644 index 0000000..d3b9116 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image_294@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image_294@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@2x.png new file mode 100644 index 0000000..f0263e5 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@3x.png new file mode 100644 index 0000000..c3fa556 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player'bg.imageset/image_294@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Contents.json new file mode 100644 index 0000000..f88f5bc --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_40118@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_40118@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@2x.png new file mode 100644 index 0000000..cc111bc Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@3x.png new file mode 100644 index 0000000..f664ed8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Player'mask.imageset/Rectangle_40118@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/Contents.json new file mode 100644 index 0000000..0aa8122 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image_293@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image_293@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@2x.png new file mode 100644 index 0000000..6eff9e9 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@3x.png new file mode 100644 index 0000000..f58b947 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Pointer'logo.imageset/image_293@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Contents.json new file mode 100644 index 0000000..17198bb --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse_1176@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse_1176@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@2x.png new file mode 100644 index 0000000..45a98ff Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@3x.png new file mode 100644 index 0000000..37c1aaa Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb dark'logo.imageset/Ellipse_1176@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Contents.json new file mode 100644 index 0000000..17198bb --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse_1176@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse_1176@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@2x.png new file mode 100644 index 0000000..b8f5844 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@3x.png new file mode 100644 index 0000000..b301222 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Thumb light'logo.imageset/Ellipse_1176@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Contents.json new file mode 100644 index 0000000..8af6046 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275590@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275590@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@2x.png new file mode 100644 index 0000000..91fe40b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@3x.png new file mode 100644 index 0000000..1c4d558 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer dark'logo.imageset/Group_1171275590@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Contents.json new file mode 100644 index 0000000..68dd719 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275591_3@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275591_3@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@2x.png new file mode 100644 index 0000000..6573b38 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@3x.png new file mode 100644 index 0000000..1869f31 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer light'logo.imageset/Group_1171275591_3@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Contents.json new file mode 100644 index 0000000..ad389ff --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275599@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275599@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@2x.png new file mode 100644 index 0000000..8535fdd Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@3x.png new file mode 100644 index 0000000..3632081 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer playing'logo.imageset/Group_1171275599@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Contents.json new file mode 100644 index 0000000..79d4d9d --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275576@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275576@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@2x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@2x.png new file mode 100644 index 0000000..c7a2a10 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@3x.png b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@3x.png new file mode 100644 index 0000000..e9bb05b Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Player/Timer'bg.imageset/Group_1171275576@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach 1.png new file mode 100644 index 0000000..dd010c3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach.png b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach.png new file mode 100644 index 0000000..dd010c3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Beach.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Contents.json new file mode 100644 index 0000000..dfd0ed3 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Beach.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Beach.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Beach 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe 1.png new file mode 100644 index 0000000..5fe6b72 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe.png b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe.png new file mode 100644 index 0000000..5fe6b72 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Breathe.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Contents.json new file mode 100644 index 0000000..89d3046 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Breathe.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Breathe.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Breathe 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls 1.png new file mode 100644 index 0000000..0df8682 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls.png b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls.png new file mode 100644 index 0000000..0df8682 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Call of Seagulls.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Contents.json new file mode 100644 index 0000000..6fee98f --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Call of Seagulls.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Call of Seagulls.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Call of Seagulls 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds 1.png new file mode 100644 index 0000000..c76f631 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds.png b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds.png new file mode 100644 index 0000000..c76f631 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Chirping of Birds.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Contents.json new file mode 100644 index 0000000..1718270 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Chirping of Birds.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Chirping of Birds.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Chirping of Birds 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping 1.png new file mode 100644 index 0000000..e51164f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping.png b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping.png new file mode 100644 index 0000000..e51164f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Cicada Chirping.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Contents.json new file mode 100644 index 0000000..d650f09 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Cicada Chirping.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Cicada Chirping.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Cicada Chirping 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/Contents.json new file mode 100644 index 0000000..367e7b2 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "组 14 拷贝@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "组 14 拷贝@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@2x.png b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@2x.png new file mode 100644 index 0000000..42c01c7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@3x.png b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@3x.png new file mode 100644 index 0000000..fa8dfcd Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/End Of Days.imageset/组 14 拷贝@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Contents.json new file mode 100644 index 0000000..2546bdd --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Fireplace.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Fireplace 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace 1.png new file mode 100644 index 0000000..a4bf56c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace.png b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace.png new file mode 100644 index 0000000..a4bf56c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Fireplace.imageset/Fireplace.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Contents.json new file mode 100644 index 0000000..326bdef --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Howling Wind.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Howling Wind 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind 1.png new file mode 100644 index 0000000..cc94f0f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind.png b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind.png new file mode 100644 index 0000000..cc94f0f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Howling Wind.imageset/Howling Wind.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Contents.json new file mode 100644 index 0000000..110fd58 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Mountain stream.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Mountain stream 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream 1.png new file mode 100644 index 0000000..1779274 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream.png b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream.png new file mode 100644 index 0000000..1779274 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Mountain stream.imageset/Mountain stream.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Contents.json new file mode 100644 index 0000000..3b438e6 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Nocturnal Insects.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Nocturnal Insects 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects 1.png new file mode 100644 index 0000000..061d682 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects.png b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects.png new file mode 100644 index 0000000..061d682 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Nocturnal Insects.imageset/Nocturnal Insects.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Contents.json new file mode 100644 index 0000000..0141474 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Seawater Surging.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Seawater Surging 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging 1.png new file mode 100644 index 0000000..9979362 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging.png b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging.png new file mode 100644 index 0000000..9979362 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Seawater Surging.imageset/Seawater Surging.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Contents.json new file mode 100644 index 0000000..0b88947 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Shh Shh 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Shh Shh.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh 1.png new file mode 100644 index 0000000..bfc8bb4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh.png b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh.png new file mode 100644 index 0000000..bfc8bb4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Shh Shh.imageset/Shh Shh.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Contents.json new file mode 100644 index 0000000..12ff753 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Shhh….png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Shhh… 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh… 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh… 1.png new file mode 100644 index 0000000..ac41ed4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh… 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh….png b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh….png new file mode 100644 index 0000000..ac41ed4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Shhh….imageset/Shhh….png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Contents.json new file mode 100644 index 0000000..9516109 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Summer Insects.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Summer Insects 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects 1.png new file mode 100644 index 0000000..8d6235f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects.png b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects.png new file mode 100644 index 0000000..8d6235f Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Summer Insects.imageset/Summer Insects.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/Contents.json new file mode 100644 index 0000000..8e86021 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "TV.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "TV 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV 1.png new file mode 100644 index 0000000..8a4f123 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV.png b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV.png new file mode 100644 index 0000000..8a4f123 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/TV.imageset/TV.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Contents.json new file mode 100644 index 0000000..0b94aff --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Water droplet.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Water droplet 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet 1.png new file mode 100644 index 0000000..b101213 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet.png b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet.png new file mode 100644 index 0000000..b101213 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/Water droplet.imageset/Water droplet.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/Contents.json new file mode 100644 index 0000000..c8d28a2 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "waterfall.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "waterfall 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall 1.png b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall 1.png new file mode 100644 index 0000000..ad776a1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall 1.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall.png b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall.png new file mode 100644 index 0000000..ad776a1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/Source/waterfall.imageset/waterfall.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@2x.png new file mode 100644 index 0000000..6bec3de Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@3x.png new file mode 100644 index 0000000..60156f7 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'pause.imageset/Frame@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Contents.json new file mode 100644 index 0000000..98f6b5f --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275512@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275512@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@2x.png new file mode 100644 index 0000000..9f70573 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@3x.png new file mode 100644 index 0000000..d7cfde5 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'play.imageset/Group_1171275512@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Contents.json new file mode 100644 index 0000000..bdba09e --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275505@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275505@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@2x.png new file mode 100644 index 0000000..7195d13 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@3x.png new file mode 100644 index 0000000..e7f6e1a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Bottom'timer.imageset/Group_1171275505@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Contents.json new file mode 100644 index 0000000..2a190de --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_12@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_12@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@2x.png new file mode 100644 index 0000000..a66c42c Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@3x.png new file mode 100644 index 0000000..f9f300e Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'bg.imageset/Rectangle_12@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Contents.json new file mode 100644 index 0000000..4d305b3 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Ellipse_2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse_2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@2x.png new file mode 100644 index 0000000..f6b73d4 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@3x.png new file mode 100644 index 0000000..05364fc Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/BottomShow'logo.imageset/Ellipse_2@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Contents.json new file mode 100644 index 0000000..d9195ce --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275511@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275511@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@2x.png new file mode 100644 index 0000000..d12b716 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@3x.png new file mode 100644 index 0000000..7ecc03a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center 1.imageset/Group_1171275511@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Contents.json new file mode 100644 index 0000000..d9195ce --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275511@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275511@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@2x.png new file mode 100644 index 0000000..b6b517a Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@3x.png new file mode 100644 index 0000000..cb40fd1 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Center.imageset/Group_1171275511@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Contents.json new file mode 100644 index 0000000..dda42ab --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275514@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275514@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@2x.png new file mode 100644 index 0000000..db621b3 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@3x.png new file mode 100644 index 0000000..76f74a8 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home 1.imageset/Group_1171275514@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Contents.json new file mode 100644 index 0000000..2cdd1c3 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group_1171275510@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group_1171275510@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@2x.png new file mode 100644 index 0000000..39ce5dd Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@3x.png new file mode 100644 index 0000000..88f7abf Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/Home.imageset/Group_1171275510@3x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Contents.json b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Contents.json new file mode 100644 index 0000000..33b1008 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Rectangle_161123843@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Rectangle_161123843@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@2x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@2x.png new file mode 100644 index 0000000..94e75ba Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@2x.png differ diff --git a/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@3x.png b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@3x.png new file mode 100644 index 0000000..5e9d984 Binary files /dev/null and b/MusicPlayer/Assets.xcassets/SideA/TabBar/TabBar'bg.imageset/Rectangle_161123843@3x.png differ diff --git a/MusicPlayer/Info.plist b/MusicPlayer/Info.plist index 87b37da..d8c5b91 100644 --- a/MusicPlayer/Info.plist +++ b/MusicPlayer/Info.plist @@ -14,5 +14,11 @@ audio + NSLocationWhenInUseUsageDescription + "Musicoo" needs to obtain your location information in order to refine the preview music information provided to you! + NSLocationAlwaysUsageDescription + "Musicoo" needs to obtain your location information in order to refine the preview music information provided to you! + NSLocationAlwaysAndWhenInUseUsageDescription + "Musicoo" needs to obtain your location information in order to refine the preview music information provided to you! diff --git a/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift new file mode 100644 index 0000000..9f6c5ee --- /dev/null +++ b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_BaseViewController.swift @@ -0,0 +1,22 @@ +// +// MP_BaseViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/18. +// + +import UIKit + +class MP_BaseViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + //背景颜色黑色 + view.backgroundColor = .init(hex: "#151718") + navigationController?.navigationBar.isTranslucent = true + tabBarController?.tabBar.isTranslucent = true + //隐藏导航栏 + navigationController?.setNavigationBarHidden(true, animated: false) + } + +} diff --git a/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift new file mode 100644 index 0000000..68b6231 --- /dev/null +++ b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.swift @@ -0,0 +1,66 @@ +// +// LunchViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///启动页 +class MP_LunchViewController: UIViewController { + @IBOutlet weak var progressView: MP_Lunch_ProgressView!{ + didSet{ + progressView.layer.masksToBounds = true + } + } + //帧计时器 + private var timer:CADisplayLink! + //最大计时值 + private lazy var maxTimes:TimeInterval = 8 + //当前计时值 + private lazy var currentTimes:TimeInterval = 0 + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .init(hex: "#000000") + timer = CADisplayLink(target: self, selector: #selector(timerActionClick(_ :))) + //一秒执行多少次 + timer.preferredFramesPerSecond = 20 + //开辟线程 + timer.add(to: RunLoop.current, forMode: .common) + //启动计时器 + timer.isPaused = false + //获取定位权限 + MP_LocationManager.shared.setLocationPermission(self, complete: nil) + //获取youtube网站信息 + MP_WebWork.shared.pingYoutubeHome() + } + deinit { + //销毁计时器 + timer.invalidate() + timer = nil + } + //计时器执行事件 + @objc fileprivate func timerActionClick(_ link:CADisplayLink) { + if maxTimes > currentTimes { + //未加载完 + currentTimes += 0.05 + let value = currentTimes/maxTimes + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //设置进度条 + progressView.setProgress(value) + } + }else { + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + //停止计时器 + timer.isPaused = true + //加载完毕,判断并跳转 +// accessAppdelegate.switch_aSide() + accessAppdelegate.switch_positive() + } + } + } +} diff --git a/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.xib b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.xib new file mode 100644 index 0000000..db2202b --- /dev/null +++ b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_LunchViewController.xib @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_NavigationController.swift b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_NavigationController.swift new file mode 100644 index 0000000..8ae8eb0 --- /dev/null +++ b/MusicPlayer/MP/Common/Base(公用基类)/Controllers/MP_NavigationController.swift @@ -0,0 +1,42 @@ +// +// MP_NavigationController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/18. +// + +import UIKit + +class MP_NavigationController: UINavigationController { + override init(rootViewController: UIViewController) { + super.init(rootViewController: rootViewController) + if #available(iOS 15, *) { + let navBar = UINavigationBarAppearance() + navBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 20, weight: .heavy)] + navBar.backgroundEffect = nil + navBar.shadowColor = nil + //消除导航栏分割线 + navBar.configureWithTransparentBackground() + navBar.backgroundColor = .clear + rootViewController.navigationController?.navigationBar.scrollEdgeAppearance = navBar + rootViewController.navigationController?.navigationBar.standardAppearance = navBar + } + rootViewController.navigationController?.navigationBar.isTranslucent = false + rootViewController.navigationController?.navigationBar.shadowImage = UIImage() + //自定义导航栏颜色 + rootViewController.navigationController?.navigationBar.barTintColor = .clear + //设置导航栏标题颜色 + rootViewController.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white, NSAttributedString.Key.font : UIFont.systemFont(ofSize: 20, weight: .heavy)] + rootViewController.navigationController?.navigationBar.tintColor = .white + let item = UIBarButtonItem(title: "", style: .plain, target: self, action: nil) + item.tintColor = .white + rootViewController.navigationItem.backBarButtonItem = item + } + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override init(nibName nibNameorNil:String?,bundle nibBundleOrNil:Bundle?){ + super.init(nibName:nibNameorNil,bundle:nibBundleOrNil) + } + +} diff --git a/MusicPlayer/MP/Common/Base(公用基类)/Views/MP_Lunch_ProgressView.swift b/MusicPlayer/MP/Common/Base(公用基类)/Views/MP_Lunch_ProgressView.swift new file mode 100644 index 0000000..465283d --- /dev/null +++ b/MusicPlayer/MP/Common/Base(公用基类)/Views/MP_Lunch_ProgressView.swift @@ -0,0 +1,94 @@ +// +// Lunch_ProgressView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit + +class MP_Lunch_ProgressView: UIView { + struct Constant { + //进度条宽度 + static let lineWidth: CGFloat = 6*width + //进度槽颜色 + static let trackColor:UIColor = .init(hex: "#FFFFFF") + //进度条颜色 + static let progressColors:[CGColor] = [ + UIColor(red: 0.109, green: 0.784, blue: 0.932, alpha: 1).cgColor, + UIColor(red: 0.412, green: 0.996, blue: 0.451, alpha: 1).cgColor, + UIColor(red: 0.796, green: 0.839, blue: 0.294, alpha: 1).cgColor + ] + } + //渐变层 + private var gradientLayer:CAGradientLayer! + //进度槽 + private var trackLayer:CAShapeLayer! + //进度条路径(水平线) + private var path:UIBezierPath! + override init(frame: CGRect) { + super.init(frame: frame) + setUpLayers() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setUpLayers() + } + override func layoutSubviews() { + super.layoutSubviews() + } + override func draw(_ rect: CGRect) { + //初始化圆角矩形路径 + path = UIBezierPath() + //获取起点 + let startPoint = CGPoint(x: bounds.minX, y: bounds.maxY) + //获取终点 + let endPoint = CGPoint(x: bounds.maxX, y: bounds.maxY) + //路径起始点 + path.move(to: startPoint) + //增加路线 + path.addLine(to: endPoint) + //初始化进度槽 + trackLayer = .init() + //路径宽 + trackLayer.lineWidth = bounds.height + trackLayer.fillColor = UIColor.clear.cgColor + //路径颜色 + trackLayer.strokeColor = Constant.trackColor.cgColor + //设置起始点 + trackLayer.strokeStart = 0 + //设置当前点 + trackLayer.strokeEnd = 0 + //路径端口为圆形 + trackLayer.lineCap = .round + trackLayer.path = path.cgPath + layer.addSublayer(trackLayer) + //初始化渐变色进度条 + gradientLayer = .init() + //渐变层大小 + gradientLayer.frame = .init(x: 0, y: -2, width: bounds.size.width, height: bounds.size.height+1) +// gradientLayer.shadowPath = trackLayer.path + //渐变层颜色 + gradientLayer.colors = Constant.progressColors + //渐变层起始点 + gradientLayer.startPoint = .init(x: 0, y: 1) + //渐变层终点 + gradientLayer.endPoint = .init(x: 1, y: 1) + layer.addSublayer(gradientLayer) + //渐变层遮罩 + gradientLayer.mask = trackLayer + } + //layer添加 + private func setUpLayers() { + backgroundColor = .init(hex: "#FFFFFF", alpha: 0.15) + } + /// 渐变色执行方法 + /// - Parameter progress: 进度值 + func setProgress(_ progress: CGFloat) { + if progress <= 1 { + //进度条动画 + trackLayer.strokeEnd = progress + } + } +} diff --git a/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/.xccurrentversion b/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..e1ab6c2 --- /dev/null +++ b/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/.xccurrentversion @@ -0,0 +1,8 @@ + + + + + _XCCurrentVersionName + MusicPlayer.xcdatamodel + + diff --git a/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/MusicPlayer.xcdatamodel/contents b/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/MusicPlayer.xcdatamodel/contents new file mode 100644 index 0000000..db396b0 --- /dev/null +++ b/MusicPlayer/MP/Common/DataBase/MusicPlayer.xcdatamodeld/MusicPlayer.xcdatamodel/contents @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MusicPlayer/MP/Common/Extension(扩展)/Notification.swift b/MusicPlayer/MP/Common/Extension(扩展)/Notification.swift index 3f6ad73..01bfdc4 100644 --- a/MusicPlayer/MP/Common/Extension(扩展)/Notification.swift +++ b/MusicPlayer/MP/Common/Extension(扩展)/Notification.swift @@ -35,36 +35,46 @@ extension NotificationCenter{ enum Keys:String { ///切换taBarItem case switch_tabBarItem - ///倒计时过程(携带时间值) - case time_times - ///音量值改变 - case volume_change - ///启动音乐播放器 - case play_music - ///终止音乐播放器与倒计时 - case stop_music - ///暂停音乐播放器 - case pause_music - ///继续音乐播放器 - case resume_music - ///开启麦克风监听 - case open_monitor - ///关闭麦克风监听 - case stop_monitor - ///新增音乐选择页 - case new_choice - ///音乐创建成功 - case creat_music - ///音乐实体为空 - case null_music - ///收起音乐展示框 - case close_show - ///显示音乐展示框 - case display_show - ///隐藏音乐展示框 - case hidden_show - ///音乐实体重命名 - case rename_music + //MARK: - A面通知内容 + ///A面倒计时过程(携带时间值) + case sideA_time_times + ///A面音量值改变 + case sideA_volume_change + ///A面启动音乐播放器 + case sideA_play_music + ///A面终止音乐播放器与倒计时 + case sideA_stop_music + ///A面暂停音乐播放器 + case sideA_pause_music + ///A面继续音乐播放器 + case sideA_resume_music + ///A面开启麦克风监听 + case sideA_open_monitor + ///A面关闭麦克风监听 + case sideA_stop_monitor + ///A面新增音乐选择页 + case sideA_new_choice + ///A面音乐创建成功 + case sideA_creat_music + ///A面音乐实体为空 + case sideA_null_music + ///A面收起音乐展示框 + case sideA_close_show + ///A面显示音乐展示框 + case sideA_display_show + ///A面隐藏音乐展示框 + case sideA_hidden_show + ///A面音乐实体重命名 + case sideA_rename_music + //MARK: - b面通知内容 + ///预览数据已更新 + case positive_browses_reload + ///列表数据已更新 + case positive_list_reload + ///弹出音乐播放器 + case pup_player_vc + ///播放器页面更新 + case positive_player_reload } } } diff --git a/MusicPlayer/MP/Common/Macro(宏定义与全局量)/Macro.swift b/MusicPlayer/MP/Common/Macro(宏定义与全局量)/Macro.swift index b95efec..74279a6 100644 --- a/MusicPlayer/MP/Common/Macro(宏定义与全局量)/Macro.swift +++ b/MusicPlayer/MP/Common/Macro(宏定义与全局量)/Macro.swift @@ -34,8 +34,12 @@ let Phone_Model = UIDevice.current.model let System_Version = UIDevice.current.systemVersion ///获取当前系统语言 let Language_first_local = NSLocale.preferredLanguages.first! +///当前地区 +let Location_First = MP_LocationManager.shared.requestLocation() ///底部安全区域 let bottomPadding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 +///全局占位图 +let placeholderImage:UIImage = UIImage(named: "Home First'placeholder")! ///隐私政策网址 let privacyUrl:URL = .init(string: "https://musicoo.app/privacy")! ///用户协议网址 @@ -43,8 +47,10 @@ let serviceUrl:URL = .init(string: "https://musicoo.app/terms")! //MARK: - 全局变量与方法 ///总事件闭包 typealias ActionBlock = () -> Void? -///全局模态弹出类型 -var MPModalType:MPPresentModal = .Timer +///A面全局模态弹出类型 +var MPSideA_ModalType:MPSideA_PresentModal = .Timer +///B面全局模态弹出类型 +var MPPositive_ModalType:MPPositive_PresentModal = .PlayerList ///转时分值 func setTimesToMinSeconds(_ time:TimeInterval) -> String { //设置分钟 @@ -96,4 +102,13 @@ func authorize(observe:UIViewController) -> Bool{ } return false } - +///创建一个Label +func createLabel(_ text:String? = nil, font:UIFont, textColor:UIColor, textAlignment:NSTextAlignment, lines:Int = 1) -> UILabel { + let label = UILabel() + label.text = text ?? "text" + label.font = font + label.textColor = textColor + label.textAlignment = textAlignment + label.numberOfLines = lines + return label +} diff --git a/MusicPlayer/MP/Common/Protocol(公用协议)/CoreDataDelegete.swift b/MusicPlayer/MP/Common/Protocol(公用协议)/CoreDataDelegete.swift index 1244d15..802919e 100644 --- a/MusicPlayer/MP/Common/Protocol(公用协议)/CoreDataDelegete.swift +++ b/MusicPlayer/MP/Common/Protocol(公用协议)/CoreDataDelegete.swift @@ -9,12 +9,12 @@ import Foundation import CoreData // MARK: - CoreDataManageableDelegate 数据库管理协议 ///数据库管理协议,继承NSFetchRequestResult,方便调用更多方法 -protocol MPCoreDataManageableDelegate: NSFetchRequestResult { +protocol MP_CoreDataManageableDelegate: NSFetchRequestResult { ///实体名 static var entityName: String { get } } ///扩展数据库管理协议,继承NSManagedObject时,默认实现以下内容 -extension MPCoreDataManageableDelegate where Self: NSManagedObject { +extension MP_CoreDataManageableDelegate where Self: NSManagedObject { //根据类名设置实体名 static var entityName: String { return String(describing: self) @@ -26,9 +26,9 @@ extension MPCoreDataManageableDelegate where Self: NSManagedObject { } // MARK: - CoreDataOperationDelegate 数据库操作协议 ///数据库操作协议,创建,查询,删除,保存等 -protocol MPCoreDataOperationDelegate { +protocol MP_CoreDataOperationDelegate { //关联一个继承CoreDataManageableDelegate协议的实体,与泛型相似 - associatedtype ManagedObject: MPCoreDataManageableDelegate, NSManagedObject + associatedtype ManagedObject: MP_CoreDataManageableDelegate, NSManagedObject //创建实体 static func create() -> ManagedObject //查询指定条件实体 @@ -41,16 +41,16 @@ protocol MPCoreDataOperationDelegate { static func save() } ///扩展数据库操作协议,默认实现协议方法 -extension MPCoreDataOperationDelegate { +extension MP_CoreDataOperationDelegate { /// 创建实体 /// - Returns: 返回的实体 static func create() -> ManagedObject { //创建一个对应的实体 - guard let entity = NSEntityDescription.entity(forEntityName: ManagedObject.entityName, in: MPCoreDataHandlerManager.shared.context) else { + guard let entity = NSEntityDescription.entity(forEntityName: ManagedObject.entityName, in: MP_CoreDataHandlerManager.shared.context) else { fatalError("Failed to find entity description for \(ManagedObject.entityName)") } - return ManagedObject(entity: entity, insertInto: MPCoreDataHandlerManager.shared.context) + return ManagedObject(entity: entity, insertInto: MP_CoreDataHandlerManager.shared.context) } /// 查询指定条件实体 @@ -60,7 +60,7 @@ extension MPCoreDataOperationDelegate { let fetchRequest = ManagedObject.fetchRequest fetchRequest.predicate = predicate do { - return try MPCoreDataHandlerManager.shared.context.fetch(fetchRequest) + return try MP_CoreDataHandlerManager.shared.context.fetch(fetchRequest) } catch { print("Failed to fetch \(ManagedObject.entityName): \(error)") return [] @@ -71,7 +71,7 @@ extension MPCoreDataOperationDelegate { /// - Returns: 返回结果数组 static func fetchAll() -> [ManagedObject] { do { - return try MPCoreDataHandlerManager.shared.context.fetch(ManagedObject.fetchRequest) + return try MP_CoreDataHandlerManager.shared.context.fetch(ManagedObject.fetchRequest) } catch { print("Failed to fetch \(ManagedObject.entityName): \(error)") return [] @@ -80,12 +80,12 @@ extension MPCoreDataOperationDelegate { /// 从表删除实体 /// - Parameter object: 指定的实体 static func delete(_ object: ManagedObject) { - MPCoreDataHandlerManager.shared.context.delete(object) + MP_CoreDataHandlerManager.shared.context.delete(object) save() } /// 表执行保存 static func save() { - MPCoreDataHandlerManager.shared.saveContext() + MP_CoreDataHandlerManager.shared.saveContext() } } diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_MediaCenterManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_MediaCenterManager.swift new file mode 100644 index 0000000..2bb1ca4 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_MediaCenterManager.swift @@ -0,0 +1,620 @@ +// +// MPMediaCenterManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/11. +// + +import Foundation +import AVFoundation +import MediaPlayer +///播放器播放事件类型 +enum MPSideA_PlayerPlayActionType:Int { + ///正常播放 + case Normal = 0 + ///倒计时播放(用户添加倒计时) + case CountTime = 1 +} +///播放器播放状态 +enum MPSideA_PlayerStateType:Int { + ///未播放 + case Null = 0 + ///播放中 + case Playing = 1 + ///暂停 + case Pause = 2 +} +///倒计时状态 +enum MPSideA_TimerType:Int { + ///未启动 + case UnActivity = 0 + ///运行中 + case Playing = 1 + ///暂停中 + case Suspend = 2 +} +///倒计时规格等级 +enum MPSideA_CountTimerLevel:Int, CaseIterable { + case OFF = 0 + case _10 = 1 + case _20 = 2 + case _30 = 3 + case _60 = 4 + case _90 = 5 + ///标题 + var title:String{ + switch self { + case .OFF: + return "OFF" + case ._10: + return "10" + case ._20: + return "20" + case ._30: + return "30" + case ._60: + return "60" + case ._90: + return "90" + } + } + ///实际数值(分) + var mins:Int{ + switch self { + case .OFF: + return 0 + case ._10: + return 10 + case ._20: + return 20 + case ._30: + return 30 + case ._60: + return 60 + case ._90: + return 90 + } + } +} + + +///多媒体控制器(播放控制器,倒计时控制器,麦克风管理器) +class MPSideA_MediaCenterManager { + ///控制器单例 + static let shared = MPSideA_MediaCenterManager() + //MARK: - 各项工具 + //音乐播放器 + private var player:AVPlayer? + //远程控制中心 + private var center:MPRemoteCommandCenter? + //GCD倒计时器 + private var countTimer: DispatchSourceTimer? + //监听器(需要获取麦克风权限),通过监听器实时获取周遭分贝 + private var monitor:AVAudioRecorder? + //监听器设置参数字典 + private var monitorSetingsDic:[String : Any]? + //GCD监听计时器 + private var monitorTimer: DispatchSourceTimer? + + //MARK: - 实体与状态值 + ///音乐实体 + private var music:MPSideA_MusicModel? + ///获取音乐实体 + func getMusic() -> MPSideA_MusicModel?{ + return music + } + ///更改音乐实体 + func setMusic(_ music:MPSideA_MusicModel?) { + self.music = music + } + ///播放器播放方法 + private var playActionType:MPSideA_PlayerPlayActionType = .Normal + ///播放器播放状态(默认未播放) + private var playerState:MPSideA_PlayerStateType = .Null + ///获取播放器播放状态 + func getPlayerState() -> MPSideA_PlayerStateType { + return playerState + } + ///倒计时运行状态(默认未启动) + private var countTimeType:MPSideA_TimerType = .UnActivity + ///倒计时规格 (默认为OFF) + private var countTimerLevel:MPSideA_CountTimerLevel = .OFF + ///获取倒计时规格值 + func getCountTimerLevel() -> MPSideA_CountTimerLevel { + return countTimerLevel + } + ///监听器计时状态 + private var monitorTimerType:MPSideA_TimerType = .UnActivity + ///监听器是否活跃 + private var isMonitorActivity:Bool = false + //隐藏管理器初始化方法 + private init() { + //初始化时获取上次运行app时存入的最后一首音乐(保存的内容为音乐实体的identifier,具备唯一性) + let lastTitle = UserDefaults.standard.string(forKey: "Last") ?? "" + let last = MPSideA_MusicModel.fetch(.init(format: "identifier==%@", lastTitle)).first + //更新音乐实体(可选性) + music = last + // 添加观察者,监听播放结束事件 + NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem) + + //初始化监听器字典并添加设置参数 + monitorSetingsDic = + [ + //音频格式 + AVFormatIDKey:NSNumber(value: kAudioFormatLinearPCM), + //录音的声道数,立体声为双声道 + AVNumberOfChannelsKey: 2, + //录音质量 + AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, + //采样位数 + AVLinearPCMBitDepthKey:NSNumber(value:16), + AVEncoderBitRateKey : 320000, + //录音器每秒采集的录音样本数 + AVSampleRateKey : 44100.0 + ] + } + + //管理器销毁时 + deinit { + //解除监听 + NotificationCenter.default.removeObserver(self) + //释放播放器 + player = nil + //释放倒计时器 + countTimer?.cancel() + countTimer = nil + //释放监听器 + monitor = nil + monitorTimer?.cancel() + monitorTimer = nil + } + //MARK: - 播放器与倒计时器 + /// 启动播放器 + /// - Parameters: + /// - music: 音乐实体 + /// - actionType: 播放方法(正常播放/倒计时播发) + /// - countLevel: 如果倒计时播放则填入倒计时规格 + func playerStart(_ music:MPSideA_MusicModel, actionType:MPSideA_PlayerPlayActionType, countLevel: MPSideA_CountTimerLevel = .OFF) { + //检索倒计时器状态 + switch countTimeType { + case .UnActivity://未启动计时器 + break + case .Playing://计时器运行中 + if countTimer != nil { + //倒计时器具备实例,处于rsume中,可以直接销毁 + countTimer!.cancel() + countTimer = nil + } + case .Suspend://计时器暂停中,销毁计时器 + if countTimer != nil { + //倒计时器具备实例,处于suspend中,可以直接销毁 + countTimer!.resume() + countTimer!.cancel() + countTimer = nil + } + } + //检索当前音乐播放器状态 + switch playerState { + case .Null://未播放,跳过 + break + case .Playing://播放中 + //销毁播放器 + if player != nil { + player!.pause() + player = nil + } + //发送停止音乐播放通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_stop_music) + case .Pause://暂停中 + //销毁播放器 + if player != nil { + player = nil + } + //发送停止音乐播放通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_stop_music) + } + //更新播放方法 + playActionType = actionType + //检索播放方法 + switch playActionType { + case .Normal://正常播放 + playMusic(music) + case .CountTime://倒计时播放 + //更新倒计时规格 + countTimerLevel = countLevel + countTimerStart(Double(countLevel.mins*60), music: music) + } + } + //倒计时播放时触发 + private func countTimerStart(_ totalTimes:TimeInterval, music:MPSideA_MusicModel) { +// //检索倒计时器状态 +// switch countTimeType { +// case .UnActivity://未启动计时器 +// break +// case .Playing://计时器运行中 +// if countTimer != nil { +// //倒计时器具备实例,处于rsume中,可以直接销毁 +// countTimer!.cancel() +// countTimer = nil +// } +// case .Suspend://计时器暂停中,销毁计时器 +// if countTimer != nil { +// //倒计时器具备实例,处于suspend中,可以直接销毁 +// countTimer!.resume() +// countTimer!.cancel() +// countTimer = nil +// } +// } + //创建倒计时器队列 + let queue = DispatchQueue(label: "com.MPCountTimer.queue") + //创建倒计时器 + countTimer = DispatchSource.makeTimerSource(queue: queue) + //设置计时器的起始时间以及触发事件频率为一秒一次 + countTimer!.schedule(deadline: .now(), repeating: .seconds(1)) + //将总时间值赋予times + var times = totalTimes + //计时器设置触发事件 + countTimer!.setEventHandler(handler: { + [weak self] in + //判断时间值是否归零 + if times > 0 { + //未归0,倒计时-1 + times -= 1 + //打印倒计时 + print(setTimesToMinSeconds(times)) + //发布时间值变化通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_time_times, object: times) + }else { + //执行结束事件 + self?.playerStop() + } + }) + //启动倒计时器 + countTimeType = .Playing + countTimer!.resume() + print("The CountTimer has started.") + //调用音乐播放器 + playMusic(music) + } + + //启动播放器 + private func playMusic(_ music:MPSideA_MusicModel) { + //根据音乐实体类型 + self.music = music + player_play(self.music!.isLocal ? musicLocal():musicDocument()) + } + //音乐为本地文件 + private func musicLocal() -> URL { + //本地文件,mp3格式 + let url:URL = .init(fileURLWithPath: Bundle.main.path(forResource: music!.path, ofType: "mp3")!) + return url + } + //音乐为沙盒文件 + private func musicDocument() -> URL { + var url:URL! + //用户上传文件,文件路径设置为沙盒 + let directory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + //获取沙盒中的数据 + let vedioUrl = URL(fileURLWithPath:URL(fileURLWithPath: directory).appendingPathComponent((music!.path)).path) + //检索路径是否安全授权 + let authozied = vedioUrl.startAccessingSecurityScopedResource() + if authozied == true { + //允许安全访问路径,调出文件协调器解码并获取真实文件地址 + let fileCoordinator = NSFileCoordinator() + fileCoordinator.coordinate(readingItemAt: vedioUrl, options: .withoutChanges, error: nil) { (newUrl) in + url = newUrl + } + }else { + //未能获取安全授权,强制获取 + url = vedioUrl + } + //停止安全访问权限 + vedioUrl.stopAccessingSecurityScopedResource() + return url + } + //播放音乐 + private func player_play(_ url:URL) { + //检索真实路径对应的文件是否存在 + if FileManager.default.fileExists(atPath: url.path) == true { + //当前路径的文件正式存在 + //初始化播放器 + let playerItem = AVPlayerItem(url: url) + //创建AVPlayer + player = AVPlayer(playerItem: playerItem) + //正式播放 + player?.play() + playerState = .Playing + //启动远程中心并配置相关内容 + setCommandCenter(music!) + //发送播放器启动通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_play_music) + //更新最后一次播放内容 + music!.lastTime = Date().timeZone() + MPSideA_MusicModel.save() + UserDefaults.standard.set(music!.identifier, forKey: "Last") + }else { + //文件不存在,通知用户删除该音乐实体 + print("Couldn't find the file.") + playerState = .Null + music = nil + //发送音乐缺失通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_null_music) + } + } + ///暂停播放器 + func playerPause() { + //检索播放状态,是否进行中 + guard playerState == .Playing, let player = player else { + //未处于播放中 + print("Player is not in playing") + return + } + //处于播放中,检索播放方法 + switch playActionType { + case .Normal://正常播放 + player_pause(player) + case .CountTime://倒计时播放 + //检索倒计时器状态,是否进行中 + guard countTimeType == .Playing, let countTimer = countTimer else { + //倒计时器未运行 + print("CountTimer is not playing") + return + } + //倒计时运行中,暂停倒计时 + countTimer.suspend() + countTimeType = .Suspend + //暂停播放 + player_pause(player) + } + } + //暂停播放 + private func player_pause(_ player:AVPlayer) { + //暂停播放器 + player.pause() + //切换播放器状态 + playerState = .Pause + //发布音乐暂停公告 + NotificationCenter.notificationKey.post(notificationName: .sideA_pause_music) + } + ///继续播放器 + func playerResume() { + //检索播放状态,是否暂停中 + guard playerState == .Pause, let player = player else { + //未处于暂停中 + print("Player is not paused") + return + } + //处于暂停中,检索播放方法 + switch playActionType { + case .Normal://正常播放 + player_resume(player) + case .CountTime://倒计时播放 + //检索倒计时器状态,是否暂停中 + guard countTimeType == .Suspend, let countTimer = countTimer else { + //倒计时器未暂停 + print("CountTimer is not paused") + return + } + //倒计时暂停中,运行倒计时 + countTimer.resume() + countTimeType = .Playing + //继续播放 + player_resume(player) + } + } + //继续播放 + private func player_resume(_ player:AVPlayer) { + //继续播放器 + player.play() + //切换播放器状态 + playerState = .Playing + //发布音乐继续公告 + NotificationCenter.notificationKey.post(notificationName: .sideA_resume_music) + } + ///停止播放器 + func playerStop() { + //检索播放状态,是否已启动 + guard playerState != .Null, let player = player else { + //未启动 + print("Player is not started") + return + } + //处于启动中,检索播放方法 + switch playActionType { + case .Normal://正常播放 + player_stop(player) + case .CountTime://倒计时播放 + //检索倒计时器状态,是否已启动 + guard countTimeType != .UnActivity, let countTimer = countTimer else { + //倒计时器未启动 + print("CountTimer is not started") + return + } + //倒计时器已启动,终止倒计时 + if countTimeType == .Suspend { + countTimer.resume() + } + countTimer.cancel() + self.countTimer = nil + //当计时器终止后,将计时等级回正为off + countTimerLevel = .OFF + //停止音乐播放 + player_stop(player) + } + } + //停止播放 + private func player_stop(_ player:AVPlayer) { + player.pause() + self.player = nil + playerState = .Null + //回正播放类型 + playActionType = .Normal + //发送停止音乐播放通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_stop_music) + } + //播放器停止 + @objc private func playerDidFinishPlaying() { + guard playerState == .Playing, let player = player else { + return + } + // 重置播放时间到开始 + player.seek(to: CMTime.zero) + // 继续播放 + player.play() + } + //MARK: - 远程中心 + private func setCommandCenter(_ music:MPSideA_MusicModel) { + // 实例化远程控制中心 + center = MPRemoteCommandCenter.shared() + + //设置控制中心各项操作 + //播放 + center!.playCommand.addTarget(handler: { [weak self] (event) in + guard let self = self else { return .noActionableNowPlayingItem} + if self.music != nil { + + return .success + }else { + return .noActionableNowPlayingItem + } + }) + //暂停 + center!.pauseCommand.addTarget(handler: { [weak self] (event) in + guard let self = self else { return .noActionableNowPlayingItem} + if self.music != nil { + + return .success + }else { + return .noActionableNowPlayingItem + } + }) + //设置info字典信息 + var info = [String:Any]() + //展示标题 + info[MPMediaItemPropertyTitle] = music.title ?? "" + //设置艺术家 +// info[MPMediaItemPropertyArtist] = "" + //设置专辑 +// info[MPMediaItemPropertyAlbumTitle] = "" + //设置歌曲时长 +// info[MPMediaItemPropertyPlaybackDuration] = 0 + //设置歌曲封面 + if let image = UIImage(data: music.cover) { + info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { size in + return image + }) + } + //更新远程中心 + MPNowPlayingInfoCenter.default().nowPlayingInfo = info + } + //MARK: - 麦克风监听器 + ///开启监听器 + func openMonitor(_ decibels:Double) { + //优先检索倒计时器和播放器状态 + if countTimeType != .UnActivity || playerState != .Null { + //有一项处于启动中,终止该事件 + playerStop() + } + //检索监听器计时状态 + switch monitorTimerType { + case .UnActivity://未启动监听器计时 + break + case .Playing://监听器计时运行中 + if monitorTimer != nil { + //倒计时器具备实例,处于rsume中,可以直接销毁 + monitorTimer!.cancel() + monitorTimer = nil + } + case .Suspend://监听器计时暂停中 + if monitorTimer != nil { + //倒计时器具备实例,处于suspend中,可以直接销毁 + monitorTimer!.resume() + monitorTimer!.cancel() + monitorTimer = nil + } + } + //创建计时器队列 + let queue = DispatchQueue(label: "com.MPMonitorTimer.queue") + //实例化监听器计时 + monitorTimer = DispatchSource.makeTimerSource(queue: queue) + //设置计时器的起始时间以及触发事件频率为一秒一次 + monitorTimer!.schedule(deadline: .now(), repeating: .seconds(1)) + //计时器设置触发事件 + monitorTimer!.setEventHandler(handler: { + [weak self] in + guard let self = self else { return } + //每秒触发一次监听器,获取当前麦克风分贝值 + let currentDecibels = checkDecibels() + //根据分贝值大小,判断是否启动音乐播放器 + if currentDecibels > decibels { + guard let music = self.music else { + return + } + //启动十分钟计时器 + playerStart(music, actionType: .CountTime, countLevel: ._10) + //停止监听器 + stopMonitor() + } + }) + //先删除监听器缓存内容,并释放监听器 + monitor?.deleteRecording() + monitor = nil + var url:URL? + let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "/play" + //生成空路径 + if #available(iOS 16.0, *) { + url = URL(filePath: path) + } else { + url = URL(fileURLWithPath: path) + } + //重新实例化监听器 + do { + //初始化监听器 + monitor = try AVAudioRecorder(url: url!, settings: monitorSetingsDic!) + //开启仪表计数功能 + monitor!.isMeteringEnabled = true + //准备监听 + monitor!.prepareToRecord() + //开始监听 + monitor!.record() + //启动监听器计时 + monitorTimerType = .Playing + isMonitorActivity = true + monitorTimer!.resume() + //发送开启监听通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_open_monitor) + print("The monitor has open.") + } catch let error { + print("Monitor initialization failure:\(error.localizedDescription)") + } + } + ///终止监听器运行 + func stopMonitor() { + guard let timer = monitorTimer, let monitor = monitor else { return } + //停止并销毁计时器和监听器 + if monitorTimerType == .Suspend { + timer.resume() + } + timer.cancel() + self.monitorTimer = nil + monitorTimerType = .UnActivity + isMonitorActivity = false + monitor.stop() + self.monitor = nil + //发送关闭监听通知 + NotificationCenter.notificationKey.post(notificationName: .sideA_stop_monitor) + print("The monitor has stoped") + + } + //检测麦克风音量 + private func checkDecibels() -> Double{ + // 刷新音量数据 + monitor!.updateMeters() + let power = monitor!.peakPower(forChannel: 0) + //获取分贝 基本在0-1之间 可能超过1 + let decibels:Double = pow(Double(10), Double(0.05*power)) + print("Current decibels: \(decibels)") + return decibels + } +} + diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_VolumeManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_VolumeManager.swift new file mode 100644 index 0000000..a928a20 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MPSideA_VolumeManager.swift @@ -0,0 +1,81 @@ +// +// MPVolumeManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/29. +// + +import Foundation +import UIKit +import MediaPlayer +import AVFoundation +///音量控制器(获取修改系统音量) +class MPSideA_VolumeManager:NSObject { + static let shared = MPSideA_VolumeManager() + //系统音量控制View + private var volumeView:MPVolumeView? + //自定义渐变色Slider + private var systemVolumeSlider: UISlider? + private override init() { + super.init() + //为音频会话添加KVO监听 + AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: [.old, .new], context: nil) + } + deinit { + //移除所有监听 + AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume") + } + //重新持有系统volum控制器 + func createVolume() { + volumeView = .init() + // 添加音量视图到界面,但隐藏它 + volumeView!.frame = CGRect(x: -100, y: -100, width: 0, height: 0) + UIApplication.shared.windows.first?.addSubview(volumeView!) + // 查找系统音量滑块 + for view in volumeView!.subviews { + if let slider = view as? UISlider { + systemVolumeSlider = slider + break + } + } + } + //销毁系统volum控制器 + func destroyVolume() { + guard volumeView != nil else { + return + } + volumeView!.removeFromSuperview() + systemVolumeSlider = nil + volumeView = nil + } + //设置系统音量 + func setVolume(_ volume: Float) { + systemVolumeSlider?.setValue(volume, animated: false) + } + //获取系统音量 + func getVolume() -> Float { + //获取AVAudioSession + getSystemVolume() + } + //获取系统音量 + private func getSystemVolume() -> Float{ + let audioSession = AVAudioSession.sharedInstance() + do { + try audioSession.setActive(true) + return audioSession.outputVolume + } catch { + print("Error getting system volume: \(error.localizedDescription)") + return 0.0 + } + } + //KVO + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "outputVolume" { + if let volume = change?[.newKey] as? Float { + + //将获得volume值通知传出 + NotificationCenter.notificationKey.post(notificationName: .sideA_volume_change, object: volume) + } + } + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_CoreDataHandlerManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_CoreDataHandlerManager.swift new file mode 100644 index 0000000..9053e6e --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_CoreDataHandlerManager.swift @@ -0,0 +1,48 @@ +// +// MPCoreDataHandlerManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/1. +// + +import Foundation +import CoreData + +///CoreData数据库处理器 +class MP_CoreDataHandlerManager { + //单例工具 + static let shared = MP_CoreDataHandlerManager() + //数据仓库 + private lazy var persistentContainer: NSPersistentContainer = { + //数据仓库名为XXX.cdatamodeld中的XXX + let container = NSPersistentContainer(name: "MusicPlayer") + container.loadPersistentStores { (_, error) in + if let error = error { + //加载数据仓库失败 + fatalError("Failed to load persistent stores: \(error)") + }else { + //加载数据仓库成功 + print("Successfully to load persistent stores") + } + } + return container + }() + //托管(映射)对象空间 + var context: NSManagedObjectContext { + return persistentContainer.viewContext + } + //保存对象空间 + func saveContext() { + //检索对象空间是否进行了更新 + if context.hasChanges { + do { + //保存对象空间 + try context.save() + } catch { + //保存失败 + let nserror = error as NSError + fatalError("Unresolved error \(nserror), \(nserror.userInfo)") + } + } + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_HUD.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_HUD.swift new file mode 100644 index 0000000..c68df0e --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_HUD.swift @@ -0,0 +1,84 @@ +// +// MPHUD.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/11. +// + +import UIKit +import SVProgressHUD +///二次封装hud +class MP_HUD: NSObject { + //HUD输出状态 + enum status { + ///成功 + case success + ///失败 + case error + ///只显示文字 + case onlyText + ///过程 + case progress + ///加载数据 + case loading + } + ///文本HUD + static func text(_ text:String?,delay:TimeInterval,completion:(() -> Void)?){ + showWithStatus(hudStatus: .onlyText, text: text, delay: delay, completion: completion) + } + + ///等待HUD + static func progress(_ text:String?,delay:TimeInterval,completion:(() -> Void)?){ + showWithStatus(hudStatus: .progress, text: text, delay: delay, completion: completion) + } + ///数据HUD + static func loading(_ delay:TimeInterval,completion:(() -> Void)?){ + showWithStatus(hudStatus: .loading, text: nil, delay: delay, completion: completion) + } + ///成功HUD + static func success(_ text:String?,delay:TimeInterval,completion:(() -> Void)?){ + showWithStatus(hudStatus: .success, text: text, delay: delay, completion: completion) + } + ///错误HUD + static func error(_ text:String?,delay:TimeInterval,completion:(() -> Void)?){ + showWithStatus(hudStatus: .error, text: text, delay: delay, completion: completion) + } + //立刻隐藏当前HUD + static func hideNow() { + SVProgressHUD.dismiss() + } + + /// 展示HUD + /// - Parameters: + /// - status: HUD状态 + /// - text: 显示文本 + /// - delay: 显示时常 + static func showWithStatus(hudStatus status: status, text: String?, delay: TimeInterval ,completion:(() -> Void)?) { + SVProgressHUD.setDefaultStyle(.light) + SVProgressHUD.setDefaultMaskType(.clear) + SVProgressHUD.setBackgroundColor(.white) + SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: 0)) + switch status { + case .success: + SVProgressHUD.showSuccess(withStatus: text) + SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 80 * width)) + case .error: + SVProgressHUD.showError(withStatus: text) + case .onlyText: + SVProgressHUD.setOffsetFromCenter(.init(horizontal: 0, vertical: (screen_Height / 2) - 85 * width)) + SVProgressHUD.setMinimumSize(CGSize(width: 100 * width, height: 40 * width)) + SVProgressHUD.show(UIImage(), status: text) + case .loading: + SVProgressHUD.setBackgroundColor(.white) + SVProgressHUD.show() + default: + SVProgressHUD.show(withStatus: text) + } + SVProgressHUD.dismiss(withDelay: delay) { + guard let completion = completion else{ + return + } + completion() + } + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_LocationManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_LocationManager.swift new file mode 100644 index 0000000..82beaf3 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_LocationManager.swift @@ -0,0 +1,167 @@ +// +// MP_LocationManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/23. +// + +import Foundation +import CoreLocation + +class MP_LocationManager: NSObject { + static let shared = MP_LocationManager() + var getAuthHandle: ((_ success: Bool) -> Void)? + //位置管理 + private var locationManager: CLLocationManager! + //定位信息(字符串) + private var location:String = "US" + override init() { + super.init() + locationManager = CLLocationManager() + //设置了精度最差的 3公里内 kCLLocationAccuracyThreeKilometers + locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers + locationManager.delegate = self + + } + + /// 获取定位权限并处理新事件 + /// - Parameter complete: 尾随事件 + func setLocationPermission(_ viewController:UIViewController ,complete:(() -> Void)?) { + if MP_LocationManager().hasLocationPermission() == true { + //成功获取权限 + if complete != nil { + complete!() + } + }else { + //未获取权限 + switch MP_LocationManager().locationPermission() { + case .notDetermined: + MP_LocationManager().requestLocationAuthorizaiton() + case .restricted, .denied: + DispatchQueue.main.async { + let alertController = UIAlertController(title: "Location permission request", message: "“Musicoo” needs to obtain your location information in order to refine the preview music information provided to you!", preferredStyle: .alert) + let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) + let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in + let url = URL(string: UIApplication.openSettingsURLString) + if let url = url,UIApplication.shared.canOpenURL(url){ + if #available(iOS 10, *) { + UIApplication.shared.open(url, options:[:], completionHandler: nil) + }else{ + UIApplication.shared.canOpenURL(url) + } + } + } + alertController.addAction(CancelAction) + alertController.addAction(OKAction) + viewController.present(alertController, animated: true, completion: nil) + } + default: + if complete != nil { + complete!() + } + } + } + } + + /// 设备是否开启了定位服务 + fileprivate func hasLocationService() -> Bool { + + return CLLocationManager.locationServicesEnabled() + + } + /// APP是否有定位权限 + fileprivate func hasLocationPermission() -> Bool { + + switch locationPermission() { + case .notDetermined, .restricted, .denied: + return false + case .authorizedWhenInUse, .authorizedAlways: + return true + default: + break + } + return false + } + + /// 定位的权限 + fileprivate func locationPermission() -> CLAuthorizationStatus { + if #available(iOS 14.0, *) { + let status: CLAuthorizationStatus = locationManager.authorizationStatus + print("location authorizationStatus is \(status.rawValue)") + return status + } else { + let status = CLLocationManager.authorizationStatus() + print("location authorizationStatus is \(status.rawValue)") + return status + } + } + + + //MARK: - 获取权限,在代理‘didChangeAuthorization’中拿到结果 + func requestLocationAuthorizaiton() { + locationManager.requestWhenInUseAuthorization() + + } + //MARK: - 获取位置 + func requestLocation() -> String { + //请求地理位置 + locationManager.requestLocation() + return location + } +} +extension MP_LocationManager: CLLocationManagerDelegate { + //MARK: - ios 14.0 之前,获取权限结果的方法 + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + handleChangedAuthorization() + } + + //MARK: - ios 14.0,获取权限结果的方法 + func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { + handleChangedAuthorization() + } + + private func handleChangedAuthorization() { + if let block = getAuthHandle, locationPermission() != .notDetermined { + if hasLocationPermission() { + block(true) + } else { + block(false) + } + } + } + //MARK: - 获取定位后的位置 + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + if let loction = locations.last { + //成功获取定位 + print("latitude: \(loction.coordinate.latitude) longitude:\(loction.coordinate.longitude)") + let geocoder = CLGeocoder() + geocoder.reverseGeocodeLocation(loction) { (placemarks, error) in + if let placemark = placemarks?.first { + //编码成功 + if let area = placemark.administrativeArea, !area.isEmpty { + print("Area code: \(area)") + self.location = area + } else if let locality = placemark.locality, !locality.isEmpty { + print("Area code: \(locality)") + self.location = locality + } else if let country = placemark.country, !country.isEmpty { + print("Country code: \(country)") + self.location = country + } + } + if let error = error { + print("Reverse geocoding failure: \(error.localizedDescription)") + //编码失败,默认设置位置是US + self.location = "US" + return + } + } + } + } + + func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + print("Reverse geocoding failure: \(error.localizedDescription)") + //编码失败,默认设置位置是US + self.location = "US" + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift new file mode 100644 index 0000000..c8934e4 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift @@ -0,0 +1,840 @@ +// +// MPNetWorkManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/11. +// + +import UIKit +import Network +import Alamofire +import AVFoundation +///预览闭包(传递一个预览模块数据组和完成状态) +typealias BrowseRequestStateBlock = (_ browse:[MPPositive_BrowseModuleListViewModel], _ isCompeleted:Bool) -> Void +///列表/专辑闭包(传递一个列表数据) +typealias ListRequestResultBlock = (_ list:MPPositive_ListAlbumListViewModel) -> Void +///网络状况管理器 +class MP_NetWorkManager: NSObject { + //单例工具 + static let shared = MP_NetWorkManager() + //MARK: - API接口 + ///域名链接 + private let header:String = "https://music.youtube.com" + ///端点 + private let point:String = "/youtubei/v1" + ///预览接口 + private let browse:String = "/browse" + ///相关接口 + private let next:String = "/next" + ///播放器接口 + private let player:String = "/player" + //MARK: - 固定参数 + //访问数据(首次首页预览时获得) + private var visitorData:String? + + //预览下一阶段参数(网络请求获取) + private var continuationAndItct:(String?,String?){ + willSet{ + //当获取新值后,判断新值是否存在,存在则继续串行异步请求 + guard let continuation = newValue.0, let itct = newValue.1, browseQueque != nil, let url = URL(string: header+point+browse) else { + //移除异步线程 + browseQueque = nil + return + } + //生成新参数 + var parameters:[String:Any] = [ + "ctoken":continuation, + "continuation":continuation, + "type":"next", + "itct":itct, + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + "visitorData":visitorData, + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + //执行异步请求 + browseQueque?.async { + [weak self] in + guard let self = self else { return } + requestPostHomeBrowse(url, parameters: parameters) + } + } + } + //MARK: - 异步队列 + //串行队列-预览 + private var browseQueque:DispatchQueue? + //MARK: - 闭包 + ///预览闭包(传递一个预览模块数据和完成状态) + var browseRequestStateBlock:BrowseRequestStateBlock? + ///列表专辑闭包(传递一个请求完成的列表数据) + var listRequestResultBlock:ListRequestResultBlock? + //私有初始化 + private override init() { + super.init() + } + + //MARK: - 网络情况 + ///检查网络状况 + func requestNetworkPermission(oberve:UIViewController, completeHanlder:ActionBlock?) { + let monitor = NWPathMonitor() + monitor.pathUpdateHandler = { path in + switch path.status { + case .satisfied: + DispatchQueue.main.async { + guard completeHanlder != nil else { + return + } + completeHanlder!() + } + default://网络权限出现问题 + DispatchQueue.main.async { + //次要处理 + let alertController = UIAlertController(title: "Access network request", message: "”Musicoo“ needs to be loaded via a network request. Please click “Settings” to allow this application to gain access to the network.", preferredStyle: .alert) + let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in + + } + let OKAction = UIAlertAction(title: "Settings", style: .default) { (action) in + let url = URL(string: UIApplication.openSettingsURLString) + if let url = url,UIApplication.shared.canOpenURL(url){ + if #available(iOS 10, *) { + UIApplication.shared.open(url, options: [:]) { (success) in + } + }else{ + UIApplication.shared.canOpenURL(url) + } + } + } + alertController.addAction(CancelAction) + alertController.addAction(OKAction) + oberve.present(alertController, animated: true, completion: nil) + } + } + } + let queue = DispatchQueue(label: "MPNetWorkManager") + monitor.start(queue: queue) + } +} +//MARK: - API请求 +extension MP_NetWorkManager { + ///向YouTubemusic请求预览/首页数据 + func requestBrowseDatas() { + //实行串行异步队列,进行多次请求。由于第一次之后的请求都必须携带对应的continuation编码,所以串行队列。直到最后一次请求的continuation值为空,销毁队列 + // 实例化串行队列 + browseQueque = DispatchQueue(label: "com.request.browseQueque") + //拼接出browse路径 + let path = header+point+browse + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //异步执行任务 + browseQueque?.async { + [weak self] in + //进行第一次请求,有预览ID,无continuation编码 + guard let self = self else { return } + let parameters:[String:Any] = [ + "browseId": "FEmusic_home", + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + requestPostHomeBrowse(url, parameters: parameters) + } + + } + //请求首页预览内容(执行多次) + private func requestPostHomeBrowse(_ url:URL, parameters:Parameters) { + //发送post请求,并将结果转为RootBrowses + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonBrowses.self) { [weak self] (response) in + guard let self = self else {return} + if let task = response.request { + print("URL: \(task.url!)") + } + switch response.result { + case .success(let value): + if value.responseContext?.visitorData != nil { + self.visitorData = value.responseContext?.visitorData + } + //解析结构体 + let tab = value.contents?.singleColumnBrowseResultsRenderer?.tabs?[0] + if let content = tab?.tabRenderer?.content { + parsingBrowseContents(content) + }else if let continuationContents = value.continuationContents { + parsingBrowseContinuationContents(continuationContents) + }else { + print("Failed to parse browses content") + } + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } + /// 向YouTubemusic请求列表/专辑数据,该接口调用的同样是browse预览接口 + /// - Parameters: + /// - item: 需要查看的模块 + func requestAlbumOrListDatas(_ item: MPPositive_BrowseItemViewModel) { + //拼接出browse路径 + let path = header+point+browse + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //设置参数,browseId与params参数是必定携带内容 + var parameters:[String:Any] = [ + "browseId":(item.browseItem.browseContent.browseId ?? ""), + "params":(item.browseItem.browseContent.params ?? ""), + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + requestPostAlbumOrList(url, parameters: parameters) + } + //请求列表/专辑数据 + private func requestPostAlbumOrList(_ url:URL, parameters:Parameters) { + //发送post请求,并将结果转为RootBrowses + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonListOrAlbum.self) { [weak self] (response) in + guard let self = self else {return} + if let task = response.request { + print("URL: \(task.url!)") + } + switch response.result { + case .success(let value): + let contents = value.contents + //创建一个列表ViewModel + let list = MPPositive_ListAlbumListViewModel() + if let content = contents?.singleColumnBrowseResultsRenderer?.tabs?.first?.tabRenderer?.content { + list.items = parsingListContents(content) + } + if let header = value.header { + list.header = .init(parsingListHeaders(header)) + } + //传递列表值 + guard listRequestResultBlock != nil else { + return + } + listRequestResultBlock!(list) + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } + ///请求Next列表(优先于Player) + /// - Parameter item: 请求的预览实体 + func requestNextList(_ item: MPPositive_BrowseItemViewModel, completion:@escaping(([MPPositive_SongItemModel]) -> Void)) { + //拼接出next路径 + let path = header+point+next + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //设置参数,videoId与params参数是必定携带内容 + var parameters:[String:Any] = [ + "playlistId":(item.browseItem.musicVideo.playListId ?? ""), + "videoId":(item.browseItem.musicVideo.videoId ?? ""), + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + //发送next列表请求 + requestPostNextList(url, parameters: parameters) { listSongs in + //成功拿到列表所有歌曲(内容尚不完善) + completion(listSongs) + } + } + ///请求Next歌词/相关内容 + /// - Parameter item: 请求的预览实体 + func requestNextLyricsAndRelated(_ item: MPPositive_SongItemModel, completion:@escaping(((String?,String?)) -> Void)) { + //拼接出next路径 + let path = header+point+next + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //设置参数,videoId与params参数是必定携带内容 + var parameters:[String:Any] = [ + "videoId":(item.videoId ?? ""), + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + //发送next列表歌词/相关内容请求 + requestPostNextLyricsAndRelated(url, parameters: parameters) { result in + completion(result) + } + } + //请求next列表 + private func requestPostNextList(_ url:URL, parameters:Parameters, completion:@escaping (([MPPositive_SongItemModel]) -> Void)) { + //发送post请求 + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in + guard let self = self else {return} + switch response.result { + case .success(let value): + //转化为list值 + let listSongs:[MPPositive_SongItemModel] = parsingNextList(value) + completion(listSongs) + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } + //请求请求Next歌词/相关内容 + private func requestPostNextLyricsAndRelated(_ url:URL, parameters:Parameters, completion:@escaping(((String?,String?)) -> Void)) { + //发送post请求 + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonNext.self) { [weak self] (response) in + guard let self = self else {return} + switch response.result { + case .success(let value): + let result = parsingNextLyricsAndRelated(value) + //回掉数据 + completion(result) + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } + /// 请求Player(单曲/视频)播放资源 + /// - Parameter item: 请求的预览实体 + func requestPlayer(_ item: MPPositive_SongItemModel, completion:@escaping (([String]?, [String]?) -> Void)){ + //拼接出player路径 + let path = header+point+player + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //设置参数,videoId与params参数是必定携带内容 + let parameters:[String:Any] = [ +// "playlistId":(item.browseItem.musicVideo.playListId ?? ""), + "videoId":(item.videoId ?? ""), + "prettyPrint":"false", + "context":[ + "client":[ + //当前访问版本(日期值) + "clientName": "WEB_REMIX", + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00" + ] + ], + "playbackContext": [ + "contentPlaybackContext": [ + "signatureTimestamp": MP_WebWork.shared.signatureTimestamp ?? 0 + ] + ] + ] + requestPostPlayer(url, parameters: parameters){ resourceUlrs, coverUrls in + completion(resourceUlrs, coverUrls) + } + } + //请求单曲/视频 + private func requestPostPlayer(_ url:URL, parameters:Parameters, completion:@escaping(([String]?, [String]?) -> Void)) { + //发送post请求 + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonPlayer.self) { [weak self] (response) in + guard let self = self else {return} + if let task = response.request { + print("URL: \(task.url!)") + } + switch response.result { + case .success(let value): + parsingPlayer(value) { resourceUlrs, coverUrls in + completion(resourceUlrs, coverUrls) + } + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } + + /// 请求歌词 + /// - Parameter lyricId: 歌词id + func requestLyric(_ lyricId:String, completion:@escaping((String) -> Void)) { + //拼接出browse路径 + let path = header+point+browse + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //设置参数,browseId与params参数是必定携带内容 + var parameters:[String:Any] = [ + "browseId":lyricId, + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": "1.\(Date().timeZone().toString(.custom("YYYYMMdd"))).01.00", + "platform":"DESKTOP", + //语言 + "hl":Language_first_local, + //地址 + "gl":Location_First + ] + ] + ] + requestPostLyric(url, parameters: parameters) { lyrics in + completion(lyrics) + } + } + //请求歌词 + private func requestPostLyric(_ url:URL, parameters:Parameters, completion:@escaping((String) -> Void)) { + //发送post请求 + AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonLyrics.self) { [weak self] (response) in + guard let self = self else {return} + switch response.result { + case .success(let value): + completion(parsingLyrics(value) ?? "") + case .failure(let error): + // 请求失败,处理错误 + print("Request failed: \(error)") + } + } + } +} +//MARK: - 数据解析 +extension MP_NetWorkManager { + //MARK: - 浅层解析 + ///解析预览内容_Contents + private func parsingBrowseContents(_ content:JsonBrowses.Contents.SingleColumnBrowseResultsRenderer.Tab.TabRenderer.Content) { + //获取预览结构体中需要的数据(模块标题;歌曲信息:封面路径,音乐标题,歌手姓名,列表id和视频id) + var browses:[MPPositive_BrowseModuleListViewModel] = [] + var continuation:String? + var itct:String? + //循环获取音乐内容 + content.sectionListRenderer?.contents?.forEach({ content in + //该循环获取预览模块内容,生成一个预览模型接收数据 + let browse = MPPositive_BrowseModuleListViewModel() + browse.title = content.musicCarouselShelfRenderer?.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.first?.text + //循环音乐内容组 + content.musicCarouselShelfRenderer?.contents?.forEach({ content in + //设置标题、歌手、专辑/列表 + if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { + browse.items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer))) + }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer { + browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) + } + }) + browses.append(browse) + }) + if let nextContinuationData = content.sectionListRenderer?.continuations?.first { + continuation = nextContinuationData.nextContinuationData?.continuation + itct = nextContinuationData.nextContinuationData?.clickTrackingParams + } + guard browseRequestStateBlock != nil else { + return + } + //传递解析数据 + self.browseRequestStateBlock!(browses, (continuation == nil)) + //重新赋值,直到没有下一阶段数据为止 + self.continuationAndItct = (continuation,itct) + } + ///解析预览内容_ContinuationContents + private func parsingBrowseContinuationContents(_ continuationContents:JsonBrowses.ContinuationContents) { + //获取预览结构体中需要的数据(模块标题;歌曲信息:封面路径,音乐标题,歌手姓名,列表id和视频id) + var browses:[MPPositive_BrowseModuleListViewModel] = [] + var continuation:String? + var itct:String? + //循环获取音乐内容 + continuationContents.sectionListContinuation?.contents?.forEach({ content in + //该循环获取预览模块内容,生成一个预览模型接收数据 + let browse = MPPositive_BrowseModuleListViewModel() + browse.title = content.musicCarouselShelfRenderer?.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.first?.text + //循环音乐内容组 + content.musicCarouselShelfRenderer?.contents?.forEach({ content in + //设置标题、歌手、专辑/列表 + if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { + browse.items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer))) + }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer { + browse.items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) + } + }) + browses.append(browse) + }) + if let nextContinuationData = continuationContents.sectionListContinuation?.continuations?.first { + continuation = nextContinuationData.nextContinuationData?.continuation + itct = nextContinuationData.nextContinuationData?.clickTrackingParams + } + guard browseRequestStateBlock != nil else { + return + } + //传递解析数据 + self.browseRequestStateBlock!(browses, (continuation == nil)) + //重新赋值,直到没有下一阶段数据为止 + self.continuationAndItct = (continuation,itct) + } + ///解析列表_Contents + private func parsingListContents(_ content:JsonListOrAlbum.Contents.SingleColumnBrowseResultsRenderer.Tab.TabRenderer.Content) -> [MPPositive_BrowseItemViewModel] { + var items:[MPPositive_BrowseItemViewModel] = [] + //循环获取音乐内容 + content.sectionListRenderer?.contents?.forEach({ content in + //循环音乐内容组 + if let musicPlaylistShelfRenderer = content.musicPlaylistShelfRenderer { + musicPlaylistShelfRenderer.contents?.forEach({ content in + //设置标题、歌手、专辑/列表 + if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { + items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer))) + }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer { + items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) + } + }) + }else if let musicShelfRenderer = content.musicShelfRenderer{ + musicShelfRenderer.contents?.forEach({ content in + //设置标题、歌手、专辑/列表 + if let musicResponsiveListItemRenderer = content.musicResponsiveListItemRenderer { + items.append(.init(parsingMusicResponsiveListItemRenderer(musicResponsiveListItemRenderer))) + }else if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer { + items.append(.init(parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer))) + } + }) + } + }) + return items + } + ///解析列表_Header + private func parsingListHeaders(_ header:JsonListOrAlbum.Header) -> MPPositive_ListHeaderModel { + let listHeader = MPPositive_ListHeaderModel() + if let musicDetailHeaderRenderer = header.musicDetailHeaderRenderer { + //主标题 + listHeader.maintitle = musicDetailHeaderRenderer.title?.runs?.reduce("", { $0 + ($1.text ?? "")}) + //次标题 + listHeader.subtitle = musicDetailHeaderRenderer.subtitle?.runs?.reduce("", { $0 + ($1.text ?? "")}) + //三级标题 + listHeader.thirdtitle = musicDetailHeaderRenderer.secondSubtitle?.runs?.reduce("", { $0 + ($1.text ?? "")}) + //说明/介绍 + listHeader.forDescription = musicDetailHeaderRenderer.description?.runs?.reduce("", { $0 + ($1.text ?? "")}) + //图片(默认获取最后/最大的) + listHeader.coverUrl = musicDetailHeaderRenderer.thumbnail?.croppedSquareThumbnailRenderer?.thumbnail?.thumbnails?.last?.url + }else if let musicImmersiveHeaderRenderer = header.musicImmersiveHeaderRenderer { + listHeader.maintitle = musicImmersiveHeaderRenderer.title?.runs?.reduce("", { $0 + ($1.text ?? "")}) + listHeader.forDescription = musicImmersiveHeaderRenderer.description?.runs?.reduce("", { $0 + ($1.text ?? "")}) + listHeader.coverUrl = musicImmersiveHeaderRenderer.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.last?.url + } + return listHeader + } + ///解析相关内容_Next_中的接下来播放列表 + private func parsingNextList(_ next:JsonNext) -> [MPPositive_SongItemModel] { + var array:[MPPositive_SongItemModel] = [] + if let tabs = next.contents?.singleColumnMusicWatchNextResultsRenderer?.tabbedRenderer?.watchNextTabbedResultsRenderer?.tabs { + if let tab = tabs.first { + //获取一张播放列表 + for (index, content) in (tab.tabRenderer?.content?.musicQueueRenderer?.content?.playlistPanelRenderer?.contents ?? []).enumerated() { + //生成一个音乐实体,用来装填部分数据 + let song = MPPositive_SongItemModel() + song.index = index + song.title = content.playlistPanelVideoRenderer?.title?.runs?.reduce("", { $0 + ($1.text ?? "")}) + song.longBylineText = content.playlistPanelVideoRenderer?.longBylineText?.runs?.reduce("", { $0 + ($1.text ?? "")}) + song.lengthText = content.playlistPanelVideoRenderer?.lengthText?.runs?.reduce("", { $0 + ($1.text ?? "")}) + song.shortBylineText = content.playlistPanelVideoRenderer?.shortBylineText?.runs?.reduce("", { $0 + ($1.text ?? "")}) + song.reviewUrls = content.playlistPanelVideoRenderer?.thumbnail?.thumbnails?.map({$0.url ?? ""}) + song.videoId = content.playlistPanelVideoRenderer?.videoId + array.append(song) + } + } + } + return array + } + + /// 解析相关内容_Next_中的歌词ID和相关内容ID(两个ID都适用于用brwose接口) + /// - Parameter next: 需要解析的next组 + /// - Returns: 0位是歌词ID,1位相关内容ID + private func parsingNextLyricsAndRelated(_ next:JsonNext) -> (String?,String?){ + if let tabs = next.contents?.singleColumnMusicWatchNextResultsRenderer?.tabbedRenderer?.watchNextTabbedResultsRenderer?.tabs { + if tabs.count == 3 { + //歌词ID + let lyrcisId = tabs[1].tabRenderer?.endpoint?.browseEndpoint?.browseId + //相关内容ID + let relatedID = tabs[2].tabRenderer?.endpoint?.browseEndpoint?.browseId + return (lyrcisId, relatedID) + }else if tabs.count == 2 { + //歌词ID + let lyrcisId = tabs[1].tabRenderer?.endpoint?.browseEndpoint?.browseId + return (lyrcisId, nil) + }else { + return (nil,nil) + } + }else { + return (nil,nil) + } + } + + /// 解析播放器_Player + /// - Parameters: + /// - player: player库 + /// - completion: 传递两个字符串数组,第一个资源路径组,第二个是封面路径组 + private func parsingPlayer(_ player:JsonPlayer, completion:@escaping(([String]?, [String]?) -> Void)){ + var infos:[String]? + //解析player,获取资源库和信息库 + if let videoDetails = player.videoDetails { + infos = parsingPlayerVideoDetails(videoDetails) + } + if let streamingData = player.streamingData { + parsingPlayerStreamingData(streamingData){ urls in + completion(urls,infos) + } + } + } + + /// 解析播放器_StreamingData + /// - Parameter streamingData: 资源库 + private func parsingPlayerStreamingData(_ streamingData:JsonPlayer.StreamingData, completion:@escaping(([String]) -> Void)) { + var group:DispatchGroup? = DispatchGroup() + var array:[String] = [] + let allFormats = (streamingData.formats ?? []) + (streamingData.adaptiveFormats ?? []) + for format in allFormats { + if let signatureCipher = format.signatureCipher { + // 进入DispatchGroup,表示开始一个异步任务 + group?.enter() + //获得资源签名,开始解密签名内容 + parsingPlayerSignatureCipher(signatureCipher) { result in + array.append(result) + // 离开DispatchGroup,表示异步任务完成 + group?.leave() + } + } + } + group?.notify(queue: .main) { + completion(array) + group = nil + } + } + ///解析加密签名_SignatureCipher + private func parsingPlayerSignatureCipher(_ signatureCipher:String, completion:@escaping((String) -> Void)) { +// print("Resources-SignatureCipher:\(signatureCipher)") + //该加密资源有两段式加密,先进行百分比加密解码 + let originalURLString = seperatorOff(String(signatureCipher)) + //第一段加密资源为权限资源 + guard let sRange = originalURLString.range(of: "s=") else { + return + } + guard let spSigRange = originalURLString.range(of: "&sp=sig", range: sRange.upperBound.. [String]? { + var urls:[String]? + videoDetails.thumbnail?.thumbnails?.forEach({ item in + if item.url != nil { + if urls != nil { + urls!.append(item.url!) + }else { + urls = [] + urls!.append(item.url!) + } + } + }) + return urls + } + ///解析歌词_Lyrics + private func parsingLyrics(_ lyrics:JsonLyrics) -> String? { + if let first = lyrics.contents?.sectionListRenderer?.contents?.first { + return first.musicDescriptionShelfRenderer?.description?.runs?.first?.text + } + return "" + } + + //MARK: - 解析具体内容形式 + //解析musicResponsiveListItemRenderer(单曲/视频) + private func parsingMusicResponsiveListItemRenderer(_ musicResponsiveListItemRenderer: RootMusicResponsiveListItemRenderer) -> MPPositive_BrowseItemModel { + //生成一个音乐模型接收数据 + let item = MPPositive_BrowseItemModel() + item.itemType = .single + //封面路径 + item.coverUrl = musicResponsiveListItemRenderer.thumbnail?.musicThumbnailRenderer?.thumbnail?.thumbnails?.last?.url + if let flexColumns = musicResponsiveListItemRenderer.flexColumns { + for (index,flexColumn) in flexColumns.enumerated() { + if index == 0 { + item.maintitle = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) + }else if index == 1 { + item.subtitle = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) + }else { + item.thirdtitle = flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.reduce("", { $0 + ($1.text ?? "")}) + } + var browseContent = BrowseItemContent() + flexColumn.musicResponsiveListItemFlexColumnRenderer?.text?.runs?.forEach({ run in + if run.navigationEndpoint?.browseEndpoint?.browseId != nil { + //获取到艺术家的ID + item.artistsId = run.navigationEndpoint?.browseEndpoint?.browseId + } + if run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != nil && run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_ARTIST" { + //专辑或则歌单 + browseContent.pageType = run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType + browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId + browseContent.params = run.navigationEndpoint?.browseEndpoint?.params + } +// if run.navigationEndpoint?.browseEndpoint?.browseId != nil { +// browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId +// } +// if run.navigationEndpoint?.browseEndpoint?.params != nil { +// browseContent.params = run.navigationEndpoint?.browseEndpoint?.params +// } + }) + item.browseContent = browseContent + } + } + //设置音乐id和列表id + if let watch = musicResponsiveListItemRenderer.overlay?.musicItemThumbnailOverlayRenderer?.content?.musicPlayButtonRenderer?.playNavigationEndpoint?.watchEndpoint { + var musicVideo = BrowseItemMusicVideo() + musicVideo.videoId = watch.videoId + musicVideo.playListId = watch.playlistId + musicVideo.musicVideoType = watch.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType + item.musicVideo = musicVideo + } + return item + } + //解析musicResponsiveListItemRenderer(list) + private func parsingMusicTwoRowItemRenderer(_ musicTwoRowItemRenderer: RootMusicTwoRowItemRenderer) -> MPPositive_BrowseItemModel { + //生成一个音乐模型接收数据 + let item = MPPositive_BrowseItemModel() + item.itemType = .list + //封面路径 + item.coverUrl = musicTwoRowItemRenderer.thumbnailRenderer?.musicThumbnailRenderer?.thumbnail?.thumbnails?.last?.url + //标题 + item.maintitle = musicTwoRowItemRenderer.title?.runs?.reduce("", { $0 + ($1.text ?? "")}) + //副标题 + item.subtitle = musicTwoRowItemRenderer.subtitle?.runs?.reduce("", { $0 + ($1.text ?? "")}) + var browseContent = BrowseItemContent() + musicTwoRowItemRenderer.title?.runs?.forEach({ run in + if run.navigationEndpoint?.browseEndpoint?.browseId != nil { + //获取到艺术家的ID + item.artistsId = run.navigationEndpoint?.browseEndpoint?.browseId + } + if run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != nil && run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_ARTIST" { + //专辑或则歌单 + browseContent.pageType = run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType + browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId + browseContent.params = run.navigationEndpoint?.browseEndpoint?.params + } +// if run.navigationEndpoint?.browseEndpoint?.browseId != nil { +// browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId +// } +// if run.navigationEndpoint?.browseEndpoint?.params != nil { +// browseContent.params = run.navigationEndpoint?.browseEndpoint?.params +// } + }) + musicTwoRowItemRenderer.subtitle?.runs?.forEach({ run in + if run.navigationEndpoint?.browseEndpoint?.browseId != nil { + //获取到艺术家的ID + item.artistsId = run.navigationEndpoint?.browseEndpoint?.browseId + } + if run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != nil && run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType != "MUSIC_PAGE_TYPE_ARTIST" { + //专辑或则歌单 + browseContent.pageType = run.navigationEndpoint?.browseEndpoint?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType + browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId + browseContent.params = run.navigationEndpoint?.browseEndpoint?.params + } +// if run.navigationEndpoint?.browseEndpoint?.browseId != nil { +// browseContent.browseId = run.navigationEndpoint?.browseEndpoint?.browseId +// } +// if run.navigationEndpoint?.browseEndpoint?.params != nil { +// browseContent.params = run.navigationEndpoint?.browseEndpoint?.params +// } + }) + item.browseContent = browseContent + if let playListId = musicTwoRowItemRenderer.thumbnailOverlay?.musicItemThumbnailOverlayRenderer?.content?.musicPlayButtonRenderer?.playNavigationEndpoint?.watchPlaylistEndpoint?.playlistId { + //设置列表ID + var musicVideo = BrowseItemMusicVideo() + musicVideo.playListId = playListId + item.musicVideo = musicVideo + } + if let videoId = musicTwoRowItemRenderer.navigationEndpoint?.watchEndpoint?.videoId { + //是视频 + var musicVideo = BrowseItemMusicVideo() + musicVideo.videoId = videoId + item.musicVideo = musicVideo + item.itemType = .single + } + return item + } +} +//MARK: - 解析资源加密 +extension MP_NetWorkManager { + ///百分比解码 + private func seperatorOff(_ encodedString: String) -> String { + guard let decodedString = encodedString.removingPercentEncoding else { + print("百分比解码失败") + return "" + } + return decodedString + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerManager.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerManager.swift new file mode 100644 index 0000000..d3165b1 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerManager.swift @@ -0,0 +1,294 @@ +// +// MP_PlayerManager.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/10. +// + +import UIKit +import AVFoundation +import MediaPlayer +import AVKit +///播放器播放状态 +enum MP_PlayerStateType:Int { + ///未启动 + case Null = 0 + ///运行中 + case Playing = 1 + ///暂停中 + case Pause = 2 +} +///播放器播放方式 +enum MP_PlayerPlayType:Int { + ///列表顺序播放 + case normal = 0 + ///列表随机播放 + case random = 1 + ///单曲播放(当前音乐无限循环) + case single = 2 +} + +///播放器启动时执行事件(播放的音乐) +typealias MP_PlayTimerStartAction = () -> Void +///播放器运行时执行事件(当前时间值,最大时间值) +typealias MP_PlayTimerRunAction = (_ currentTime:TimeInterval, _ duration:TimeInterval) -> Void +///播放器结束时执行事件 +typealias MP_PlayTimerEndAction = () -> Void +///播放器暂停时执行事件 +typealias MP_PlayTimerPauseAction = () -> Void +///播放器继续时执行事件 +typealias MP_PlayTimerResumeAction = () -> Void +///播放器终止时执行事件 +typealias MP_PlayTimerStopAction = () -> Void +///播放器调整进度时执行事件 +typealias MP_PlayTimerEditEndAction = () -> Void +///播放器 +class MP_PlayerManager{ + ///控制器单例 + static let shared = MP_PlayerManager() + ///播放器 + private var player:AVPlayer = AVPlayer() + ///load模块 + var loadPlayer:MPPositive_PlayerLoadViewModel! + //当前播放器状态 + private var playState:MP_PlayerStateType = .Null + ///播放器启动时执行事件记录 + private var startActionBlock:MP_PlayTimerStartAction! + ///播放器运行时执行事件记录 + private var runActionBlock:MP_PlayTimerRunAction! + + private init() { + // 添加观察者,监听播放结束事件 + NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying(_ :)), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(userSwitchCurrentVideoAction(_ :)), notificationName: .positive_player_reload) + } + deinit { + NotificationCenter.default.removeObserver(self) + } + ///获取播放器播放状态 + func getPlayState() -> MP_PlayerStateType { + return playState + } + /// 开始播放音乐 + /// - Parameters: + /// - startAction: 开始播放时需要执行的事件 + /// - runAction: 播放途中需要执行的事件 + /// - endAction: 结束播放时需要执行的事件 + func play(startAction:MP_PlayTimerStartAction? = nil, runAction:MP_PlayTimerRunAction? = nil) { + //检索播放器状态 + switch playState { + case .Null://未启动 + break + case .Playing://启动中 + player.pause() + case .Pause://暂停中 + break + } + //记录事件 + if startAction != nil { + startActionBlock = startAction + } + if runAction != nil { + runActionBlock = runAction + } + //判断是否有PlayerItem + player.replaceCurrentItem(with: loadPlayer.currentVideo.resourcePlayerItem) + //将进度回归为0 + player.seek(to: .zero) + //设置一个秒为刻度的时间值 + let interval:CMTime = .init(seconds: 1, preferredTimescale: .init(1)) + //为播放器添加运行时主线程每秒触发事件 + player.addPeriodicTimeObserver(forInterval: interval, queue: .main, using: { [weak self] (time) in + guard let self = self else { return } + //转化为当前播放进度秒值 + let currentDuration = CMTimeGetSeconds(time) + //当current为0时执行开始事件 + if currentDuration == 0 { + if startActionBlock != nil { + startActionBlock!() + } + } + //获取当前播放音乐资源的最大时间值 + let maxDuration = getMusicDuration() + if maxDuration.isNaN == false { + //判断当值进度是否超越最大时间值 + if currentDuration <= maxDuration { + //没有,执行运行时时间 + if runActionBlock != nil { + runActionBlock!(currentDuration, maxDuration) + } + } + } + }) + //播放 + player.play() + playState = .Playing + //启动除了当前播放意外的预加载内容 +// let set = Set(loadPlayer.listViewVideos.filter({$0.index != loadPlayer.currentVideo.index})) +// set.forEach { item in +// if item.canBePreloaded() == false { +// item.preloadPlayerItem() +// } +// } + } + ///获取音乐资源总时长 + private func getMusicDuration() -> TimeInterval { + return CMTimeGetSeconds(player.currentItem?.duration ?? .zero) + } + + //MARK: - 音乐播放结束 + //当前音乐播放结束时 + @objc private func playerDidFinishPlaying(_ sender:Notification) { + //检索播放器对象 + guard playState == .Playing else { + return + } + //当前音乐播放器正在播放中,下一首 + nextEvent() + } + //MARK: - 暂停播放 + ///内部暂停播放 + private func pause() { + //检索播放状态,是否进行中 + guard playState == .Playing else { + //未处于播放中 + print("Player is not in playing") + return + } + //暂停播放器 + player.pause() + //切换播放器状态 + playState = .Pause + } + /// 暂停播放 + /// - Parameter pauseAction: 暂停时要执行的事件 + func pause(_ pauseAction:MP_PlayTimerPauseAction? = nil) { + //检索播放状态,是否进行中 + guard playState == .Playing else { + //未处于播放中 + print("Player is not in playing") + return + } + if pauseAction != nil { + pauseAction!() + } + //暂停播放器 + player.pause() + //切换播放器状态 + playState = .Pause + } + //MARK: - 继续播放 + /// 继续播放 + /// - Parameter resumeAction: 继续时要执行的事件 + func resume(_ resumeAction:MP_PlayTimerResumeAction? = nil) { + //检索播放状态,是否暂停中 + guard playState == .Pause else { + //未处于暂停中 + print("Player is not paused") + return + } + if resumeAction != nil { + resumeAction!() + } + //继续播放器 + player.play() + //切换播放器状态 + playState = .Playing + } + ///内部继续播放 + private func resume() { + //检索播放状态,是否暂停中 + guard playState == .Pause else { + //未处于暂停中 + print("Player is not paused") + return + } + //继续播放器 + player.play() + //切换播放器状态 + playState = .Playing + } + + //MARK: - 停止播放 + //停止播放 + private func stop() { + //检索播放状态,是否已启动 + guard playState != .Null else { + //未启动 + print("Player is not started") + return + } + player.pause() + playState = .Null + } + //MARK: - 切歌(上一首/下一首) + ///上一首歌事件 + func previousEvent() { + //判断是否存在上一首音乐 + let targetIndex = loadPlayer.listViewVideos.firstIndex(of: loadPlayer.currentVideo) + if targetIndex == 0 { + //当前音乐第一首,更新列表内容,获取最后一首歌,并播放 + let last = loadPlayer.songVideos.last + loadPlayer.improveData(last?.videoId ?? "") + }else { + //存在上一首,获取上一首ID,并播放 + let song = loadPlayer.songVideos.first(where: {$0.index == (loadPlayer.currentVideo.index-1)}) + loadPlayer.improveData(song?.videoId ?? "") + } + } + ///下一首歌事件 + func nextEvent() { + //判断是否存在下一首音乐 + let targetIndex = loadPlayer.listViewVideos.firstIndex(of: loadPlayer.currentVideo) + if targetIndex == (loadPlayer.listViewVideos.count - 1) { + //当前音乐最后一首,更新列表内容,获取第一首歌,并播放 + let first = loadPlayer.songVideos.first + loadPlayer.improveData(first?.videoId ?? "") + }else { + //存在下一首,获取下一首ID,并播放 + let song = loadPlayer.songVideos.first(where: {$0.index == (loadPlayer.currentVideo.index+1)}) + loadPlayer.improveData(song?.videoId ?? "") + } + } + ///监听到用户切换当前音乐 + @objc private func userSwitchCurrentVideoAction(_ sender:Notification) { + if loadPlayer.currentVideo != nil { + //开始播放 + play(startAction: startActionBlock,runAction: runActionBlock) + }else { + //用户删除了音乐,播放下一首音乐 + + } + } + + ///播放器进度调整状态 + func setEditPorgressStatu() { + guard playState != .Null else { + return + } + //播放器进入暂停状态 + pause() + } + /// 调整播放器进度值,必须和 setEditPorgressStatu()搭配使用 + /// - Parameters: + /// - progress: 要调整进度值(保证在0-1范围内,超出该方法不会响应) + func setEditProgressEnd(_ progress:Float, endAction:MP_PlayTimerEditEndAction? = nil) { + guard playState != .Null else { + return + } + guard progress >= 0, progress <= 1 else { + return + } + //根据当前进度值设置时间节点 + let timePoint:Double = Double(progress)*getMusicDuration() + //设置对应的时间值 + let time:CMTime = .init(seconds: timePoint, preferredTimescale: CMTimeScale(NSEC_PER_SEC)) + //调整播放器时间 + player.seek(to: time) + //恢复播放 + resume() + if endAction != nil { + endAction!() + } + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerSlider.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerSlider.swift new file mode 100644 index 0000000..c63df80 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_PlayerSlider.swift @@ -0,0 +1,143 @@ +// +// Player_Slider.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/29. +// + +import UIKit + +///音量控制Slider +class MP_PlayerSlider: UISlider { + //滑块图片 + var thumbImage:UIImage! + //滑轨槽高度 + var trackHeight: CGFloat = 5 + //进度渐变色 + var minTrackColors: [UIColor]! + //槽位渐变色 + var maxTrackColors:[UIColor]! + //进度渐变色定位列表(与渐变色数量保持一致) + var minTrackLocations:[CGFloat]! + //槽位渐变色定位列表(与渐变色数量保持一致) + var maxTrackLocations:[CGFloat]! + + //初始化 + init(frame:CGRect, trackHeight: CGFloat, minTrackColors: [UIColor]!, maxTrackColors: [UIColor]!, minTrackLocations: [CGFloat]!, maxTrackLocations: [CGFloat]!) { + super.init(frame: frame) + self.trackHeight = trackHeight + self.minTrackColors = minTrackColors + self.maxTrackColors = maxTrackColors + self.minTrackLocations = minTrackLocations + self.maxTrackLocations = maxTrackLocations + setUpLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + override func awakeFromNib() { + super.awakeFromNib() + trackHeight = bounds.size.height + setUpLayout() + } + private func setUpLayout() { + layer.masksToBounds = false + + } + //重写绘制方法 + override func draw(_ rect: CGRect) { + //设置滑块图片 + if thumbImage != nil { + setThumbImage(thumbImage, for: .normal) + } + //设置进度图片 + let minTrackImg = makeTrackImage(rect: rect, colors: minTrackColors, locations: minTrackLocations) + setMinimumTrackImage(minTrackImg, for: .normal) + // 设置槽位 + let maxTrackImg = makeTrackImage(rect: rect, colors: maxTrackColors, locations: maxTrackLocations) + setMaximumTrackImage(maxTrackImg, for: .normal) + } + + /// 滑块设置 + /// - Parameters: + /// - rect: 滑块大小 + /// - color: 滑块颜色 + /// - Returns: 返回的滑块图片 + private func makeThumbImage(rect: CGRect, color:UIColor) -> UIImage { + let lineWidth: CGFloat = 2 + //开始绘制 + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0) + //填充内部颜色 + color.setFill() + //曲线路径 + let oval = UIBezierPath(ovalIn: rect) + //填充路径 + oval.fill() + //设置路径颜色为白色 + UIColor.white.setStroke() + //路径宽度 + oval.lineWidth = lineWidth + oval.stroke() + //转为图片 + let thumbImg = UIGraphicsGetImageFromCurrentImageContext()! + //转化结束 + UIGraphicsEndImageContext() + return thumbImg + } + + + /// 生成滑轨图片 + /// - Parameters: + /// - rect: 滑轨大小 + /// - colors: 颜色列表 + /// - locations: 位置分布列表 + /// - Returns: 生成的图片 + private func makeTrackImage(rect: CGRect, colors:[UIColor], locations:[CGFloat]) -> UIImage { + let rect = CGRect(x: rect.minX, y: rect.minY, width: rect.width, height: self.trackHeight) + //开始绘制 + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0) + let ctx = UIGraphicsGetCurrentContext()! + // 创建并设置路径 + let cornerRadius: CGFloat = rect.height * 0.5 + let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).cgPath + // 添加路径到图形上下文 + ctx.addPath(path) + ctx.clip() + // 使用rgb颜色空间 + let colorSpace = CGColorSpaceCreateDeviceRGB() + //获取cgcolors + var cgColors:[CGColor] = [] + colors.forEach { item in + cgColors.append(item.cgColor) + } + // 定义渐变色 + let gradient:CGGradient = CGGradient(colorsSpace: colorSpace, colors: cgColors as CFArray, locations: locations)! + // 渐变开始位置 + let start = CGPoint(x: self.bounds.minX, y: self.bounds.minY) + // 渐变结束位置 + let end = CGPoint(x: self.bounds.maxX, y: self.bounds.minY) + // 绘制渐变 + ctx.drawLinearGradient(gradient, start: start, end: end, options: .drawsBeforeStartLocation) + //转为图片 + let trackImg = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext() + return trackImg + } + // 重写【thumb】显示区域 方法 + override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect { + let rect = super.thumbRect(forBounds: bounds, trackRect: rect, value: value) + // 设置thumb投影效果 + // (这样设置的投影效果,如果调用setValue(_:animated:)的时候,animated参数为true,会有阴影和thumb不同步的问题,目前还不知到怎么解决) + self.layer.shadowColor = UIColor.black.cgColor + self.layer.shadowOffset = CGSize(width: 0, height: 0) + self.layer.shadowOpacity = 0.15 + self.layer.shadowRadius = 3 + self.layer.shadowPath = UIBezierPath(cgPath: CGPath(ellipseIn: rect.insetBy(dx: 3, dy: 3), transform: nil)).cgPath + return rect + } + // 重写【track】显示区域 方法 + override func trackRect(forBounds bounds: CGRect) -> CGRect { + return CGRect(x: 0, y: 0, width: bounds.width, height: self.trackHeight) + } +} diff --git a/MusicPlayer/MP/Common/Tool(工具封装)/MP_WebWork.swift b/MusicPlayer/MP/Common/Tool(工具封装)/MP_WebWork.swift new file mode 100644 index 0000000..54a3668 --- /dev/null +++ b/MusicPlayer/MP/Common/Tool(工具封装)/MP_WebWork.swift @@ -0,0 +1,205 @@ +// +// MP_WebWork.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/30. +// + +import Foundation +import WebKit +import Alamofire +///WebView管理器,通过拉取base.js文件来获取解密函数,完成对请求权限的解密 +class MP_WebWork:NSObject { + //单例工具 + static let shared = MP_WebWork() + ///加载web(调用之后记得销毁) + private var webView:WKWebView? + ///油管首页 + private lazy var homePath = "https://music.youtube.com/" + private var jsPath:String = "https://music.youtube.com/" + ///解码方法名 + private var codeFunctionName:String! + ///签名时间缀 + var signatureTimestamp:Int! + private override init() { + super.init() + //实例化webView + webView = .init(frame: .zero) + webView?.navigationDelegate = self + webView?.uiDelegate = self +// webView?.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" + } + deinit { + webView = nil + } + /// 访问youtube主页 + func pingYoutubeHome() { + //实现一个请求 + let request = URLRequest(url: .init(string: homePath)!) + //加载web + webView?.load(request) + } + ///获取base.js文件地址 + private func getBasePath(_ jsContent:String) { + let pattern = "s/player/[0-9a-fA-F]{8}/player_ias.vflset/[a-zA-Z_]+/base\\.js" + guard let regex = try? NSRegularExpression(pattern: pattern, options: .dotMatchesLineSeparators) else { + print("Regular expression compilation failed") + return + } + // 在整个字符串范围内搜索正则表达式匹配项 + let nsRange = NSRange(jsContent.startIndex.. Void)){ + //检索webView是否存在 + guard webView != nil, codeFunctionName != nil else { + return + } + //当webView和解码方法名同时存在时 + let function = "_yt_player.SNa('\(signatureString)');" + //调用解密方法 + webView?.evaluateJavaScript(function){result,error in + if let error = error { + print("Code Error:\(error)") + } + if let result = result as? String { + //该方法返回结果是一个字符串 + completion(result) + } + } + } + ///获取方法名的正则表达 + private func regexFunction(_ jsContent:String) -> String? { + var result:String? + //唯一性的方法字符串 + let pattern = "\\w+=function\\(a\\)\\{[^}]*?a=a\\.split\\(\\\"\\\"\\);" + // 使用NSRegularExpression进行正则匹配 + guard let regex = try? NSRegularExpression(pattern: pattern, options: .dotMatchesLineSeparators) else { + print("Regular expression compilation failed") + return result + } + // 执行正则匹配 + let matches = regex.matches(in: jsContent, options: [], range: NSRange(location: 0, length: jsContent.utf16.count)) + // 遍历匹配项并打印函数名 + for match in matches { + if let range = Range(match.range(at: 0), in: jsContent) { + // 提取函数体字符串 + let functionbody = String(jsContent[range]) + //将函数体字符串进行截取(以=为基准) + let results = functionbody.split(separator: "=").map(String.init) + //第一个元素就是方法名 + result = results[0] + } + } + return result + } + ///获取签名时间值 + private func getSignatureTimestamp(_ jsContent:String) -> Int?{ + let regexPattern = "signatureTimestamp:(\\d+)" + guard let regex = try? NSRegularExpression(pattern: regexPattern, options: .dotMatchesLineSeparators) else { + print("Regular expression compilation failed") + return nil + } + let range = NSRange(jsContent.startIndex.. Void){ + guard let url = navigationResponse.response.url, url.lastPathComponent == "base.js", codeFunctionName == nil else { + decisionHandler(.allow) // 允许非JavaScript文件的加载 + return + } + //调用的是base.js文件,拦截该请求 + decisionHandler(.cancel) + // 使用URLSession重新请求base.js文件 + let task = URLSession.shared.dataTask(with: url){ [weak self] data, response, error in + guard let self = self, let data = data, error == nil else { + print("Request base.JavaScript error: \(error?.localizedDescription ?? "")") + decisionHandler(.allow) + return + } + // 修改JavaScript文件内容 + guard let jsContent = String(data: data, encoding: .utf8) else { + decisionHandler(.allow) + return + } + guard let function = regexFunction(jsContent), let timeValue = getSignatureTimestamp(jsContent) else { + decisionHandler(.allow) + return + } + //获取需要的方法名,和签名时间缀 + signatureTimestamp = timeValue + codeFunctionName = function + //由于该解密函数方法是私有的,因此创建一句暴露代码 + let code = "g.SNa=\(codeFunctionName!);" + let pattern = "\(codeFunctionName!)=function\\(a\\)\\{[^\\}]*\\};" + let regex = try? NSRegularExpression(pattern: pattern, options: .dotMatchesLineSeparators) + let nsRange = NSRange(jsContent.startIndex.. Bool { + return self.isPreloading ?? false + } + //异步预加载 + func preloadPlayerItem() { + if isKvo == false { + //为playerItem添加监听 + self.resourcePlayerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil) + isKvo = true + } + //手动触发,以此加载数据 + self.resourcePlayerItem.seek(to: .zero) {[weak self] _ in + guard let self = self else {return} + // 使用 dispatchSource 监听属性变化 + let timer = DispatchSource.makeTimerSource(queue: .global(qos: .background)) + //一秒触发一次 + timer.schedule(deadline: .now(), repeating: .seconds(1)) + timer.setEventHandler{ + if self.resourcePlayerItem.isPlaybackLikelyToKeepUp { + //预加载完成 + self.isPreloading = true + if self.isKvo == true { + // 当预加载足够时,移除观察者 + self.resourcePlayerItem.removeObserver(self, forKeyPath: "status") + self.isKvo = false + timer.cancel() + } + } + } + timer.resume() + } + } + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "status" { + if let status = change?[.newKey] as? Int, status == Int(AVPlayerItem.Status.readyToPlay.rawValue) { + // 播放准备就绪 + print("\(self.title ?? "") is Ok") + }else { + //资源无法播放 + print("\(self.title ?? "") is bad") + } + } + } +} diff --git a/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift b/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift new file mode 100644 index 0000000..bfd7604 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_BrowseLoadViewModel.swift @@ -0,0 +1,51 @@ +// +// MPPositive_LoadMusicModel.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/25. +// + +import UIKit +///b面音乐数据管理load +class MPPositive_BrowseLoadViewModel: NSObject { + ///预览模块数据组(通过网络请求刷新) + var browseModuleLists:[MPPositive_BrowseModuleListViewModel] = [] + ///列表展示内容(通过网络请求刷新) + var listAlbumList:MPPositive_ListAlbumListViewModel! + override init() { + super.init() + //当网络请求工具触发browse请求闭包时 + MP_NetWorkManager.shared.browseRequestStateBlock = { + [weak self] (lists,isCompleted) in + guard let self = self else {return} + //配置预览模块数据 + browseModuleLists.append(contentsOf: lists) + //移除为空的数据 + browseModuleLists = browseModuleLists.filter{($0.items.count != 0)} + //通知首页刷新UI + NotificationCenter.notificationKey.post(notificationName: .positive_browses_reload) + } + //当网络请求工具触发列表请求闭包时 + MP_NetWorkManager.shared.listRequestResultBlock = { + [weak self] (list) in + guard let self = self else {return} + listAlbumList = list + //通知首页刷新UI + NotificationCenter.notificationKey.post(notificationName: .positive_list_reload) + } + } + ///刷新预览数据 + func reloadBrowseLists() { + //清空预览模块数据 + browseModuleLists.removeAll() + //调用网络请求工具的预览请求 + MP_NetWorkManager.shared.requestBrowseDatas() + } + ///请求列表数据 + func requestListOrAlbum(_ item:MPPositive_BrowseItemViewModel) { + //清空列表内容 + listAlbumList = nil + //调用网络请求工具的列表请求 + MP_NetWorkManager.shared.requestAlbumOrListDatas(item) + } +} diff --git a/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift b/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift new file mode 100644 index 0000000..a09cd9c --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Models/ViewModels/LoadViewModels/MPPositive_PlayerLoadViewModel.swift @@ -0,0 +1,137 @@ +// +// MPPositive_PlayerLoadViewModel.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/9. +// + +import UIKit +///播放器管理ViewModel +class MPPositive_PlayerLoadViewModel: NSObject { + /// 单曲列表 + var songVideos:[MPPositive_SongItemModel]! + ///当前播放音乐ViewModel + var currentVideo:MPPositive_SongViewModel!{ + didSet{ + if currentVideo != nil { + //当值变化时通知播放器页面,更新UI + NotificationCenter.notificationKey.post(notificationName: .positive_player_reload) + } + } + } + ///当前播放音乐ID + var currentVideoId:String! + ///单曲ViewModel列表 + var listViewVideos:[MPPositive_SongViewModel]! + ///异步请求组 + var group:DispatchGroup? + ///palyer管理model初始化方法 + /// - Parameters: + /// - songs: 全部歌曲列表 + /// - firstVideoId: 需要播放的第一首歌 + init(_ songs:[MPPositive_SongItemModel], currentVideoId: String) { + super.init() + //清空数据 + self.songVideos = songs + self.listViewVideos = [] + self.currentVideoId = currentVideoId + } + + ///将选中Video的上下2项包括本身总计3项Video进行补全转为ViewModel,并播放这首音乐 + func improveData(_ targetVideoId:String) { + guard let targetVideo = self.songVideos.first(where: {$0.videoId == targetVideoId}) else { + return + } + //对于选中Video的集合 + var array:[MPPositive_SongItemModel] = [] + //获取上一位 + if let previous = self.songVideos.first(where: {$0.index == (targetVideo.index-1)}) { + array.append(previous) + } + array.append(targetVideo) + //获取下一位 + if let next = self.songVideos.first(where: {$0.index == (targetVideo.index+1)}) { + array.append(next) + } + //获取完成,优先检索ViewModel,看看是否已存在补完video + let videoIDs = Set(listViewVideos.map({$0.song.videoId})) + //比较videoID,去掉已经补完的内容 + array = array.filter({!videoIDs.contains($0.videoId)}) + group = DispatchGroup() + //去重完毕,对剩下内容补完 + array.forEach { item in + group?.enter() + //补全歌词id和相关内容id + improveDataforLycirsAndRelated(item) {[weak self] (result) in + item.lyricsID = result.0 + item.relatedID = result.1 + self?.group?.leave() + } + group?.enter() + //补全资源路径组和封面路径组 + improveDataforResouceAndCover(item) {[weak self] resourceUrls, coverUrls in + item.resourceUrls = resourceUrls + item.coverUrls = coverUrls + //补全完成,转化为ViewModel,并添加进listViewVideos + self?.listViewVideos.append(.init(item)) + self?.group?.leave() + } + } + group?.notify(queue: .main, execute: { + //补完转化完毕,重新排序 + self.listViewVideos = self.listViewVideos.sorted(by: {$0.index < $1.index}) + //排序完成,确定播放音乐 + self.currentVideo = self.listViewVideos.first(where: {$0.song.videoId == targetVideoId}) + + }) + } + ///移除选中的song,并更新listViewVideos,移除相同index的值 + func removeData(_ targetVideoId:String) { + let targetIndex = songVideos.firstIndex(where: {$0.videoId == targetVideoId}) + //将选中的音乐移除,同时更新listView + songVideos = songVideos.filter({$0.videoId != targetVideoId}) + listViewVideos = listViewVideos.filter({$0.song.videoId != targetVideoId}) + //更新下标/索引 + for (index, item) in songVideos.enumerated() { + item.index = index + } + listViewVideos.forEach { listModel in + songVideos.forEach { song in + if listModel.song.videoId == song.videoId { + listModel.index = song.index + listModel.song.index = song.index + } + if currentVideo.song.videoId == song.videoId { + currentVideo.index = song.index + currentVideo.song.index = song.index + } + } + } + + //判断是否当前音乐 + if currentVideo.song.videoId == targetVideoId { + if let videoId = songVideos.first(where: {$0.index == targetIndex})?.videoId { + //更新当前音乐 + improveData(videoId) + }else { + //移除的是原来最后一首音乐,播放新的最后一首音乐 + let videoId = songVideos.last?.videoId ?? "" + improveData(videoId) + } + } + } + ///调用next对单曲数据歌词ID与相关ID补全 + private func improveDataforLycirsAndRelated(_ song:MPPositive_SongItemModel, completion:@escaping(((String?,String?)) -> Void)) { + //单曲补全需要再次调用next接口 + MP_NetWorkManager.shared.requestNextLyricsAndRelated(song){ result in + completion(result) + } + } + ///调用player对资源路径和封面路径补全 + private func improveDataforResouceAndCover(_ song:MPPositive_SongItemModel, completion:@escaping(([String]?, [String]?) -> Void)) { + //单曲补全需要调用player接口 + MP_NetWorkManager.shared.requestPlayer(song) { resourceUrls, coverUrls in + completion(resourceUrls,coverUrls) + } + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift new file mode 100644 index 0000000..171e44a --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_BaseViewController.swift @@ -0,0 +1,58 @@ +// +// MPPositive_BaseViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/18. +// + +import UIKit +///b面基类控制器 +class MPPositive_BaseViewController: MP_BaseViewController { + //导航栏标题 + private lazy var navTitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 20*width, weight: .regular), textColor: .white, textAlignment: .center) + //pop按钮 + private lazy var popBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Pop‘logo"), for: .normal) + btn.addTarget(self, action: #selector(popActionClick(_ :)), for: .touchUpInside) + return btn + }() + lazy var navView:UIView = setTitleView() + + override func viewDidLoad() { + super.viewDidLoad() + view.addSubview(navView) + } + //设置顶部titleView + private func setTitleView() -> UIView { + let topView = UIView(frame: .init(x: 0, y: statusBarHeight, width: screen_Width, height: 50*width)) + topView.backgroundColor = .clear + topView.addSubview(navTitleLabel) + navTitleLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + return topView + } + ///设置导航栏title + func setTitle(_ text:String) { + navTitleLabel.text = text + } + ///设置导航栏popBtn + func setPopBtn() { + navView.addSubview(popBtn) + popBtn.snp.makeConstraints { make in + make.width.height.equalTo(42*width) + make.centerY.equalToSuperview() + make.left.equalTo(16*width) + } + } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + //当页面布局完成后,将navView移动至最上层 + view.bringSubviewToFront(navView) + } + //pop上一个页面 + @objc private func popActionClick(_ sender:UIButton) { + navigationController?.popViewController(animated: true) + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_NavigationController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_NavigationController.swift new file mode 100644 index 0000000..95df364 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_NavigationController.swift @@ -0,0 +1,42 @@ +// +// MPPositive_NavigationController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit +///b面导航栏 +class MPPositive_NavigationController: MP_NavigationController { + + //重写pushViewController + //每一次push都会执行这个方法,push之前设置viewController的hidesBottomBarWhenPushed + override func pushViewController(_ viewController: UIViewController, animated: Bool) { + viewController.hidesBottomBarWhenPushed = true + super.pushViewController(viewController, animated: true) + viewController.hidesBottomBarWhenPushed = false + } + //重写popViewController + //每一次对viewController进行push的时候,会把viewController放入一个栈中 + //每一次对viewController进行pop的时候,会把viewController从栈中移除 + override func popViewController(animated: Bool) -> UIViewController? { + guard self.children.count != 1 else { + //特殊情况,当用户连续触发pop事件时进行容错处理 + return super.popViewController(animated: true) + } + guard self.children.count == 2 else { + //如果viewController栈中存在的ViewController的个数超过两个,对要返回到的上一级的界面设置hidesBottomBarWhenPushed = true + //把tabbar进行隐藏 + let count = self.children.count-2 + let controller = self.children[count] + controller.hidesBottomBarWhenPushed = true + NotificationCenter.notificationKey.post(notificationName: .sideA_hidden_show) + return super.popViewController(animated: true) + } + //如果viewController栈中存在的ViewController的个数为两个,再返回上一级界面就是根界面了 + //那么要对tabbar进行显示 + let controller:UIViewController = self.children[0] + controller.hidesBottomBarWhenPushed = false + return super.popViewController(animated: true) + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_PresentationController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_PresentationController.swift new file mode 100644 index 0000000..eece3ad --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_PresentationController.swift @@ -0,0 +1,48 @@ +// +// MPPositive_PresentationController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/10. +// + +import UIKit +///自定义模态弹出类型 +enum MPPositive_PresentModal{ + ///播放器弹出列表 + case PlayerList +} +class MPPositive_PresentationController: UIPresentationController { + //蒙板 + fileprivate lazy var maskView: UIView = { + let corverView = UIView() + return corverView + }() + // MARK: - 系统回调(重载) + override func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + //根据模态状态确定弹出控制器的布局 + switch MPPositive_ModalType { + case .PlayerList: + presentedView?.snp.makeConstraints({ (make) in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(380*width) + }) + } + //添加蒙版 + setMask() + } + // 添加蒙版 + fileprivate func setMask() -> Void { + // 添加蒙版 + containerView?.insertSubview(maskView, at: 0) + //设置蒙版的属性 + maskView.backgroundColor = UIColor(white: 0.0, alpha: 0.8) + maskView.frame = containerView!.bounds + let tap = UITapGestureRecognizer(target: self, action: #selector(maskClick(_:))) + maskView.addGestureRecognizer(tap) + } + //蒙板点击事件 + @objc fileprivate func maskClick(_ sender:UITapGestureRecognizer){ + presentedViewController.dismiss(animated: true, completion: nil) + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift new file mode 100644 index 0000000..557aeb6 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Base(基类,导航栏,标签栏)/MPPositive_TabBarController.swift @@ -0,0 +1,62 @@ +// +// MPPositive_TabBarController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit +///b面tabBar控制器 +class MPPositive_TabBarController: UITabBarController { + //自定义tabBar + private lazy var customTabBar:MPPositive_CustomTabBar = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 72*width)) + private lazy var bottomView:MPPositive_BottomShowView = .init(frame: .init(x: 0, y: 0, width: 351, height: 82)) + override func viewDidLoad() { + super.viewDidLoad() + self.setValue(customTabBar, forKey: "tabBar") + //创建标签子控制器 + let homeVC = MPPositive_NavigationController(rootViewController: MPPositive_HomeViewController()) + let searchVC = MPPositive_NavigationController(rootViewController: MPPositive_SearchViewController()) + let libraryVC = MPPositive_NavigationController(rootViewController: MPPositive_LibraryViewController()) + viewControllers = [homeVC,searchVC,libraryVC] + //禁止系统tabBaritem触发 + tabBar.items?.forEach({ item in + item.isEnabled = false + }) + tabBar.barTintColor = .clear + UITabBar.appearance().backgroundColor = .clear + tabBar.shadowImage = UIImage() + tabBar.backgroundImage = UIImage() + //添加底部播放View + view.addSubview(bottomView) + //将展示View设置在主窗口下方之外,避免用户察觉 + bottomView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(82*width) + make.width.equalTo(351*width) + make.height.equalTo(82*width) + } + addNotification() + } + //监听通知 + private func addNotification() { + //监听标签切换 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchAction(_:)), notificationName: .switch_tabBarItem) + } + deinit { + //移除所有监听 + NotificationCenter.default.removeObserver(self) + } +} +//MARK: - 通知处理 +extension MPPositive_TabBarController { + //切换事件 + @objc private func switchAction(_ sender:Notification) { + let tag = sender.object as! Int + selectedIndex = tag + } + //弹出player控制器 + @objc private func pupPlayerAction(_ sender:Notification) { + + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LibraryViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LibraryViewController.swift new file mode 100644 index 0000000..7a6c832 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Center(个人曲库页)/MPPositive_LibraryViewController.swift @@ -0,0 +1,29 @@ +// +// MPPositive_LibraryViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit + +class MPPositive_LibraryViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_HomeViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_HomeViewController.swift new file mode 100644 index 0000000..6f5f499 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_HomeViewController.swift @@ -0,0 +1,137 @@ +// +// MPPositive_HomeViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit + +class MPPositive_HomeViewController: MPPositive_BaseViewController{ + //背景图片 + private lazy var bgImageView:UIImageView = { + let imageView:UIImageView = .init(image: .init(named: "B_Home_BG'bg")) + imageView.contentMode = .scaleAspectFill + return imageView + }() + //菜单按钮 + private lazy var memuBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Home_Menu'logo"), for: .normal) + btn.addTarget(self, action: #selector(menuRightClick(_ :)), for: .touchUpInside) + return btn + }() + //tableView + private lazy var tableView:UITableView = { + let tableView = UITableView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), style: .plain) + tableView.backgroundColor = .clear + tableView.separatorStyle = .none + tableView.estimatedRowHeight = 200 + tableView.rowHeight = UITableView.automaticDimension + tableView.dataSource = self + tableView.delegate = self + tableView.register(MPPositive_HomeShowTableViewCell.self, forCellReuseIdentifier: MPPositive_HomeShowTableViewCellID) + return tableView + }() + private let MPPositive_HomeShowTableViewCellID = "MPPositive_HomeShowTableViewCell" + private var loadViewModel:MPPositive_BrowseLoadViewModel! + override func viewDidLoad() { + super.viewDidLoad() + setTitle("Musicoo") + confirgue() + loadViewModel = MPPositive_BrowseLoadViewModel() + //开始获取预览页数据 + loadViewModel.reloadBrowseLists() + NotificationCenter.notificationKey.add(observer: self, selector: #selector(reloadAction(_ :)), notificationName: .positive_browses_reload) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(listAction(_ :)), notificationName: .positive_list_reload) + + } + deinit { + NotificationCenter.default.removeObserver(self) + } + //MARK: - UI生成与配置 + //配置 + private func confirgue() { + view.addSubview(bgImageView) + bgImageView.snp.makeConstraints { make in + make.top.right.left.equalToSuperview() + make.height.equalTo(981*width) + } + view.addSubview(tableView) + navView.addSubview(memuBtn) + memuBtn.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-16*width) + make.centerY.equalToSuperview() + make.width.height.equalTo(24*width) + } + tableView.snp.makeConstraints { make in + make.top.equalTo(navView.snp.bottom).offset(32*width) + make.left.right.bottom.equalToSuperview() + } + + } + //MARK: - 页面刷新 + //页面刷新 + @objc private func reloadAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + self?.tableView.reloadData() + } + } + //用户要展示列表内容且列表内容刷新完成 + @objc private func listAction(_ sender:Notification) { + let listVC = MPPositive_ListShowViewController() + listVC.listOrAlbum = loadViewModel.listAlbumList + navigationController?.pushViewController(listVC, animated: true) + } + //MARK: - 点击 + //点击顶部右侧弹出菜单 + @objc private func menuRightClick(_ sender:UIButton) { + + } +} +//MARK: - tableView +extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDelegate { + func numberOfSections(in tableView: UITableView) -> Int { + return loadViewModel.browseModuleLists.count + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell + cell.browseViewModel = loadViewModel.browseModuleLists[indexPath.section] + cell.showType = .init(rawValue: (indexPath.section > 4 ? 4:indexPath.section))! + cell.requestNextBlock = { + [weak self] (item) in + guard let self = self else {return} + //判断内容的类型,决定跳转方式 + if item.browseItem.itemType == .single { + //单曲/视频跳转 + //触发next请求,优先获取列表全部单曲基础数据(不完善) + MP_NetWorkManager.shared.requestNextList(item){ [weak self] listSongs in + guard let self = self else {return} + //回掉的数据并不完善,生成一个playerloadViewModel + let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.musicVideo.videoId ?? "") + lodaViewModel.improveData(item.browseItem.musicVideo.videoId ?? "") + MP_PlayerManager.shared.loadPlayer = lodaViewModel + //创建player播放器 + let playerVC = MPPositive_PlayerViewController() + playerVC.modalPresentationStyle = .fullScreen + present(playerVC, animated: true) + } + }else { + //列表/专辑跳转 + loadViewModel.requestListOrAlbum(item) + } + } + cell.findMoreBlock = { + [weak self] in + guard let self = self else {return} + let moreVC = MPPositive_MoreContentViewController() + moreVC.browseModuleList = loadViewModel.browseModuleLists[indexPath.section] + navigationController?.pushViewController(moreVC, animated: true) + } + return cell + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_ListShowViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_ListShowViewController.swift new file mode 100644 index 0000000..174f880 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_ListShowViewController.swift @@ -0,0 +1,228 @@ +// +// MPPositive_ListShowViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/28. +// + +import UIKit +///b面列表歌单展示 +class MPPositive_ListShowViewController: MPPositive_BaseViewController { + //顶部封面图(呈现歌单封面) + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + //阴影渐变图(遮挡封面图) + private lazy var maskImageView:UIImageView = { + let imageView:UIImageView = .init(image: .init(named: "List_Cover'mask")) + imageView.contentMode = .scaleAspectFill + return imageView + }() + //毛玻璃效果View + private lazy var blurView:UIVisualEffectView = setBlurView() + //标题Label + private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 22*width, weight: .medium), textColor: .white, textAlignment: .left, lines: 1) + //介绍Label + private lazy var descriptionLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left, lines: 3) + //播放全部View + private lazy var playListView:UIView = setPlayAllView() + //播放全部列表按钮 + private lazy var playListBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "List_UnPlay'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "List_Played'logo"), for: .selected) + btn.isUserInteractionEnabled = false + return btn + }() + //全部Label + private lazy var playListNumberLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + //收藏按钮 + private lazy var collectionListBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "List_UnCollection'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "List_Collectioned'logo"), for: .selected) + btn.addTarget(self, action: #selector(collectionSwitchClick(_ :)), for: .touchUpInside) + return btn + }() + //播放状态按钮 + private lazy var playTypeBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "List_NormolPlay'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "List_ShufflePlay'logo"), for: .selected) + btn.addTarget(self, action: #selector(collectionStatuClick(_ :)), for: .touchUpInside) + return btn + }() + //tableView(歌单/专辑详情展示) + private lazy var tableView:UITableView = { + let tableView = UITableView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), style: .plain) + tableView.backgroundColor = .clear + tableView.separatorStyle = .none + tableView.estimatedRowHeight = 200 + tableView.rowHeight = UITableView.automaticDimension + tableView.dataSource = self + tableView.delegate = self + tableView.register(MPPositive_MusicItemShowTableViewCell.self, forCellReuseIdentifier: MPPositive_MusicItemShowTableViewCellID) + return tableView + }() + private let MPPositive_MusicItemShowTableViewCellID = "MPPositive_MusicItemShowTableViewCell" + //传递的列表/专辑值 + var listOrAlbum:MPPositive_ListAlbumListViewModel! + override func viewDidLoad() { + super.viewDidLoad() + setTitle("") + setPopBtn() + configure() +// MP_NetWorkManager.shared.testFunction() + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + reload() + } + //页面刷新 + private func reload() { + listOrAlbum.header.setUrltoImage(coverImageView) + titleLabel.text = listOrAlbum.header.title + descriptionLabel.text = listOrAlbum.header._description + playListNumberLabel.text = "Play all (\(listOrAlbum.items.count))" + } + //MARK: - UI生成与配置 + //页面配置 + private func configure() { + //添加封面图 + view.addSubview(coverImageView) + coverImageView.snp.makeConstraints { make in + make.left.top.right.equalToSuperview() + make.height.equalTo(413*width) + } + view.sendSubviewToBack(coverImageView) + //添加阴影 + view.addSubview(maskImageView) + maskImageView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.height.equalTo(281*width) + make.bottom.equalTo(coverImageView.snp.bottom) + } + //添加毛玻璃 + view.addSubview(blurView) + blurView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.height.equalTo(173*width) + make.bottom.equalTo(maskImageView.snp.bottom) + } + //设置毛玻璃内容 + view.addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(blurView.snp.top).offset(18*width) + make.left.equalToSuperview().offset(18*width) + make.right.equalToSuperview().offset(-18*width) + } + view.addSubview(descriptionLabel) + descriptionLabel.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(12*width) + make.left.right.equalTo(titleLabel) + } + view.addSubview(playListView) + playListView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(18*width) + make.width.equalTo(138*width) + make.height.equalTo(32*width) + make.bottom.equalTo(blurView.snp.bottom).offset(-29*width) + } + view.addSubview(playTypeBtn) + playTypeBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.right.equalToSuperview().offset(-18*width) + make.centerY.equalTo(playListView.snp.centerY) + } + view.addSubview(collectionListBtn) + collectionListBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.right.equalToSuperview().offset(-56*width) + make.centerY.equalTo(playListView.snp.centerY) + } + view.addSubview(tableView) + tableView.snp.makeConstraints { make in + make.left.bottom.right.equalToSuperview() + make.top.equalTo(coverImageView.snp.bottom) + } + } + ///生成一个毛玻璃效果View,包含标题和说明 + private func setBlurView() -> UIVisualEffectView { + // 创建一个模糊效果 + let blurEffect = UIBlurEffect(style: .light) + // 创建一个可交互的毛玻璃视图 + let blurEffectView = UIVisualEffectView(effect: blurEffect) + blurEffectView.alpha = 0.3 + blurEffectView.isUserInteractionEnabled = true + blurEffectView.layer.masksToBounds = true + blurEffectView.layer.cornerRadius = 16*width + blurEffectView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + return blurEffectView + } + ///播放全部按钮View + private func setPlayAllView() -> UIView { + let allView:UIView = .init() + allView.backgroundColor = .clear + allView.isUserInteractionEnabled = true + allView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(playListActionClick(_ :)))) + let image = UIImageView(image: UIImage(named: "List_PlayAll'bg")) + image.contentMode = .scaleAspectFill + allView.addSubview(image) + image.snp.makeConstraints { make in + make.left.right.top.bottom.equalToSuperview() + } + //添加 + allView.addSubview(playListBtn) + playListBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(4*width) + } + //添加 + allView.addSubview(playListNumberLabel) + playListNumberLabel.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalTo(playListBtn.snp.right).offset(6*width) + } + return allView + } + + //MARK: - 点击事件 + //播放/暂停列表 + @objc private func playListActionClick(_ sender:UITapGestureRecognizer) { + + } + //切换当前列表收藏状态 + @objc private func collectionSwitchClick(_ sender:UIButton) { + + } + //更改当前列表播放状态 + @objc private func collectionStatuClick(_ sender:UIButton) { + + } +} +//MARK: - tableView +extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return listOrAlbum.items.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_MusicItemShowTableViewCellID, for: indexPath) as! MPPositive_MusicItemShowTableViewCell + cell.itemView = listOrAlbum.items[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + //触发next请求,优先获取列表全部单曲基础数据(不完善) + MP_NetWorkManager.shared.requestNextList(listOrAlbum.items[indexPath.row]){ [weak self] listSongs in + guard let self = self else {return} + //回掉的数据并不完善,生成一个playerloadViewModel + let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: listOrAlbum.items[indexPath.row].browseItem.musicVideo.videoId ?? "") + lodaViewModel.improveData(listOrAlbum.items[indexPath.row].browseItem.musicVideo.videoId ?? "") + MP_PlayerManager.shared.loadPlayer = lodaViewModel + //发布弹出音乐播放器的通知 + NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) + } + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_MoreContentViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_MoreContentViewController.swift new file mode 100644 index 0000000..d675b28 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Home(首页,各项列表页,播放器页)/MPPositive_MoreContentViewController.swift @@ -0,0 +1,97 @@ +// +// MPPositive_MoreContentViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/28. +// + +import UIKit +///更多页面(两种款式,单曲/视频一种,列表/专辑一种) +class MPPositive_MoreContentViewController: MPPositive_BaseViewController { + //约束类型设置 + enum MoreShowType: Int { + case Single = 0 + case List = 1 + + //布局Layout + var layout:UICollectionViewFlowLayout{ + let layout = UICollectionViewFlowLayout() + layout.sectionInset = .init(top: 0, left: 18*width, bottom: 50*width, right: 16*width) + switch self { + case .Single: + layout.itemSize = .init(width: 339*width, height: 237*width) + layout.minimumLineSpacing = 32*width + case .List: + layout.itemSize = .init(width: 162*width, height: 210*width) + layout.minimumLineSpacing = 32*width + layout.minimumInteritemSpacing = 15*width + } + return layout + } + } + ///列表展示类型 + private var showType:MoreShowType = .Single{ + didSet{ + collectionView.collectionViewLayout = showType.layout + collectionView.reloadData() + } + } + private lazy var collectionView:UICollectionView = { + let collectionView:UICollectionView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), collectionViewLayout: showType.layout) + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.backgroundColor = .clear + collectionView.dataSource = self + collectionView.delegate = self + collectionView.register(MPPositive_MoreListContentCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_MoreListContentCollectionViewCellID) + collectionView.register(MPPositive_HomeListFifthCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListFifthCollectionViewCellID) + return collectionView + }() + //列表cell + private let MPPositive_MoreListContentCollectionViewCellID = "MPPositive_MoreListContentCollectionViewCell" + //单曲cell + private let MPPositive_HomeListFifthCollectionViewCellID = "MPPositive_HomeListFifthCollectionViewCell" + //传值 + var browseModuleList:MPPositive_BrowseModuleListViewModel! + override func viewDidLoad() { + super.viewDidLoad() + setTitle("Report") + setPopBtn() + confirgue() + } + private func confirgue() { + view.backgroundColor = .init(hex: "#121212") + view.addSubview(collectionView) + collectionView.snp.makeConstraints { make in + make.top.equalTo(navView.snp.bottom).offset(32*width) + make.left.right.bottom.equalToSuperview() + } + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + reload() + } + //传递数据检测 + private func reload() { + //根据传递的数据类型进行检测,判断是什么类型的 + showType = .init(rawValue: browseModuleList.items.first?.browseItem.itemType.rawValue ?? 0)! + } +} +//MARK: - collectionView +extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return browseModuleList.items.count + } + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + switch showType { + case .Single: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListFifthCollectionViewCellID, for: indexPath) as! MPPositive_HomeListFifthCollectionViewCell + cell.itemViewModel = browseModuleList.items[indexPath.row] + return cell + case .List: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_MoreListContentCollectionViewCellID, for: indexPath) as! MPPositive_MoreListContentCollectionViewCell + cell.itemViewModel = browseModuleList.items[indexPath.row] + return cell + } + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerListShowViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerListShowViewController.swift new file mode 100644 index 0000000..6739227 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerListShowViewController.swift @@ -0,0 +1,79 @@ +// +// MPPositive_PlayerListShowViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/10. +// + +import UIKit + +class MPPositive_PlayerListShowViewController: UIViewController { + //小角标图片 + private lazy var indictorImageView:UIImageView = .init(image: .init(named: "Player_Indictor'logo")) + //tableView(列表展示) + private lazy var tableView:UITableView = { + let tableView = UITableView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), style: .plain) + tableView.backgroundColor = .clear + tableView.separatorStyle = .none + tableView.contentInset = .init(top: 0, left: 0, bottom: 30*width, right: 0) + tableView.estimatedRowHeight = 200 + tableView.rowHeight = UITableView.automaticDimension + tableView.dataSource = self + tableView.delegate = self + tableView.register(MPPositive_PlayerListShowTableViewCell.self, forCellReuseIdentifier: MPPositive_PlayerListShowTableViewCellID) + return tableView + }() + private let MPPositive_PlayerListShowTableViewCellID = "MPPositive_PlayerListShowTableViewCell" + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .init(hex: "#1A1A1A") + view.layer.masksToBounds = true + view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + view.layer.cornerRadius = 18*width + configure() + } + + private func configure() { + view.addSubview(indictorImageView) + indictorImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.width.equalTo(29*width) + make.height.equalTo(4*width) + make.top.equalTo(12*width) + } + view.addSubview(tableView) + tableView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(38*width) + make.left.right.bottom.equalToSuperview() + } + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + tableView.reloadData() + } +} +//MARK: - tableView +extension MPPositive_PlayerListShowViewController: UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + //展示MP_PlayerManager中的列表数据 + return MP_PlayerManager.shared.loadPlayer.songVideos.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_PlayerListShowTableViewCellID, for: indexPath) as! MPPositive_PlayerListShowTableViewCell + cell.song = MP_PlayerManager.shared.loadPlayer.songVideos[indexPath.row] + cell.removeBlock = { + [weak self] in + //从列表中移除音乐 + MP_PlayerManager.shared.loadPlayer.removeData(MP_PlayerManager.shared.loadPlayer.songVideos[indexPath.row].videoId) + tableView.reloadData() + } + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + //播放选中音乐 + dismiss(animated: true) { + //更新播放音乐 + MP_PlayerManager.shared.loadPlayer.improveData(MP_PlayerManager.shared.loadPlayer.songVideos[indexPath.row].videoId) + } + } +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift new file mode 100644 index 0000000..e48ec22 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Player(播放器)/MPPositive_PlayerViewController.swift @@ -0,0 +1,412 @@ +// +// MPPositive_PlayerViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/29. +// + +import UIKit +import Kingfisher +///b面播放器内容 +class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewControllerTransitioningDelegate { + //播放器展示状态 + enum PlayerShowType:Int { + ///展示封面 + case showCover = 0 + ///展示歌词 + case showLyric = 1 + } + //当前上方展示View展示内容(默认展示封面) + private var topShowType:PlayerShowType = .showCover{ + didSet{ + setSwitchAnimation(topShowType) + } + } + //MARK: - 导航View中的内容 + //左侧向下的按钮 + private lazy var leftPopBtn:UIButton = { + let btn = UIButton() + btn.backgroundColor = .init(hex: "#FFFFFF", alpha: 0.15) + //添加白色边框 + btn.layer.borderColor = UIColor(hex: "#FFFFFF", alpha: 0.3).cgColor + btn.layer.borderWidth = 1*width + btn.layer.cornerRadius = 21*width + btn.layer.masksToBounds = true + //设置图片 + btn.setImage(UIImage(named: "Player_Pop'logo"), for: .normal) + btn.addTarget(self, action: #selector(disMissClick(_ :)), for: .touchUpInside) + return btn + }() + //中间单选按钮组View(SONG|LYRICS) + private lazy var switchActionView:UIView = createSwitchActionView() + //生成SONG按钮(默认选中) + private lazy var songBtn:UIButton = createStatueBtn("SONG", color: .init(hex: "#FFFFFF", alpha: 0.85), tag: 0) + //生成LYRICS按钮 + private lazy var lyricsBtn:UIButton = createStatueBtn("LYRICS", color: .init(hex: "#FFFFFF", alpha: 0.45), tag: 1) + //右侧关联按钮 + private lazy var relatedBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Player_Related'logo"), for: .normal) + btn.addTarget(self, action: #selector(relatedContentClick(_ :)), for: .touchUpInside) + return btn + }() + //MARK: - 背景视图 + //背景封面图 + private lazy var backImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + //背景模糊图层 + private lazy var backBlurView:UIVisualEffectView = { + // 创建一个模糊效果 + let blurEffect = UIBlurEffect(style: .dark) + // 创建一个可交互的毛玻璃视图 + let blurEffectView = UIVisualEffectView(effect: blurEffect) + blurEffectView.alpha = 0.8 + blurEffectView.isUserInteractionEnabled = false + return blurEffectView + }() + //MARK: - 底部按钮事件内容 + //播放状态按钮 + private lazy var playBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Player_Pause'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "Player_Player'logo"), for: .selected) + btn.addTarget(self, action: #selector(playClick(_ :)), for: .touchUpInside) + return btn + }() + //歌单列表按钮 + private lazy var listBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Player_List'logo"), for: .normal) + btn.addTarget(self, action: #selector(listClick(_ :)), for: .touchUpInside) + return btn + }() + //播放类型按钮(按顺序播放,随机播放,单曲循环) + private lazy var typeBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "List_NormolPlay'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "List_ShufflePlay'logo"), for: .selected) + btn.addTarget(self, action: #selector(typeClick(_ :)), for: .touchUpInside) + return btn + }() + //下一首按钮 + private lazy var nextBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Player_Next'logo"), for: .normal) + btn.addTarget(self, action: #selector(nextClick(_ :)), for: .touchUpInside) + return btn + }() + private lazy var perviousBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Player_Pervious'logo"), for: .normal) + btn.addTarget(self, action: #selector(previousClick(_ :)), for: .touchUpInside) + return btn + }() + //封面View(封面,标题,副标题,收藏,下载,进度条View) + private lazy var coverView:MPPositive_PlayerCoverView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width)) + //歌词View + private lazy var lyricsView:MPPositive_PlayerLyricView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 480*width)) + override func viewDidLoad() { + super.viewDidLoad() + //隐藏导航栏label + setTitle("") + configure() + //添加监听 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(playerReloadAction(_ :)), notificationName: .positive_player_reload) + } + deinit { + NotificationCenter.default.removeObserver(self) + } + //视图配置 + private func configure() { + //导航View内容配置 + navView.addSubview(leftPopBtn) + leftPopBtn.snp.makeConstraints { make in + make.width.height.equalTo(42*width) + make.left.equalToSuperview().offset(16*width) + make.centerY.equalToSuperview() + } + navView.addSubview(relatedBtn) + relatedBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.right.equalToSuperview().offset(-16*width) + make.centerY.equalToSuperview() + } + navView.addSubview(switchActionView) + switchActionView.snp.makeConstraints { make in + make.height.equalToSuperview() + make.width.equalToSuperview().multipliedBy(0.45) + make.center.equalToSuperview() + } + //背景内容配置 + view.addSubview(backImageView) + backImageView.snp.makeConstraints { make in + make.left.right.top.bottom.equalToSuperview() + } + view.addSubview(backBlurView) + backBlurView.snp.makeConstraints { make in + make.left.right.top.bottom.equalToSuperview() + } + //配置封面和歌词 + view.addSubview(lyricsView) + lyricsView.snp.makeConstraints { make in + make.top.equalTo(navView.snp.bottom) + make.left.right.equalToSuperview() + make.height.equalTo(480*width) + } + lyricsView.isHidden = true + view.addSubview(coverView) + coverView.snp.makeConstraints { make in + make.top.equalTo(navView.snp.bottom) + make.left.right.equalToSuperview() + make.height.equalTo(480*width) + } + coverView.isHidden = false + let bottomImageView:UIImageView = .init(image: .init(named: "Player_Bottom'mask")) + bottomImageView.contentMode = .scaleAspectFill + bottomImageView.isUserInteractionEnabled = false + view.addSubview(bottomImageView) + bottomImageView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(286*width) + } + //底部容器配置 + let bottomView = createBottomView() + view.addSubview(bottomView) + bottomView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(200*width) + } + } + //生成一个单选按钮组View + private func createSwitchActionView() -> UIView { + let actionView:UIView = UIView() + actionView.backgroundColor = .clear + actionView.addSubview(songBtn) + songBtn.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview().multipliedBy(0.5) + } + actionView.addSubview(lyricsBtn) + lyricsBtn.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.centerX.equalToSuperview().multipliedBy(1.5) + } + //生成间隔线View + let lineView:UIView = .init() + lineView.backgroundColor = .init(hex: "#FFFFFF", alpha: 0.45) + actionView.addSubview(lineView) + lineView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(1*width) + make.height.equalTo(14*width) + } + //生成按钮 + return actionView + } + //生成页面状态按钮 + private func createStatueBtn(_ text:String = "text", color:UIColor, tag:Int) -> UIButton { + let btn = UIButton() + btn.setTitle(text, for: .normal) + btn.setTitleColor(color, for: .normal) + btn.titleLabel?.font = .systemFont(ofSize: 15, weight: .regular) + btn.tag = tag + btn.addTarget(self, action: #selector(switchActionClick(_ :)), for: .touchUpInside) + return btn + } + //生成一个底部容器View + private func createBottomView() -> UIView { + let bottomView:UIView = .init() + bottomView.backgroundColor = .clear + bottomView.addSubview(playBtn) + playBtn.snp.makeConstraints { make in + make.width.height.equalTo(66*width) + make.center.equalToSuperview() + } + bottomView.addSubview(listBtn) + listBtn.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-20*width) + make.centerY.equalToSuperview() + make.width.height.equalTo(24*width) + } + bottomView.addSubview(typeBtn) + typeBtn.snp.makeConstraints { make in + make.left.equalToSuperview().offset(20*width) + make.centerY.equalToSuperview() + make.width.height.equalTo(24*width) + } + bottomView.addSubview(nextBtn) + nextBtn.snp.makeConstraints { make in + make.width.height.equalTo(20*width) + make.centerY.equalTo(playBtn.snp.centerY) + make.right.equalToSuperview().offset(-98*width) + } + bottomView.addSubview(perviousBtn) + perviousBtn.snp.makeConstraints { make in + make.width.height.equalTo(20*width) + make.centerY.equalTo(playBtn.snp.centerY) + make.left.equalToSuperview().offset(98*width) + } + return bottomView + } + //MARK: - 通知 + @objc private func playerReloadAction(_ sender:Notification) { + //渲染页面 + DispatchQueue.main.async { + [weak self] in + guard let self = self else {return} + backImageView.kf.setImage(with: MP_PlayerManager.shared.loadPlayer.currentVideo?.coverUrl) + coverView.coverImageView.kf.setImage(with: MP_PlayerManager.shared.loadPlayer.currentVideo?.coverUrl) + coverView.titleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.title + coverView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle + lyricsView.titleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.title + lyricsView.subtitleLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo?.subtitle + lyricsView.lyricsLabel.text = MP_PlayerManager.shared.loadPlayer.currentVideo.lyrics ?? "No Lyrics" + //启动播放 + MP_PlayerManager.shared.play { [weak self] in + guard let self = self else { return } + //回正进度条 + coverView.sliderView.value = 0 + playBtn.isSelected = true + playBtn.isUserInteractionEnabled = true + } runAction: { [weak self] (currentTime, duration) in + guard let self = self else { return } + //展示当前时间 + coverView.durationLabel.text = setTimesToMinSeconds(currentTime) + //展示剩余时间 + let remain:TimeInterval = duration - currentTime + coverView.maxTimesLabel.text = setTimesToMinSeconds(remain) + //调整进度条内容 + let value = currentTime/duration + coverView.sliderView.value = Float(value) + } + } + } + //MARK: - 点击事件 + //向下dismiss + @objc private func disMissClick(_ sender:UIButton) { + dismiss(animated: true) + } + //切换页面显示内容(单曲封面|歌词)按钮组 + @objc private func switchActionClick(_ sender:UIButton) { + topShowType = .init(rawValue: sender.tag)! + } + //切换动画 + private func setSwitchAnimation(_ sender: PlayerShowType) { + //切换时,禁止segmentedView交互 + switchActionView.isUserInteractionEnabled = false + switch sender { + case .showCover://展示封面 + UIView.animate(withDuration: 0.4) { + [weak self] in + guard let self = self else {return} + //展示封面 + coverView.alpha = 1.0 + coverView.isHidden = false + //lyricView隐藏 + lyricsView.alpha = 0.1 + songBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.85), for: .normal) + lyricsBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.45), for: .normal) + } completion: { [weak self] (_) in + guard let self = self else {return} + //平移结束后,隐藏lyricListView + lyricsView.isHidden = true + //完成状况允许交互 + switchActionView.isUserInteractionEnabled = true + } + case .showLyric://展示歌词 + UIView.animate(withDuration: 0.4) { + [weak self] in + guard let self = self else {return} + //展示歌词 + lyricsView.alpha = 1.0 + lyricsView.isHidden = false + //coverView向左平移一个屏幕尺度 + coverView.alpha = 0.1 + songBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.45), for: .normal) + lyricsBtn.setTitleColor(.init(hex: "#FFFFFF", alpha: 0.85), for: .normal) + } completion: { [weak self] (_) in + guard let self = self else {return} + //平移结束后,隐藏coverView + coverView.isHidden = true + //完成状况允许交互 + switchActionView.isUserInteractionEnabled = true + } + } + } + //弹出关联内容 + @objc private func relatedContentClick(_ sender:UIButton) { + + } + + //播放/暂停/继续 + @objc private func playClick(_ sender:UIButton) { + switch MP_PlayerManager.shared.getPlayState() { + case .Null: + //启动播放 + MP_PlayerManager.shared.play { [weak self] in + guard let self = self else { return } + //回正进度条 + coverView.sliderView.value = 0 + sender.isSelected = true + } runAction: { [weak self] (currentTime, duration) in + guard let self = self else { return } + //展示当前时间 + coverView.durationLabel.text = setTimesToMinSeconds(currentTime) + //展示剩余时间 + let remain:TimeInterval = duration - currentTime + coverView.maxTimesLabel.text = setTimesToMinSeconds(remain) + //调整进度条内容 + let value = currentTime/duration + coverView.sliderView.value = Float(value) + } + + case .Playing: + //播放中,进入暂停 + MP_PlayerManager.shared.pause { + [weak self] in + sender.isSelected = false + } + case .Pause: + //暂停中,进入继续 + MP_PlayerManager.shared.resume { + [weak self] in + sender.isSelected = true + } + } + } + //展示列表 + @objc private func listClick(_ sender:UIButton) { + if MP_PlayerManager.shared.loadPlayer != nil { + let listVC = MPPositive_PlayerListShowViewController() + listVC.transitioningDelegate = self + listVC.modalPresentationStyle = .custom + present(listVC, animated: true) + } + } + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return MPPositive_PresentationController(presentedViewController: presented, presenting: presenting) + } + //切换播放器状态(按顺序/随机/单曲) + @objc private func typeClick(_ sender:UIButton) { + + } + //下一首 + @objc private func nextClick(_ sender:UIButton) { + coverView.sliderView.value = 0 + playBtn.isSelected = false + playBtn.isUserInteractionEnabled = false + MP_PlayerManager.shared.nextEvent() + + } + //上一首 + @objc private func previousClick(_ sender:UIButton) { + coverView.sliderView.value = 0 + playBtn.isSelected = false + playBtn.isUserInteractionEnabled = false + MP_PlayerManager.shared.previousEvent() + } + +} diff --git a/MusicPlayer/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift b/MusicPlayer/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift new file mode 100644 index 0000000..eb71d7d --- /dev/null +++ b/MusicPlayer/MP/MPPositive/ViewControllers/Search(搜索页)/MPPositive_SearchViewController.swift @@ -0,0 +1,29 @@ +// +// MPPositive_SearchViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit + +class MPPositive_SearchViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_BottomShowView.swift b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_BottomShowView.swift new file mode 100644 index 0000000..9d586fe --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_BottomShowView.swift @@ -0,0 +1,89 @@ +// +// MPPositive_BottomShowView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit +///b面底部播放音乐展示View +class MPPositive_BottomShowView: UIView { + //绿色背景图片 + private lazy var bgGreenImageView:UIImageView = UIImageView(image: .init(named: "BottomShow'bg")) + //音乐封面展示圆框 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init(frame: .init(x: 26*width, y: 13*width, width: 48*width, height: 48*width)) + imageView.contentMode = .scaleAspectFill + imageView.layer.cornerRadius = 24*width + imageView.layer.masksToBounds = true + return imageView + }() + //标题Label + private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 16*width, weight: .semibold), textColor: .init(hex: "#000000"), textAlignment: .left) + //副标题(歌手/专辑/乐队) + private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .light), textColor: .init(hex: "#000000"), textAlignment: .left) + //音乐列表按钮 + private lazy var listsBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Bottom Lists'logo"), for: .normal) + btn.addTarget(self, action: #selector(expandListsClick(_ :)), for: .touchUpInside) + return btn + }() + //音乐播放器状态按钮 + private lazy var playStatuBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "Bottom Pause'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "Bottom Play'logo"), for: .selected) + btn.addTarget(self, action: #selector(switchStatuClick(_ :)), for: .touchUpInside) + return btn + }() + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + addSubview(bgGreenImageView) + bgGreenImageView.snp.makeConstraints { make in + make.left.right.top.bottom.equalToSuperview() + } + addSubview(coverImageView) + addSubview(listsBtn) + listsBtn.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-24*width) + make.top.equalToSuperview().offset(21*width) + make.height.width.equalTo(32*width) + } + addSubview(playStatuBtn) + playStatuBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalTo(listsBtn) + make.right.equalTo(listsBtn.snp.left).offset(-20*width) + } + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView).offset(5*width) + make.left.equalTo(coverImageView.snp.right).offset(12*width) + make.right.equalTo(playStatuBtn.snp.left).offset(-10*width) + } + addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(4*width) + make.right.equalTo(titleLabel) + } + } + + //展开当前音乐列表 + @objc private func expandListsClick(_ sender:UIButton) { + + } + //切换播放音乐状态 + @objc private func switchStatuClick(_ sender:UIButton) { + + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBar.swift b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBar.swift new file mode 100644 index 0000000..66c76b2 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBar.swift @@ -0,0 +1,32 @@ +// +// MPPositive_CustomTabBar.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit + +class MPPositive_CustomTabBar: UITabBar { + //tabBarView + fileprivate lazy var tabBarView:MPPositive_CustomTabBarView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 72*borderWidth)) + + override init(frame: CGRect) { + super.init(frame: frame) + self.addSubview(tabBarView) + backgroundColor = .clear + tabBarView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(72*width) + } + } + override func layoutSubviews() { + super.layoutSubviews() + //将tabBarView置于顶层 + self.bringSubviewToFront(tabBarView) + } + required init?(coder: NSCoder) { + super.init(coder: coder) + } + +} diff --git a/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarItem.swift b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarItem.swift new file mode 100644 index 0000000..829018a --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarItem.swift @@ -0,0 +1,68 @@ +// +// MPPositive_CustomTabBarItem.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit +///b面tabBarItem +class MPPositive_CustomTabBarItem: UIView { + ///icon图片 + fileprivate lazy var iconImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + ///选中圆圈(选中状态显示) + private lazy var circleImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.image = UIImage(named: "B_Circle") + imageView.contentMode = .scaleAspectFill + return imageView + }() + ///展示的内容 + var title:String!{ + didSet{ + iconImageView.image = UIImage(named: title) + } + } + ///选中状态 + var isSelected:Bool = false{ + didSet{ + if isSelected { + //选中 + iconImageView.image = UIImage(named: title + " 1") + circleImageView.isHidden = false + }else{ + //未选中 + iconImageView.image = UIImage(named: title) + circleImageView.isHidden = true + } + } + } + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + //添加圆圈 + addSubview(circleImageView) + circleImageView.snp.makeConstraints { make in + make.width.height.equalToSuperview() + make.center.equalToSuperview() + } + circleImageView.isHidden = true + //添加icon + addSubview(iconImageView) + iconImageView.snp.makeConstraints { make in + make.width.height.equalTo(28*width) + make.center.equalToSuperview() + } + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarView.swift b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarView.swift new file mode 100644 index 0000000..eebd8b3 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Base/MPPositive_CustomTabBarView.swift @@ -0,0 +1,84 @@ +// +// MPPositive_CustomTabBarView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/19. +// + +import UIKit + +class MPPositive_CustomTabBarView: UIView { + ///背景图片 + private lazy var bgImageView:UIImageView = { + let bgImageView:UIImageView = .init(image: .init(named: "TabBar'bg")) + bgImageView.contentMode = .scaleAspectFill + bgImageView.layer.masksToBounds = true + bgImageView.layer.cornerRadius = 24*width + bgImageView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner] + return bgImageView + }() + ///items + private lazy var tabBarItems:[MPPositive_CustomTabBarItem] = { + var tabBarItems:[MPPositive_CustomTabBarItem] = [] + for index in 0.. UIView { + let showView:UIView = .init() + showView.backgroundColor = .init(hex: "#000000", alpha: 0.7) + showView.addSubview(statuBtn) + statuBtn.snp.makeConstraints { make in + make.width.equalTo(30*width) + make.height.equalTo(22*width) + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-14*width).priority(999) + } + showView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(10*width) + make.left.equalToSuperview().offset(12*width) + make.right.equalTo(statuBtn.snp.left).offset(-10*width) + } + showView.addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel.snp.left) + make.top.equalTo(titleLabel.snp.bottom).offset(1*width) + make.right.equalTo(titleLabel.snp.right) + } + return showView + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListFourthCollectionViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListFourthCollectionViewCell.swift new file mode 100644 index 0000000..7c3d391 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListFourthCollectionViewCell.swift @@ -0,0 +1,52 @@ +// +// MPPositive_HomeListFourthCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/22. +// + +import UIKit +///b面首页展示列表四(歌手) +class MPPositive_HomeListFourthCollectionViewCell: UICollectionViewCell { + //歌手图片 + private lazy var singerImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 32*width + return imageView + }() + //歌手名字 + private lazy var singerLabel:UILabel = createLabel("Name", font: .systemFont(ofSize: 12, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.8), textAlignment: .left) + var itemViewModel:MPPositive_BrowseItemViewModel!{ + didSet{ + itemViewModel.setUrltoImage(singerImageView) + singerLabel.text = itemViewModel.title +// subtitleLabel.text = itemViewModel.subtitle + } + } + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + backgroundColor = .clear + layer.masksToBounds = true + addSubview(singerImageView) + singerImageView.snp.makeConstraints { make in + make.width.height.equalTo(64*width) + make.centerX.equalToSuperview() + make.top.equalToSuperview() + } + addSubview(singerLabel) + singerLabel.snp.makeConstraints { make in + make.centerX.bottom.equalToSuperview() + make.width.equalToSuperview().multipliedBy(0.7) + } + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListSecondCollectionViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListSecondCollectionViewCell.swift new file mode 100644 index 0000000..65b455d --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListSecondCollectionViewCell.swift @@ -0,0 +1,73 @@ +// +// MPPositive_HomeListSecondCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/22. +// + +import UIKit +///b面首页展示列表二 +class MPPositive_HomeListSecondCollectionViewCell: UICollectionViewCell { + //封面 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 16*width + return imageView + }() + //播放状态View + private lazy var statuView:UIView = setStatuView() + //标题Label + private lazy var titleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + var itemViewModel:MPPositive_BrowseItemViewModel!{ + didSet{ + itemViewModel.setUrltoImage(coverImageView) + titleLabel.text = itemViewModel.title + } + } + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + backgroundColor = .clear + layer.masksToBounds = true + addSubview(coverImageView) + coverImageView.snp.makeConstraints { make in + make.left.top.right.equalToSuperview() + make.height.equalTo(96*width) + } + addSubview(statuView) + statuView.snp.makeConstraints { make in + make.left.right.bottom.top.equalTo(coverImageView) + } + statuView.isHidden = true + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + } + + } + //生成的覆盖黑色半透明View + private func setStatuView() -> UIView { + let bgView:UIView = .init() + bgView.backgroundColor = .init(hex: "#000000", alpha: 0.7) + bgView.layer.masksToBounds = true + bgView.layer.cornerRadius = 16*width + //播放状态图片 + let imageView:UIImageView = .init(image: .init(named: "Home Second'play")) + bgView.addSubview(imageView) + imageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(14*width) + make.height.equalTo(17*width) + } + return bgView + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListThirdCollectionViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListThirdCollectionViewCell.swift new file mode 100644 index 0000000..18a60bc --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeListThirdCollectionViewCell.swift @@ -0,0 +1,81 @@ +// +// MPPositive_HomeListThirdCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/22. +// + +import UIKit +///b面首页展示列表三 +class MPPositive_HomeListThirdCollectionViewCell: UICollectionViewCell { + //封面 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 16*width + return imageView + }() + //播放状态View + private lazy var statuView:UIView = setStatuView() + //标题Label + private lazy var titleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + //副标题 + private lazy var subtitleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left) + var itemViewModel:MPPositive_BrowseItemViewModel!{ + didSet{ + itemViewModel.setUrltoImage(coverImageView) + titleLabel.text = itemViewModel.title + subtitleLabel.text = itemViewModel.subtitle + } + } + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + backgroundColor = .clear + layer.masksToBounds = true + addSubview(coverImageView) + coverImageView.snp.makeConstraints { make in + make.left.top.right.equalToSuperview() + make.height.equalTo(109*width) + } + addSubview(statuView) + statuView.snp.makeConstraints { make in + make.left.right.bottom.top.equalTo(coverImageView) + } + statuView.isHidden = true + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView.snp.bottom).offset(9*width) + make.left.right.equalToSuperview() + } + addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.left.bottom.right.equalToSuperview() + } + } + //生成的覆盖黑色半透明View + private func setStatuView() -> UIView { + let bgView:UIView = .init() + bgView.backgroundColor = .init(hex: "#000000", alpha: 0.7) + bgView.layer.masksToBounds = true + bgView.layer.cornerRadius = 16*width + //播放状态图片 + let imageView:UIImageView = .init(image: .init(named: "Home Second'play")) + bgView.addSubview(imageView) + imageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(14*width) + make.height.equalTo(17*width) + } + return bgView + } + +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeShowTableViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeShowTableViewCell.swift new file mode 100644 index 0000000..c7f2831 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_HomeShowTableViewCell.swift @@ -0,0 +1,196 @@ +// +// MPPositive_HomeShowTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/22. +// + +import UIKit +///b面主页Cell +class MPPositive_HomeShowTableViewCell: UITableViewCell { + //首页预览划分类型 + enum HomeShowType:Int { + case Frist = 0 + case Second = 1 + case Third = 2 + case Fourth = 3 + case Fifth = 4 + ///对应布局layout + var layout:UICollectionViewFlowLayout { + let layout = UICollectionViewFlowLayout() + layout.sectionInset = .init(top: 15*width, left: 16*width, bottom: 0, right: 16*width) + layout.minimumLineSpacing = 8*width + switch self { + case .Frist: + layout.itemSize = .init(width: 168*width, height: 134*width) + layout.minimumInteritemSpacing = 0 + layout.scrollDirection = .horizontal + case .Second: + layout.itemSize = .init(width: 96*width, height: 121*width) + layout.minimumInteritemSpacing = 0 + layout.scrollDirection = .horizontal + case .Third: + layout.itemSize = .init(width: 109*width, height: 152*width) + layout.minimumInteritemSpacing = 0 + layout.scrollDirection = .horizontal + case .Fourth: + layout.itemSize = .init(width: 64*width, height: 86*width) + layout.minimumInteritemSpacing = 0 + layout.scrollDirection = .horizontal + case .Fifth: + layout.itemSize = .init(width: 339*width, height: 237*width) + layout.sectionInset = .init(top: 15*width, left: 16*width, bottom: 0, right: 20*width) + layout.minimumInteritemSpacing = 16 + layout.scrollDirection = .vertical + } + return layout + } + } + //标题Label + private lazy var titleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 18*width, weight: .regular), textColor: .white, textAlignment: .left) + //更多按钮 + private lazy var moreBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Home_More'logo"), for: .normal) + btn.addTarget(self, action: #selector(moreFindClick(_ :)), for: .touchUpInside) + return btn + }() + //展示collectionView + private lazy var collectionView:UICollectionView = { + let collectionView:UICollectionView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), collectionViewLayout: showType.layout) + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.backgroundColor = .clear + collectionView.dataSource = self + collectionView.delegate = self + collectionView.register(MPPositive_HomeListFirstCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListFirstCollectionViewCellID) + collectionView.register(MPPositive_HomeListSecondCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListSecondCollectionViewCellID) + collectionView.register(MPPositive_HomeListThirdCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListThirdCollectionViewCellID) + collectionView.register(MPPositive_HomeListFourthCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListFourthCollectionViewCellID) + collectionView.register(MPPositive_HomeListFifthCollectionViewCell.self, forCellWithReuseIdentifier: MPPositive_HomeListFifthCollectionViewCellID) + return collectionView + }() + private let MPPositive_HomeListFirstCollectionViewCellID = "MPPositive_HomeListFirstCollectionViewCell" + private let MPPositive_HomeListSecondCollectionViewCellID = "MPPositive_HomeListSecondCollectionViewCell" + private let MPPositive_HomeListThirdCollectionViewCellID = "MPPositive_HomeListThirdCollectionViewCell" + private let MPPositive_HomeListFourthCollectionViewCellID = "MPPositive_HomeListFourthCollectionViewCell" + private let MPPositive_HomeListFifthCollectionViewCellID = "MPPositive_HomeListFifthCollectionViewCell" + ///预览模块 + var browseViewModel:MPPositive_BrowseModuleListViewModel!{ + didSet{ + titleLabel.text = browseViewModel.title + } + } + ///列表展示类型 + var showType:HomeShowType = .Frist{ + didSet{ + collectionView.collectionViewLayout = showType.layout + collectionView.reloadData() + } + } + ///请求列表/专辑闭包 + var requestNextBlock:((MPPositive_BrowseItemViewModel) -> Void)? + ///查看更多闭包 + var findMoreBlock:(() -> Void)? + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + //配置 + private func confirgue() { + selectionStyle = .none + backgroundColor = .clear + contentView.backgroundColor = .clear + //配置UI + contentView.addSubview(moreBtn) + moreBtn.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-16*width) + make.top.equalToSuperview() + make.width.height.equalTo(24*width) + } + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16*width) + make.bottom.equalTo(moreBtn.snp.bottom) + make.right.equalTo(moreBtn.snp.left).offset(-10*width) + } + contentView.addSubview(collectionView) + collectionView.snp.makeConstraints { make in + make.top.equalTo(moreBtn.snp.bottom) + make.left.right.equalToSuperview() + make.bottom.equalToSuperview().offset(-32*width).priority(999) + } + } + //查看更多 + @objc private func moreFindClick(_ sender:UIButton) { + guard findMoreBlock != nil else { + return + } + findMoreBlock!() + } + //经过计算设置tableViewCell真实高度 + override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { + let size = super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority) + collectionView.layoutIfNeeded() + switch showType { + case .Fifth: + //纵向 + let height = collectionView.collectionViewLayout.collectionViewContentSize.height + return CGSize(width: size.width, height: size.height + height) + default: + //横向 + let height = showType.layout.itemSize.height + showType.layout.sectionInset.top + showType.layout.sectionInset.bottom + return CGSize(width: size.width, height: size.height + height) + } + } +} +//MARK: - collectionView +extension MPPositive_HomeShowTableViewCell:UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return browseViewModel.items.count > 5 ? 5:browseViewModel.items.count + } + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + switch showType { + case .Frist: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListFirstCollectionViewCellID, for: indexPath) as! MPPositive_HomeListFirstCollectionViewCell + cell.itemViewModel = browseViewModel.items[indexPath.row] + return cell + case .Second: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListSecondCollectionViewCellID, for: indexPath) as! MPPositive_HomeListSecondCollectionViewCell + cell.itemViewModel = browseViewModel.items[indexPath.row] + return cell + case .Third: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListThirdCollectionViewCellID, for: indexPath) as! MPPositive_HomeListThirdCollectionViewCell + cell.itemViewModel = browseViewModel.items[indexPath.row] + return cell + case .Fourth: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListFourthCollectionViewCellID, for: indexPath) as! MPPositive_HomeListFourthCollectionViewCell + cell.itemViewModel = browseViewModel.items[indexPath.row] + return cell + case .Fifth: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MPPositive_HomeListFifthCollectionViewCellID, for: indexPath) as! MPPositive_HomeListFifthCollectionViewCell + cell.itemViewModel = browseViewModel.items[indexPath.row] + return cell + } + } + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard requestNextBlock != nil else { + return + } + requestNextBlock!(browseViewModel.items[indexPath.row]) + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MoreListContentCollectionViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MoreListContentCollectionViewCell.swift new file mode 100644 index 0000000..6d18d1d --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MoreListContentCollectionViewCell.swift @@ -0,0 +1,80 @@ +// +// MPPositive_MoreListContentCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/28. +// + +import UIKit +///更多页面 展示列表/专辑的cell +class MPPositive_MoreListContentCollectionViewCell: UICollectionViewCell { + //封面 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 16*width + return imageView + }() + //播放状态View + private lazy var statuView:UIView = setStatuView() + //标题Label + private lazy var titleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + //副标题 + private lazy var subtitleLabel:UILabel = createLabel("Title", font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left) + var itemViewModel:MPPositive_BrowseItemViewModel!{ + didSet{ + itemViewModel.setUrltoImage(coverImageView) + titleLabel.text = itemViewModel.title + subtitleLabel.text = itemViewModel.subtitle + } + } + override init(frame: CGRect) { + super.init(frame: frame) + confirgue() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func confirgue() { + backgroundColor = .clear + layer.masksToBounds = true + addSubview(coverImageView) + coverImageView.snp.makeConstraints { make in + make.left.top.right.equalToSuperview() + make.height.equalTo(164*width) + } + addSubview(statuView) + statuView.snp.makeConstraints { make in + make.left.right.bottom.top.equalTo(coverImageView) + } + statuView.isHidden = true + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView.snp.bottom).offset(9*width) + make.left.right.equalToSuperview() + } + addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.left.bottom.right.equalToSuperview() + } + } + //生成的覆盖黑色半透明View + private func setStatuView() -> UIView { + let bgView:UIView = .init() + bgView.backgroundColor = .init(hex: "#000000", alpha: 0.7) + bgView.layer.masksToBounds = true + bgView.layer.cornerRadius = 16*width + //播放状态图片 + let imageView:UIImageView = .init(image: .init(named: "Home Second'play")) + bgView.addSubview(imageView) + imageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.equalTo(14*width) + make.height.equalTo(17*width) + } + return bgView + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift new file mode 100644 index 0000000..95ef988 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Home/MPPositive_MusicItemShowTableViewCell.swift @@ -0,0 +1,110 @@ +// +// MPPositive_MusicItemShowTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/29. +// + +import UIKit +///b面单曲音乐展示Cell +class MPPositive_MusicItemShowTableViewCell: UITableViewCell { + ///封面图片 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 10*width + return imageView + }() + ///标题 + private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + ///副标题 + private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left) + ///更多按钮 + private lazy var moreBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Song_More'logo"), for: .normal) + btn.addTarget(self, action: #selector(moreActionClick(_ :)), for: .touchUpInside) + return btn + }() + ///下载状态按钮 + private lazy var loadBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Song_Unload'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "Song_Loaded'logo"), for: .selected) + btn.addTarget(self, action: #selector(loadActionClick(_ :)), for: .touchUpInside) + return btn + }() + //音乐实体 + var itemView:MPPositive_BrowseItemViewModel!{ + didSet{ + itemView.setUrltoImage(coverImageView) + titleLabel.text = itemView.title + subtitleLabel.text = itemView.subtitle + //判断是否下载过 + + } + } + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + backgroundColor = .clear + contentView.backgroundColor = .clear + configure() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + private func configure() { + contentView.addSubview(coverImageView) + //设置封面图片,同时撑开cell + coverImageView.snp.makeConstraints { make in + make.width.height.equalTo(60*width) + make.left.equalToSuperview().offset(18*width) + make.top.equalToSuperview().offset(8*width).priority(999) + make.bottom.equalToSuperview().offset(-8*width).priority(999) + } + contentView.addSubview(moreBtn) + moreBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalTo(coverImageView.snp.centerY) + make.right.equalToSuperview().offset(-18*width) + } + contentView.addSubview(loadBtn) + loadBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalTo(coverImageView.snp.centerY) + make.right.equalToSuperview().offset(-54*width) + } + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView.snp.top).offset(10*width) + make.left.equalTo(coverImageView.snp.right).offset(12*width) + make.right.equalTo(loadBtn.snp.left).offset(-12*width) + } + contentView.addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.bottom.equalTo(coverImageView.snp.bottom).offset(-10*width) + make.left.right.equalTo(titleLabel) + } + } + //点击更多 + @objc private func moreActionClick(_ sender:UIButton) { + + } + //点击下载 + @objc private func loadActionClick(_ sender:UIButton) { + + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift new file mode 100644 index 0000000..9205a08 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerCoverView.swift @@ -0,0 +1,142 @@ +// +// MPPositive_PlayerCoverView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/8. +// + +import UIKit +//B面播放器封面View(封面,标题,副标题,收藏,下载,进度条View) +class MPPositive_PlayerCoverView: UIView { + ///封面 + lazy var coverImageView:UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 16*width + return imageView + }() + ///标题 + lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 22*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.85), textAlignment: .left) + ///副标题 + lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#EEEEEE", alpha: 0.6), textAlignment: .left) + ///收藏按钮 + lazy var collectionSongBtn:UIButton = { + let btn = UIButton() + btn.setBackgroundImage(UIImage(named: "List_UnCollection'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "List_Collectioned'logo"), for: .selected) + btn.addTarget(self, action: #selector(collectionSwitchClick(_ :)), for: .touchUpInside) + return btn + }() + ///下载按钮 + lazy var loadBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Song_Unload'logo"), for: .normal) + btn.setBackgroundImage(UIImage(named: "Song_Loaded'logo"), for: .selected) + btn.addTarget(self, action: #selector(loadActionClick(_ :)), for: .touchUpInside) + return btn + }() + ///进度条View + lazy var sliderView:MPPositive_PlayerSilder = { + let sliderView:MPPositive_PlayerSilder = .init(frame: .init(x: 0, y: 0, width: 335*width, height: 6*width)) + sliderView.addTarget(self, action: #selector(seekProgressClick(_:forEvent:)), for: .valueChanged) + sliderView.addTarget(self, action: #selector(seekProgressClick(_:forEvent:)), for: .touchDown) + sliderView.addTarget(self, action: #selector(seekProgressClick(_:forEvent:)), for: .touchUpInside) + return sliderView + }() + ///当前播放时间值Label + lazy var durationLabel:UILabel = createLabel("00:00" ,font: .systemFont(ofSize: 12*width, weight: .medium), textColor: .init(hex: "#FFFFFF", alpha: 0.85), textAlignment: .left) + ///最大播放时间值Label + lazy var maxTimesLabel:UILabel = createLabel("00:00" ,font: .systemFont(ofSize: 12*width, weight: .medium), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .right) + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .clear + configure() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //视图配置 + private func configure() { + //配置封面图 + addSubview(coverImageView) + coverImageView.snp.makeConstraints { make in + make.width.equalTo(335*width) + make.height.equalTo(330*width) + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(12*width) + } + //添加标题 + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.left) + make.top.equalTo(coverImageView.snp.bottom).offset(36*width) + make.right.equalTo(coverImageView.snp.right).offset(-100*width) + } + addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.left.right.equalTo(titleLabel) + make.top.equalTo(titleLabel.snp.bottom).offset(6*width) + } + //配置下载和收藏按钮 + addSubview(loadBtn) + loadBtn.snp.makeConstraints { make in + make.right.equalTo(coverImageView.snp.right).offset(-12*width) + make.top.equalTo(coverImageView.snp.bottom).offset(47*width) + make.width.height.equalTo(24*width) + } + addSubview(collectionSongBtn) + collectionSongBtn.snp.makeConstraints { make in + make.right.equalTo(loadBtn.snp.left).offset(-20*width) + make.centerY.equalTo(loadBtn.snp.centerY) + make.width.height.equalTo(24*width) + } + //配置进度条和时间label + addSubview(sliderView) + sliderView.snp.makeConstraints { make in + make.top.equalTo(subtitleLabel.snp.bottom).offset(25*width) + make.centerX.equalToSuperview() + make.width.equalTo(335*width) + make.height.equalTo(6*width) + } + addSubview(durationLabel) + durationLabel.snp.makeConstraints { make in + make.left.equalTo(sliderView.snp.left) + make.top.equalTo(sliderView.snp.bottom).offset(5*width) + } + addSubview(maxTimesLabel) + maxTimesLabel.snp.makeConstraints { make in + make.right.equalTo(sliderView.snp.right) + make.top.equalTo(sliderView.snp.bottom).offset(5*width) + } + } + //调整音乐进度 + @objc private func seekProgressClick(_ sender: UISlider, forEvent event: UIEvent) { + //获取touchEvent + let touchEvent = event.allTouches?.first + //判断点击事件状态 + switch touchEvent?.phase { + case .began://开始拖动 + //让播放器进入调整状态 + MP_PlayerManager.shared.setEditPorgressStatu() + case .moved://移动中 + break + case .ended://结束 + let value = sender.value + //让播放器恢复状态 + MP_PlayerManager.shared.setEditProgressEnd(value) + default: + break + } + } + //切换当前列表收藏状态 + @objc private func collectionSwitchClick(_ sender:UIButton) { + + } + //点击下载 + @objc private func loadActionClick(_ sender:UIButton) { + + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift new file mode 100644 index 0000000..efe3d0c --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerListShowTableViewCell.swift @@ -0,0 +1,93 @@ +// +// MPPositive_PlayerListShowTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/10. +// + +import UIKit +import Kingfisher +class MPPositive_PlayerListShowTableViewCell: UITableViewCell { + ///封面图片 + private lazy var coverImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + imageView.layer.masksToBounds = true + imageView.layer.cornerRadius = 10*width + return imageView + }() + ///标题 + private lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .white, textAlignment: .left) + ///副标题 + private lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.6), textAlignment: .left) + ///移除按钮 + private lazy var removeBtn:UIButton = { + let btn:UIButton = .init() + btn.setBackgroundImage(UIImage(named: "Player_ListRemove'logo"), for: .normal) + btn.addTarget(self, action: #selector(removeClick(_ :)), for: .touchUpInside) + return btn + }() + var song:MPPositive_SongItemModel!{ + didSet{ + coverImageView.kf.setImage(with: URL(string: song.reviewUrls?.first ?? ""), placeholder: placeholderImage) + titleLabel.text = song.title + subtitleLabel.text = song.shortBylineText + } + } + var removeBlock:(() -> Void)? + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + backgroundColor = .clear + contentView.backgroundColor = .clear + configure() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + private func configure() { + contentView.addSubview(coverImageView) + //设置封面图片,同时撑开cell + coverImageView.snp.makeConstraints { make in + make.width.height.equalTo(60*width) + make.left.equalToSuperview().offset(18*width) + make.top.equalToSuperview().offset(8*width).priority(999) + make.bottom.equalToSuperview().offset(-8*width).priority(999) + } + contentView.addSubview(removeBtn) + removeBtn.snp.makeConstraints { make in + make.width.height.equalTo(24*width) + make.centerY.equalTo(coverImageView.snp.centerY) + make.right.equalToSuperview().offset(-18*width) + } + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalTo(coverImageView.snp.top).offset(10*width) + make.left.equalTo(coverImageView.snp.right).offset(12*width) + make.right.equalTo(removeBtn.snp.left).offset(-12*width) + } + contentView.addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.bottom.equalTo(coverImageView.snp.bottom).offset(-10*width) + make.left.right.equalTo(titleLabel) + } + } + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + //从歌单中移除 + @objc private func removeClick(_ sender:UIButton) { + guard removeBlock != nil else { + return + } + removeBlock!() + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerLyricView.swift b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerLyricView.swift new file mode 100644 index 0000000..74c32a6 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerLyricView.swift @@ -0,0 +1,61 @@ +// +// MPPositive_PlayerLyricView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/8. +// + +import UIKit +//B面播放器歌词View(标题,副标题,歌词) +class MPPositive_PlayerLyricView: UIView { + ///标题 + lazy var titleLabel:UILabel = createLabel(font: .systemFont(ofSize: 20*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.85), textAlignment: .left) + ///副标题 + lazy var subtitleLabel:UILabel = createLabel(font: .systemFont(ofSize: 12*width, weight: .regular), textColor: .init(hex: "#EEEEEE", alpha: 0.45), textAlignment: .left) + //展示ScrollView + lazy var scrollView:UIScrollView = { + let scrollView = UIScrollView() + scrollView.backgroundColor = .clear + scrollView.showsVerticalScrollIndicator = false + scrollView.showsHorizontalScrollIndicator = false + scrollView.addSubview(lyricsLabel) + scrollView.contentSize = .init(width: screen_Width, height: lyricsLabel.frame.origin.y + lyricsLabel.frame.height) + lyricsLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(20*width) + make.right.equalToSuperview().offset(-20*width) + make.top.equalToSuperview().offset(15*width) + make.bottom.equalToSuperview().offset(30*width) + } + return scrollView + }() + ///歌词Label + lazy var lyricsLabel:UILabel = createLabel(font: .systemFont(ofSize: 16*width, weight: .regular), textColor: .init(hex: "#FFFFFF", alpha: 0.85), textAlignment: .left, lines: 0) + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .clear + configure() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + //配置 + private func configure() { + addSubview(titleLabel) + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(33*width) + make.left.equalToSuperview().offset(18*width) + make.right.equalToSuperview().offset(-18*width) + } + addSubview(subtitleLabel) + subtitleLabel.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(10*width) + make.left.right.equalTo(titleLabel) + } + addSubview(scrollView) + scrollView.snp.makeConstraints { make in + make.top.equalTo(subtitleLabel.snp.bottom).offset(10*width) + make.left.right.bottom.equalToSuperview() + } + } +} diff --git a/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift new file mode 100644 index 0000000..ddab745 --- /dev/null +++ b/MusicPlayer/MP/MPPositive/Views/Player/MPPositive_PlayerSilder.swift @@ -0,0 +1,19 @@ +// +// MPPositive_PlayerSilder.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/5/8. +// + +import UIKit +///b面播放器进度条(展示缓存效果,聚焦时进行尺寸变化) +class MPPositive_PlayerSilder: UISlider { + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} diff --git a/MusicPlayer/MP/MPSideA/Models/Load/MPSideA_LoadDataMusic.swift b/MusicPlayer/MP/MPSideA/Models/Load/MPSideA_LoadDataMusic.swift new file mode 100644 index 0000000..f0ae573 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Models/Load/MPSideA_LoadDataMusic.swift @@ -0,0 +1,107 @@ +// +// LoadDataMusic.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/1. +// + +import UIKit +///音乐数据集合控制器 +class MPSideA_LoadDataMusic: NSObject { + static let shared = MPSideA_LoadDataMusic() + ///全部音乐资源 + var alllistMusics:[MPSideA_MusicViewModel] = [] + ///用户上传资源 + var userlistMusics:[MPSideA_MusicViewModel] = [] + ///本地全部资源 + var locallistMusics:[MPSideA_MusicViewModel] = [] + ///首页展示-第0层(本地三条加一条用户最后播放数据) + var homeZeroMusics:[MPSideA_MusicViewModel] = [] + ///首页展示-第1层(本地数据,ablum为1) + var homeFirstMusics:[MPSideA_MusicViewModel] = [] + ///首页展示-第2层(本地数据,ablum为2) + var homeSecondMusics:[MPSideA_MusicViewModel] = [] + ///首页展示-第3层(本地数据,ablum为3) + var homeThirdMusics:[[MPSideA_MusicViewModel]] = [] + private override init() { + super.init() + if (UserDefaults.standard.bool(forKey: "FirstBulid")) == false { + //配置本地数据 + plistDatatoModel() + UserDefaults.standard.set(true, forKey: "FirstBulid") + print("Create data successfully") + } + } + + /// 数据配置 + /// - Parameter complete: 当模型组配置完成后执行该事件 + public func reloadListData() { + //清空各项数组内容 + alllistMusics = [] + userlistMusics = [] + locallistMusics = [] + homeZeroMusics = [] + homeFirstMusics = [] + homeSecondMusics = [] + homeThirdMusics = [] + //重新装填数据 + let all = MPSideA_MusicModel.fetchAll() + all.forEach { item in + //筛选本地与用户上传数据 + if item.isLocal == true { + locallistMusics.append(.init(item)) + + }else { + userlistMusics.append(.init(item)) + } + //全部数据 + alllistMusics.append(.init(item)) + } + //分类展示数据 + homeFirstMusics = locallistMusics.filter{($0.type == .First)} + homeSecondMusics = locallistMusics.filter{($0.type == .Second)} + homeThirdMusics = convertToTwoArray(locallistMusics.filter{($0.type == .Third)}, raw: 3) + //取出固定内容 + homeZeroMusics.append(homeThirdMusics.last!.last!) + homeZeroMusics.append(homeSecondMusics.last!) + homeZeroMusics.append(homeFirstMusics.last!) + if userlistMusics.count != 0 { + homeZeroMusics.append(userlistMusics.last!) + } + } + //获取本地资源Plist,并转化为音乐模型数组 + private func plistDatatoModel() { + let plistPath = Bundle.main.path(forResource: "Resource", ofType: "plist")! + let dictArray = NSArray(contentsOfFile: plistPath) + dictArray?.forEach({ (item) in + let dict = item as! [String : AnyObject] + let music = MPSideA_MusicModel.create() + music.identifier = dict["identifier"] as? String + music.title = dict["title"] as? String + music.duration = dict["duration"] as! Double + music.cover = UIImage(named: dict["cover"] as! String)!.pngData()! + music.author = dict["author"] as? String + music.album = dict["album"] as! Int16 + music.isLocal = dict["isLocal"] as! Bool + music.path = dict["path"] as! String + music.creationTime = Date().timeZone() + }) + MPSideA_MusicModel.save() + } + + /// 将一维音乐数组转为二维音乐数组 + /// - Parameters: + /// - array: 原音乐数组 + /// - raw: 分割个数 + /// - Returns: 返回的二维数组 + private func convertToTwoArray(_ array:[MPSideA_MusicViewModel], raw:Int) -> [[MPSideA_MusicViewModel]] { + let twoDArray = stride(from: 0, to: array.count, by: raw).map { (index) -> [MPSideA_MusicViewModel] in + if (index + raw) > array.count { + return Array(array[index...]) + } else { + return Array(array[index.. (TimeInterval,UIImage,String){ + //长度 + var duration:TimeInterval = 0 + let time = asset.duration +// if #available(iOS 16, *) { +// do { +// time = try await asset.load(.duration) +// } catch { +// print("Conversion to time failed") +// } +// }else { +// time = asset.duration +// } + duration = CMTimeGetSeconds(time) + //获取第一帧 + let gen = AVAssetImageGenerator(asset: asset) + gen.appliesPreferredTrackTransform = true + //获取时间点 + let firstTime = CMTimeMakeWithSeconds(0.0, preferredTimescale: 1) + var actualTime:CMTime = CMTimeMakeWithSeconds(0, preferredTimescale: 0) + var firstImage:UIImage! + do { + //获取第一帧作为封面 + let image = try gen.copyCGImage(at: firstTime, actualTime: &actualTime) + firstImage = UIImage(cgImage: image) + } catch { + //获取失败 + print("Failed to get file the first image") + //给予初始值 + firstImage = .init(named: "End Of Days") + } + //获取地址最后一组内容作为标题 + let title:String = url.lastPathComponent + return (duration,firstImage,title) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Add(新增资源)/MPSideA_AddViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Add(新增资源)/MPSideA_AddViewController.xib new file mode 100644 index 0000000..c385636 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Add(新增资源)/MPSideA_AddViewController.xib @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_BaseViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_BaseViewController.swift new file mode 100644 index 0000000..850b2c8 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_BaseViewController.swift @@ -0,0 +1,39 @@ +// +// BaseViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///A面基类页面 +class MPSideA_BaseViewController: MP_BaseViewController { + ///音乐文件缺失 + var nullMusicAction:ActionBlock? + override func viewDidLoad() { + super.viewDidLoad() + } + //音乐文件缺失 + @objc func fileMissAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + //弹出删除音乐框 + let alert = UIAlertController(title: "Missing Files", message: "The current music file is missing and will remove remove the music from the catalog. If you want to continue using the music file, please re-import it!", preferredStyle: .alert) + let okAction = UIAlertAction(title: "OK", style: .destructive) { [weak self] (_) in + guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { + return + } + //从表中删除当前音乐实体 + MPSideA_MusicModel.delete(music) + MPSideA_MediaCenterManager.shared.setMusic(nil) + //执行删除闭包 + guard self?.nullMusicAction != nil else { + return + } + self?.nullMusicAction!() + } + alert.addAction(okAction) + self?.present(alert, animated: true) + } + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_NavigationController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_NavigationController.swift new file mode 100644 index 0000000..b2c79de --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_NavigationController.swift @@ -0,0 +1,44 @@ +// +// MPNavigationController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///A面通用导航栏 +class MPSideA_NavigationController: MP_NavigationController { + + //重写pushViewController + //每一次push都会执行这个方法,push之前设置viewController的hidesBottomBarWhenPushed + override func pushViewController(_ viewController: UIViewController, animated: Bool) { + viewController.hidesBottomBarWhenPushed = true + NotificationCenter.notificationKey.post(notificationName: .sideA_hidden_show) + super.pushViewController(viewController, animated: true) + viewController.hidesBottomBarWhenPushed = false + } + //重写popViewController + //每一次对viewController进行push的时候,会把viewController放入一个栈中 + //每一次对viewController进行pop的时候,会把viewController从栈中移除 + override func popViewController(animated: Bool) -> UIViewController? { + guard self.children.count != 1 else { + //特殊情况,当用户连续触发pop事件时进行容错处理 + return super.popViewController(animated: true) + } + guard self.children.count == 2 else { + //如果viewController栈中存在的ViewController的个数超过两个,对要返回到的上一级的界面设置hidesBottomBarWhenPushed = true + //把tabbar进行隐藏 + let count = self.children.count-2 + let controller = self.children[count] + controller.hidesBottomBarWhenPushed = true + NotificationCenter.notificationKey.post(notificationName: .sideA_hidden_show) + return super.popViewController(animated: true) + } + //如果viewController栈中存在的ViewController的个数为两个,再返回上一级界面就是根界面了 + //那么要对tabbar进行显示 + let controller:UIViewController = self.children[0] + controller.hidesBottomBarWhenPushed = false + NotificationCenter.notificationKey.post(notificationName: .sideA_display_show) + return super.popViewController(animated: true) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_PresentationController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_PresentationController.swift new file mode 100644 index 0000000..2d3ee0e --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_PresentationController.swift @@ -0,0 +1,73 @@ +// +// MPPresentationController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///自定义模态弹出类型 +enum MPSideA_PresentModal{ + ///倒计时选择框 + case Timer + ///新增选项框 + case Choice + ///重命名 + case Rename + ///删除 + case Delete +} + +///自定义模态弹出控制器 +class MPSideA_PresentationController: UIPresentationController { + //蒙板 + fileprivate lazy var maskView: UIView = { + let corverView = UIView() + return corverView + }() + // MARK: - 系统回调(重载) + override func containerViewWillLayoutSubviews() { + super.containerViewWillLayoutSubviews() + //根据模态状态确定弹出控制器的布局 + switch MPSideA_ModalType { + case .Timer: + presentedView?.snp.makeConstraints({ (make) in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(180*width) + }) + case .Choice: + presentedView?.snp.makeConstraints({ (make) in + make.bottom.left.right.equalToSuperview() + make.height.equalTo(165*width) + }) + case .Rename: + presentedView?.snp.makeConstraints({ (make) in + make.center.equalToSuperview() + make.width.equalTo(270*width) + make.height.equalTo(178*width) + }) + case .Delete: + presentedView?.snp.makeConstraints({ (make) in + make.center.equalToSuperview() + make.width.equalTo(270*width) + make.height.equalTo(122*width) + }) + } + //添加蒙版 + setMask() + } + // 添加蒙版 + fileprivate func setMask() -> Void { + // 添加蒙版 + containerView?.insertSubview(maskView, at: 0) + //设置蒙版的属性 + maskView.backgroundColor = UIColor(white: 0.0, alpha: 0.8) + maskView.frame = containerView!.bounds + let tap = UITapGestureRecognizer(target: self, action: #selector(maskClick(_:))) + maskView.addGestureRecognizer(tap) + } + //蒙板点击事件 + @objc fileprivate func maskClick(_ sender:UITapGestureRecognizer){ + presentedViewController.dismiss(animated: true, completion: nil) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift new file mode 100644 index 0000000..4ef6f50 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Base(基类-导航栏-标签栏-计时器-播放器)/MPSideA_TabBarController.swift @@ -0,0 +1,246 @@ +// +// MPTabBarController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///A面通用标签栏 +class MPSideA_TabBarController: UITabBarController { + //自定义tabBar + private lazy var customTabBar:MPSideA_CustomTabBar = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 72*width)) + //底部音乐展示View(默认隐藏) + private lazy var bottomView:MPSideA_BottomShowView = .instanceFromNib() + //底部bottomShowView的展示状态 + private var isbottomShow:Bool = false{ + willSet{ + if isbottomShow != newValue { + switch_bottomShow(newValue) + } + //填充音乐数据 + if newValue == true { + guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { + print("No Data Music") + return + } + bottomView.coverImageView.image = UIImage(data: music.cover) + bottomView.titleLabel.text = music.title + bottomView.subtitleLabel.text = setTimesToMinSeconds(music.duration) + } + } + } + override func viewDidLoad() { + super.viewDidLoad() + tabBar.isHidden = true + self.setValue(customTabBar, forKey: "tabBar") + //创建标签子控制器 + let homeVC = MPSideA_NavigationController(rootViewController: MPSideA_HomeViewController()) + let centerVC = MPSideA_NavigationController(rootViewController: MPSideA_CenterViewController()) + //添加子控制器 + viewControllers = [homeVC,centerVC] + //禁止系统tabBaritem触发 + tabBar.items?.forEach({ item in + item.isEnabled = false + }) + tabBar.barTintColor = .clear + UITabBar.appearance().backgroundColor = .clear + tabBar.shadowImage = UIImage() + // tabBar.shadowImage = image(UIColor.red) // 修改线条颜色 + tabBar.backgroundImage = UIImage() + + view.addSubview(bottomView) + //将展示View设置在主窗口下方之外,避免用户察觉 + bottomView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(82*width) + make.width.equalTo(351*width) + make.height.equalTo(82*width) + } + //实现展示View的事件闭包 + //倒计时 + bottomView.modalTimerBlock = { + [weak self] in + self?.modalTimer() + } + //切换播放器状态 + bottomView.switchPlayerBlock = { + [weak self] in + self?.switchState() + } + //前往播放器 + bottomView.pushPlayerBlock = { + [weak self] in + self?.pushPlayer() + } + //在页面展示前,获取播放器是否存在历史播放(最后一次播放),并视情况展示View + isbottomShow = MPSideA_MediaCenterManager.shared.getMusic() != nil + //监听通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchAction(_:)), notificationName: .switch_tabBarItem) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(timesAction(_ :)), notificationName: .sideA_time_times) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(playMusicAction(_ :)), notificationName: .sideA_play_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(pauseMusicAction(_ :)), notificationName: .sideA_pause_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(resumeMusicAction(_ :)), notificationName: .sideA_resume_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMusicAction(_ :)), notificationName: .sideA_stop_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(closeBottonViewAction(_ :)), notificationName: .sideA_close_show) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(displayBottomViewAction(_ :)), notificationName: .sideA_display_show) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(hiddenBottomViewAction(_ :)), notificationName: .sideA_hidden_show) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(renameMusicAction(_ :)), notificationName: .sideA_rename_music) + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + } + deinit { + //移除所有监听 + NotificationCenter.default.removeObserver(self) + } + override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + //将展示View设置到最上层 + view.bringSubviewToFront(bottomView) + } + //底部BottomView的切换动画 + private func switch_bottomShow(_ state:Bool) { + UIView.animate(withDuration: 0.3) { + [weak self] in + guard let self = self else { return } + if state { + //向上展示 + bottomView.transform = .init(translationX: 0, y: -139*width) + }else { + //向下隐藏 + bottomView.transform = .identity + } + } + } +} +//MARK: - 事件处理 +extension MPSideA_TabBarController: UIViewControllerTransitioningDelegate { + //切换事件 + @objc private func switchAction(_ sender:Notification) { + let tag = sender.object as! Int + selectedIndex = tag + } + //弹出计时器 + private func modalTimer() { + MPSideA_ModalType = .Timer + let timerVC = MPSideA_CountTimerViewController() + timerVC.transitioningDelegate = self + timerVC.modalPresentationStyle = .custom + present(timerVC, animated: true) + } + //切换播放器状态 + private func switchState() { + guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { + //播放器未能持有音乐实体 + print("No Data Music") + return + } + switch MPSideA_MediaCenterManager.shared.getPlayerState() { + case .Null://启动播放 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + case .Playing://暂停播放 + MPSideA_MediaCenterManager.shared.playerPause() + case .Pause://继续播放 + MPSideA_MediaCenterManager.shared.playerResume() + } + } + //前往播放器 + private func pushPlayer() { + print("Go to player") + //模态弹出 + let playerVC = MPSideA_PlayerViewController() + present(playerVC, animated: true) + } + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return MPSideA_PresentationController(presentedViewController: presented, presenting: presenting) + } +} +//MARK: - 监听触发 +extension MPSideA_TabBarController { + //计时值变化事件 + @objc private func timesAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + //隐藏按钮,展示View + bottomView.timerBtn.isHidden = true + bottomView.timerView.isHidden = false + let time = sender.object as! TimeInterval + bottomView.timerLabel.text = setTimesToMinSeconds(time) + } + } + + //启动音乐播放器 + @objc private func playMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + isbottomShow = true + bottomView.stateBtn.isSelected = true + } + } + //暂停音乐播放器 + @objc private func pauseMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + bottomView.stateBtn.isSelected = false + } + } + //继续音乐播放器 + @objc private func resumeMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + bottomView.stateBtn.isSelected = true + } + } + //终止音乐播放器 + @objc private func stopMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + bottomView.stateBtn.isSelected = false + bottomView.timerLabel.text = "Time" + //展示按钮,隐藏View + bottomView.timerBtn.isHidden = false + bottomView.timerView.isHidden = true + } + } + //播放音乐被删除 + @objc private func closeBottonViewAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + isbottomShow = false + } + } + //展示音乐播放框(ishidden调整) + @objc private func displayBottomViewAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + bottomView.isHidden = false + } + } + //隐藏音乐播放框(ishidden调整) + @objc private func hiddenBottomViewAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + bottomView.isHidden = true + } + } + @objc private func renameMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + isbottomShow = isbottomShow + } + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.swift new file mode 100644 index 0000000..7b93cdf --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.swift @@ -0,0 +1,32 @@ +// +// AboutViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit + +class MPSideA_AboutViewController: MPSideA_BaseViewController { + @IBOutlet weak var versionView: UIView!{ + didSet{ + let tap = UITapGestureRecognizer(target: self, action: #selector(versionClick)) + versionView.addGestureRecognizer(tap) + versionView.isUserInteractionEnabled = true + } + } + override func viewDidLoad() { + super.viewDidLoad() + + } + @objc private func versionClick(){ + let eventAlert = UIAlertController(title: "Version Update", message: "is the latest Version", preferredStyle: .alert) + let canelAction = UIAlertAction(title: "Cancel", style: .cancel,handler: nil) + eventAlert.addAction(canelAction) + self.present(eventAlert, animated: true, completion: nil) + } + @IBAction func popClick(_ sender: UIButton) { + navigationController?.popViewController(animated: true) + } + +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.xib new file mode 100644 index 0000000..efe219d --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_AboutViewController.xib @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.swift new file mode 100644 index 0000000..984afae --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.swift @@ -0,0 +1,194 @@ +// +// CenterViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///个人中心 +class MPSideA_CenterViewController: MPSideA_BaseViewController { + @IBOutlet weak var tableView: UITableView!{ + didSet{ + if #available(iOS 15.0, *) { + tableView.sectionHeaderTopPadding = 0 + } + tableView.estimatedRowHeight = 200 + tableView.rowHeight = UITableView.automaticDimension + //扩充tableView滚动范围 + tableView.contentInset = .init(top: 27*width, left: 0, bottom: 100*width, right: 0) + tableView.dataSource = self + tableView.delegate = self + tableView.register(UINib(nibName: CenterTableViewCellID, bundle: nil), forCellReuseIdentifier: CenterTableViewCellID) + } + } + @IBOutlet weak var noticeView: UIView! + private let CenterTableViewCellID = "MPSideA_CenterTableViewCell" + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .init(hex: "#000000") + //触发音乐缺失闭包 + nullMusicAction = { + [weak self] in + //刷新页面 + self?.reload() + } + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + NotificationCenter.notificationKey.add(observer: self, selector: #selector(successfullCreateAction), notificationName: .sideA_creat_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(fileMissAction(_ :)), notificationName: .sideA_null_music) + reload() + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + NotificationCenter.default.removeObserver(self) + } + //刷新数据源 + private func reload() { + MPSideA_LoadDataMusic.shared.reloadListData() + //检索用户上传音乐是否为空 + if MPSideA_LoadDataMusic.shared.userlistMusics.count == 0 { + //展示提醒框 + noticeView.isHidden = false + }else { + noticeView.isHidden = true + } + tableView.showMessage(MPSideA_LoadDataMusic.shared.userlistMusics.count) + tableView.reloadData() + } + //收到音乐库更新通知 + @objc private func successfullCreateAction() { + DispatchQueue.main.async { + [weak self] in + self?.reload() + } + } + //前往设置页 + @IBAction func setActionClick(_ sender: UIButton) { + let setVC = MPSideA_SettingViewController() + navigationController?.pushViewController(setVC, animated: true) + } + //上传新视频/音频 + @IBAction func addClick(_ sender: UIButton) { + MPSideA_ModalType = .Choice + let addVC = MPSideA_AddViewController() + addVC.modalPresentationStyle = .custom + addVC.transitioningDelegate = self + present(addVC, animated: true) + } +} +//MARK: - tableView +extension MPSideA_CenterViewController: UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return MPSideA_LoadDataMusic.shared.userlistMusics.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: CenterTableViewCellID, for: indexPath) as! MPSideA_CenterTableViewCell + cell.musicView = MPSideA_LoadDataMusic.shared.userlistMusics[indexPath.row] + cell.moreBlock = { + [weak self] (sender) in + self?.moreAction(sender, music: MPSideA_LoadDataMusic.shared.userlistMusics[indexPath.row]) + } + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let music = MPSideA_LoadDataMusic.shared.userlistMusics[indexPath.row].music + //检索当前音乐状态 + guard MPSideA_MediaCenterManager.shared.getMusic()?.identifier != music.identifier else { + //同一首,检索是否播放中 + switch MPSideA_MediaCenterManager.shared.getPlayerState() { + case .Null://没有播放 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + case .Playing://播放中 + break + case .Pause://继续播放 + MPSideA_MediaCenterManager.shared.playerResume() + } + reload() + return + } + //新的一首 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + reload() + } +} +//MARK: - Popover +extension MPSideA_CenterViewController: UIPopoverPresentationControllerDelegate, UIViewControllerTransitioningDelegate { + //不指定返回样式 + func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { + return .none + } + //更多操作 + private func moreAction(_ sender:UIButton, music:MPSideA_MusicViewModel) { + //展示对应位置的popover弹窗 + let moreVC = MPSideA_MoreViewController() + //设置moreVC的真实大小 + moreVC.preferredContentSize = .init(width: 130*width, height: 65*width) + moreVC.modalPresentationStyle = .popover + moreVC.renameBlock = { + [weak self] in + self?.renameAction(music) + } + moreVC.deleteBlock = { + [weak self] in + self?.deleteAction(music) + } + let popoverVC = moreVC.popoverPresentationController + popoverVC?.delegate = self + //设置锚点视图 + popoverVC?.sourceView = sender + popoverVC?.backgroundColor = .init(hex: "#434343") + //设置箭头指示方向 + popoverVC?.permittedArrowDirections = .right + present(moreVC, animated: true) + } + //弹出重命名框 + private func renameAction(_ music:MPSideA_MusicViewModel) { + MPSideA_ModalType = .Rename + let renameVC = MPSideA_RenameViewController() + renameVC.renameBlock = { + [weak self] (name) in + music.music.title = name + MPSideA_MusicModel.save() + //判断是否是当前播放音乐 + if music.music.identifier == MPSideA_MediaCenterManager.shared.getMusic()?.identifier { + //同步调整 + MPSideA_MediaCenterManager.shared.setMusic(music.music) + NotificationCenter.notificationKey.post(notificationName: .sideA_rename_music) + } + //更新 + self?.reload() + } + renameVC.transitioningDelegate = self + renameVC.modalPresentationStyle = .custom + present(renameVC, animated: true) + } + //弹出删除框 + private func deleteAction(_ music:MPSideA_MusicViewModel) { + MPSideA_ModalType = .Delete + let deleteVC = MPSideA_DeleteViewController() + deleteVC.deleteBlock = { + [weak self] in + //判断是否是当前播放音乐 + if music.music.identifier == MPSideA_MediaCenterManager.shared.getMusic()?.identifier { + MPSideA_MediaCenterManager.shared.setMusic(nil) + //暂停播放 + MPSideA_MediaCenterManager.shared.playerStop() + //发布通知让音乐展示框消失 + NotificationCenter.notificationKey.post(notificationName: .sideA_close_show) + } + MPSideA_MusicModel.delete(music.music) + //更新 + self?.reload() + } + deleteVC.transitioningDelegate = self + deleteVC.modalPresentationStyle = .custom + present(deleteVC, animated: true) + } + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return MPSideA_PresentationController(presentedViewController: presented, presenting: presenting) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.xib new file mode 100644 index 0000000..a4e4dc0 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_CenterViewController.xib @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.swift new file mode 100644 index 0000000..c42e396 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.swift @@ -0,0 +1,29 @@ +// +// DeleteViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/7. +// + +import UIKit + +class MPSideA_DeleteViewController: UIViewController { + var deleteBlock:ActionBlock? + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + @IBAction func deleteClick(_ sender: UIButton) { + dismiss(animated: true) { + [weak self] in + if self?.deleteBlock != nil { + self?.deleteBlock!() + } + } + } + @IBAction func cancelClick(_ sender: UIButton) { + dismiss(animated: true) + } + +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.xib new file mode 100644 index 0000000..b356013 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_DeleteViewController.xib @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.swift new file mode 100644 index 0000000..5eb3deb --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.swift @@ -0,0 +1,41 @@ +// +// MoreViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/7. +// + +import UIKit +///更多操作 +class MPSideA_MoreViewController: UIViewController { + var renameBlock:ActionBlock? + var deleteBlock:ActionBlock? + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + //对音乐重命名 + @IBAction func renameClick(_ sender: UIButton) { + dismiss(animated: true) { + [weak self] in + guard let self = self else { return } + guard renameBlock != nil else { + return + } + renameBlock!() + } + } + //删除音乐 + @IBAction func deleteClick(_ sender: UIButton) { + dismiss(animated: true) { + [weak self] in + guard let self = self else { return } + guard deleteBlock != nil else { + return + } + deleteBlock!() + } + } + +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.xib new file mode 100644 index 0000000..d9566dc --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_MoreViewController.xib @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.swift new file mode 100644 index 0000000..c4923ae --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.swift @@ -0,0 +1,24 @@ +// +// PrivacyViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit +import WebKit +///隐私政策 +class MPSideA_PrivacyViewController: MPSideA_BaseViewController { + @IBOutlet weak var webView: WKWebView! + + override func viewDidLoad() { + super.viewDidLoad() + //创建一个请求 + let request = URLRequest(url: privacyUrl) + webView.load(request) + } + @IBAction func popClick(_ sender: UIButton) { + navigationController?.popViewController(animated: true) + } + +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.xib new file mode 100644 index 0000000..9ca8378 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_PrivacyViewController.xib @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.swift new file mode 100644 index 0000000..1267938 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.swift @@ -0,0 +1,45 @@ +// +// RenameViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/7. +// + +import UIKit + +class MPSideA_RenameViewController: UIViewController, UITextFieldDelegate { + @IBOutlet weak var textField: UITextField!{ + didSet{ + textField.attributedPlaceholder = NSAttributedString(string: "Placeholder", attributes: [NSAttributedString.Key.foregroundColor:UIColor.init(hex: "#EBEBF5"), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13, weight: .regular)]) + textField.delegate = self + } + } + var renameBlock:((String) -> Void)? + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + let text = (textField.text! as NSString).replacingCharacters(in: range, with: string) + guard text.count <= 60 else { + return false + } + return true + } + @IBAction func confirmClick(_ sender: UIButton) { + guard let text = textField.text, text != "" else { + return + } + dismiss(animated: true) { + [weak self] in + if self?.renameBlock != nil { + self?.renameBlock!(text) + } + } + } + @IBAction func cancelClick(_ sender: UIButton) { + dismiss(animated: true) + } + +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.xib new file mode 100644 index 0000000..ea5d1b9 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_RenameViewController.xib @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.swift new file mode 100644 index 0000000..cea08a5 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.swift @@ -0,0 +1,23 @@ +// +// ServiceViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit +import WebKit +///用户服务协议 +class MPSideA_ServiceViewController: MPSideA_BaseViewController { + @IBOutlet weak var webView: WKWebView! + + override func viewDidLoad() { + super.viewDidLoad() + //创建一个请求 + let request = URLRequest(url: serviceUrl) + webView.load(request) + } + @IBAction func popClick(_ sender: UIButton) { + navigationController?.popViewController(animated: true) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.xib new file mode 100644 index 0000000..6964e68 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_ServiceViewController.xib @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.swift new file mode 100644 index 0000000..822178e --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.swift @@ -0,0 +1,88 @@ +// +// SettingViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit + +class MPSideA_SettingViewController: MPSideA_BaseViewController { + @IBOutlet weak var tableView: UITableView!{ + didSet{ + if #available(iOS 15.0, *) { + tableView.sectionHeaderTopPadding = 0 + } + tableView.rowHeight = 70*width + tableView.dataSource = self + tableView.delegate = self + tableView.register(UINib(nibName: SettingTableViewCellID, bundle: nil), forCellReuseIdentifier: SettingTableViewCellID) + } + } + private let SettingTableViewCellID = "MPSideA_SettingTableViewCell" + private lazy var titles:[String] = ["About","Feedback","Share","Privacy Policy","Terms of Use"] + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + @IBAction func popClick(_ sender: UIButton) { + navigationController?.popViewController(animated: true) + } +} +//MARK: - tableView +extension MPSideA_SettingViewController: UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return titles.count + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: SettingTableViewCellID, for: indexPath) as! MPSideA_SettingTableViewCell + cell.title = titles[indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch indexPath.row { + case 0://About + let aboutVC = MPSideA_AboutViewController() + navigationController?.pushViewController(aboutVC, animated: true) + case 1://Feedback + let alert = UIAlertController(title: "Feedback", message: "If you have any comments or suggestions, please contact us at the following e-mail address", preferredStyle: .actionSheet) + let email = UIAlertAction(title: "support@musicoo.app", style: .default) { (_) in + //将邮箱复制到剪切板中 + UIPasteboard.general.string = "support@musicoo.app" + MP_HUD.text("Successfully copied the e-mail address to the clipboard", delay: 1.0, completion: nil) + } + alert.addAction(email) + let cancel = UIAlertAction(title: "Cancel", style: .cancel) + alert.addAction(cancel) + present(alert, animated: true) + case 2://Share + //设置分享文本 + let text = App_Name + //分享图片icon + let image = UIImage(named: "ICON") + //设置分享路径 + let url = URL(string: "https://musicoo.app/") + let activityItems = [text,image as Any,url as Any] + //弹出分享框 + let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities:nil) + present(activityViewController, animated: true, completion: nil) + //分享结束后的回调 + activityViewController.completionWithItemsHandler = { [weak self] ( activityType, isCompleted, returnedItems, error) -> Void in + print(isCompleted ? "Share Success":"Share Failure") + } + case 3: + MP_NetWorkManager.shared.requestNetworkPermission(oberve: self) { + [weak self] in + let privacyVC = MPSideA_PrivacyViewController() + self?.navigationController?.pushViewController(privacyVC, animated: true) + } + default: + MP_NetWorkManager.shared.requestNetworkPermission(oberve: self) { + [weak self] in + let serviceVC = MPSideA_ServiceViewController() + self?.navigationController?.pushViewController(serviceVC, animated: true) + } + } + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.xib new file mode 100644 index 0000000..451908a --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Center(个人资源)/MPSideA_SettingViewController.xib @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.swift new file mode 100644 index 0000000..b62d47d --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.swift @@ -0,0 +1,106 @@ +// +// CountTimerViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/28. +// + +import UIKit + +class MPSideA_CountTimerViewController: UIViewController { + @IBOutlet weak var timesLabel: UILabel! + @IBOutlet weak var contentView: UIView! + //多项选择器 + private lazy var segmentedView:UISegmentedControl = { + //获取需要展示的内容 + let titles:[String] = timeLevels.map{($0.title)} + //创建一个SegmentedControl + let segmentedView:UISegmentedControl = .init(items: titles) + //设置选中Item颜色块 + if #available(iOS 13.0, *) { + segmentedView.selectedSegmentTintColor = .init(hex: "#80F988") + } else { + segmentedView.tintColor = .init(hex: "#80F988") + } + //设置分割线颜色 + segmentedView.setDividerImage(UIImage(), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) + //设置文字颜色 + segmentedView.setTitleTextAttributes([.foregroundColor:UIColor(hex: "#FFFFFF", alpha: 0.8), .font:UIFont.systemFont(ofSize: 14, weight: .medium)], for: .normal) + segmentedView.setTitleTextAttributes([.foregroundColor:UIColor(hex: "#000000"), .font:UIFont.systemFont(ofSize: 14, weight: .heavy)], for: .selected) + //添加点击事件 + segmentedView.addTarget(self, action: #selector(switchTimesAction(_ :)), for: .valueChanged) + return segmentedView + }() + //倒计时规模组 + private lazy var timeLevels:[MPSideA_CountTimerLevel] = { + var array:[MPSideA_CountTimerLevel] = [] + for item in MPSideA_CountTimerLevel.allCases { + array.append(item) + } + return array + }() + override func viewDidLoad() { + super.viewDidLoad() + //设置圆角 + view.layer.masksToBounds = true + view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + view.layer.cornerRadius = 18*width + //添加多项选择器 + contentView.addSubview(segmentedView) + segmentedView.snp.makeConstraints { make in + make.width.equalTo(330*width) + make.height.equalTo(38*width) + make.center.equalToSuperview() + } + //根据当前倒计时器设置选中项 + segmentedView.selectedSegmentIndex = MPSideA_MediaCenterManager.shared.getCountTimerLevel().rawValue + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //添加通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(timesAction(_ :)), notificationName: .sideA_time_times) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(completeAction(_ :)), notificationName: .sideA_stop_music) + } + deinit { + //移除所有通知 + NotificationCenter.default.removeObserver(self) + } + //切换计时值 + @objc private func switchTimesAction(_ sender: UISegmentedControl) { + //获取切换后的倒计时规模 + let selectedIndex = sender.selectedSegmentIndex + let value = timeLevels[selectedIndex] + //判断该倒计时规模是否成立 + if value != .OFF { + guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { + //没有音乐实体,取消倒计时 + print("No Data Music") + return + } + //启动倒计时器 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .CountTime, countLevel: value) + }else { + //停止倒计时,数值归0 + MPSideA_MediaCenterManager.shared.playerStop() + } + } + + + //计时值变化事件 + @objc private func timesAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + let time = sender.object as! TimeInterval + timesLabel.text = "Count down "+setTimesToMinSeconds(time) + } + } + //计时结束事件 + @objc private func completeAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + timesLabel.text = "Timing off" + } + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.xib new file mode 100644 index 0000000..c9e2575 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_CountTimerViewController.xib @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.swift new file mode 100644 index 0000000..2ccbc22 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.swift @@ -0,0 +1,106 @@ +// +// HomeViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit + +class MPSideA_HomeViewController: MPSideA_BaseViewController { + @IBOutlet weak var tableView: UITableView!{ + didSet{ + if #available(iOS 15.0, *) { + tableView.sectionHeaderTopPadding = 0 + } + tableView.contentInsetAdjustmentBehavior = .never + tableView.estimatedRowHeight = 200 + tableView.rowHeight = UITableView.automaticDimension + tableView.tableHeaderView = headView + //额外加载一段下边距 + tableView.contentInset = .init(top: 0, left: 0, bottom: 100*width, right: 0) + tableView.dataSource = self + tableView.delegate = self + tableView.register(UINib(nibName: Home_RowListsTableViewCellID, bundle: nil), forCellReuseIdentifier: Home_RowListsTableViewCellID) + } + } + private lazy var headView:MPSideA_Home_HeadBannerView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 135*width)) + private let Home_RowListsTableViewCellID = "MPSideA_Home_RowListsTableViewCell" + //组头标题 + private lazy var sectionTitles:[String] = ["", MPSideA_MusicShowType.First.title, MPSideA_MusicShowType.Second.title, MPSideA_MusicShowType.Third.title] + + override func viewDidLoad() { + super.viewDidLoad() + //触发音乐缺失闭包 + nullMusicAction = { + [weak self] in + //刷新页面 + self?.reload() + } + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + //添加通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(fileMissAction(_ :)), notificationName: .sideA_null_music) +// NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .play_music) +// NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .stop_music) +// NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .resume_music) +// NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .pause_music) + reload() + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + //移除所有通知 + NotificationCenter.default.removeObserver(self) + + } + deinit { + + } + //刷新渲染页面 + private func reload() { + MPSideA_LoadDataMusic.shared.reloadListData() + tableView.reloadData() + } +// //当音乐播放器状态改变时 +// @objc private func switchPlayerStateAction(_ sender:Notification) { +// //刷新页面内容 +// tableView.reloadData() +// } +} +//MARK: - tableView +extension MPSideA_HomeViewController:UITableViewDataSource, UITableViewDelegate { + func numberOfSections(in tableView: UITableView) -> Int { + return sectionTitles.count + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: Home_RowListsTableViewCellID, for: indexPath) as! MPSideA_Home_RowListsTableViewCell + cell.layout = .init(rawValue: indexPath.section) ?? .Zero + return cell + } + //设置组头View + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let sectionView:UIView = .init(frame: .init(x: 0, y: 0, width: screen_Width, height: 40*width)) + sectionView.backgroundColor = .clear + //添加一个Label + let label = UILabel() + label.textColor = .white + label.font = .systemFont(ofSize: 20, weight: .regular) + label.text = sectionTitles[section] + sectionView.addSubview(label) + label.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16*width) + make.top.equalToSuperview() + } + return sectionView + } + //设置组头View高度 + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return section != 0 ? 40*width:0 + } +} + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.xib new file mode 100644 index 0000000..8cfbbae --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_HomeViewController.xib @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.swift b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.swift new file mode 100644 index 0000000..c6d3a42 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.swift @@ -0,0 +1,403 @@ +// +// PlayerViewController.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/28. +// + +import UIKit +///播放器显示状态 +enum MPSideA_PlayerState { + case Dark + case Light + ///对应的按钮背景色 + var buttonBGColor:UIColor{ + switch self { + case .Dark: + return .init(hex: "#FFFFFF", alpha: 0.15) + case .Light: + return .init(hex: "#F2F2F2") + } + } + ///页面背景色 + var viewBGColor:UIColor{ + switch self { + case .Dark: + return .init(hex: "#000000") + case .Light: + return .init(hex: "#FFFFFF") + } + } + ///文本字体颜色 + var textColor:UIColor{ + switch self { + case .Dark: + return .init(hex: "#FFFFFF") + case .Light: + return .init(hex: "#000000") + } + } + ///滑块图片 + var thumbImage:UIImage{ + switch self { + case .Dark: + return UIImage(named: "Thumb dark'logo")! + case .Light: + return UIImage(named: "Thumb light'logo")! + } + } + ///滑轨颜色集合 + var minTrackColors:[UIColor]{ + switch self { + case .Dark: + return [UIColor(hex: "#FFFFFF", alpha: 0.3), UIColor(hex: "#FFFFFF", alpha: 0.3)] + case .Light: + return [UIColor(hex: "#80F988", alpha: 0.2), UIColor(hex: "#80F988", alpha: 0.2)] + } + } + ///毛玻璃效果 + var effctView:UIBlurEffect{ + switch self { + case .Dark: + if #available(iOS 13.0, *) { + return UIBlurEffect(style: .systemThickMaterialDark) + } else { + return UIBlurEffect(style: .dark) + } + case .Light: + return UIBlurEffect(style: .light) + } + } +} +///播放器页面 +@objcMembers class MPSideA_PlayerViewController: MPSideA_BaseViewController { + @IBOutlet weak var disMissBtn: UIButton! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var effectView: UIVisualEffectView! + @IBOutlet weak var backImageView: UIImageView! + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var nameLabel: UILabel! + @IBOutlet weak var slider: MP_PlayerSlider!{ + didSet{ + slider.thumbImage = state.thumbImage + slider.trackHeight = 10*width + slider.minTrackColors = state.minTrackColors + slider.minTrackLocations = [0.0,1.0] + slider.maxTrackColors = state.minTrackColors + slider.maxTrackLocations = [0.0,1.0] + slider.setNeedsDisplay() + } + } + @IBOutlet weak var volumeLabel: UILabel! + @IBOutlet weak var lampView: MPSideA_PlayerActionView!{ + didSet{ + lampView.darkImage = UIImage(named: "Lamp dark'logo") + lampView.lightImage = UIImage(named: "Lamp light'logo") + lampView.isDark = true + lampView.isPlaying = false + lampView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lampActionClick(_ :)))) + } + } + @IBOutlet weak var timerView: MPSideA_PlayerActionView!{ + didSet{ + timerView.darkImage = UIImage(named: "Timer dark'logo") + timerView.lightImage = UIImage(named: "Timer light'logo") + timerView.playingImage = UIImage(named: "Timer playing'logo") + timerView.isDark = true + timerView.isPlaying = false + timerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(timerActionClick(_ :)))) + } + } + @IBOutlet weak var timerLabel: UILabel! + @IBOutlet weak var autoView: MPSideA_PlayerActionView!{ + didSet{ + autoView.darkImage = UIImage(named: "Auto dark'logo") + autoView.lightImage = UIImage(named: "Auto light'logo") + autoView.playingImage = UIImage(named: "Auto playing'logo") + autoView.isDark = true + autoView.isPlaying = false + autoView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(autoActionClick(_ :)))) + } + } + @IBOutlet weak var playBtn: UIButton! + @IBOutlet weak var maskView: UIImageView! + //图片旋转计时器 + private var timer:CADisplayLink! + //播放器页面显示状态,默认为黑夜(切换后对于页面内容作出改变) + private lazy var state:MPSideA_PlayerState = .Dark{ + didSet{ + setUpState(state) + } + } + //当前系统音量 + private lazy var volume:Float = 0{ + didSet{ + //更新label值 + volumeLabel.text = String(format: "Volume:%.2f", volume*100) + //调整slider + let value = volume + slider.value = value + } + } + //指定自动播放需要的分贝值 + private lazy var decibels:Float = 0.5 + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = state.viewBGColor + playBtn.isSelected = MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing + //启动音量绑定 + MPSideA_VolumeManager.shared.createVolume() + //设置音量 + volume = MPSideA_VolumeManager.shared.getVolume() + if let music = MPSideA_MediaCenterManager.shared.getMusic() { + //设置音乐展示 + nameLabel.text = music.title + coverImageView.image = UIImage(data: music.cover) + backImageView.image = UIImage(data: music.cover) + } + lampView.backgroundColor = state.buttonBGColor + timerView.backgroundColor = state.buttonBGColor + autoView.backgroundColor = state.buttonBGColor + + //触发音乐缺失闭包 + nullMusicAction = { + [weak self] in + //退出该页面 + self?.navigationController?.popViewController(animated: true) + } + //初始化计时器 + timer = CADisplayLink(target: self, selector: #selector(coverRotationalAction(_ :))) + //一秒执行多少次 + timer.preferredFramesPerSecond = 20 + //开辟线程 + timer.add(to: RunLoop.current, forMode: .common) + timer.isPaused = true + addNotification() + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //根据播放器状态设置计时器状态 + timer.isPaused = !(MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing) + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + //停止监听器 + MPSideA_MediaCenterManager.shared.stopMonitor() + } + deinit { + //移除所有通知 + NotificationCenter.default.removeObserver(self) + //销毁音量绑定 + MPSideA_VolumeManager.shared.destroyVolume() + //销毁帧计时器 + timer = nil + } + //添加通知与监听 + private func addNotification() { + //添加通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(timesAction(_ :)), notificationName: .sideA_time_times) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(volumeChangeAction(_ :)), notificationName: .sideA_volume_change) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(playMusicAction(_ :)), notificationName: .sideA_play_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(pauseMusicAction(_ :)), notificationName: .sideA_pause_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(resumeMusicAction(_ :)), notificationName: .sideA_resume_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMusicAction(_ :)), notificationName: .sideA_stop_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(fileMissAction(_ :)), notificationName: .sideA_null_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(openMonitorAction(_ :)), notificationName: .sideA_open_monitor) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(stopMonitorAction(_ :)), notificationName: .sideA_stop_monitor) + } +} +//MARK: - 交互事件 +extension MPSideA_PlayerViewController { + //退出事件 + @IBAction func disMissAction(_ sender: UIButton) { + dismiss(animated: true) + } + //手动调整音量 + @IBAction func sliderVolumeAction(_ sender: MP_PlayerSlider) { + let value = sender.value + MPSideA_VolumeManager.shared.setVolume(value) + } + //切换页面显示状态 + @objc private func lampActionClick(_ sender: MPSideA_PlayerActionView) { + if state == .Dark { + state = .Light + }else { + state = .Dark + } + } + //设置倒计时 + @objc private func timerActionClick(_ sender: MPSideA_PlayerActionView) { + //关闭麦克风监听器 + MPSideA_MediaCenterManager.shared.stopMonitor() + MPSideA_ModalType = .Timer + let timerVC = MPSideA_CountTimerViewController() + timerVC.transitioningDelegate = self + timerVC.modalPresentationStyle = .custom + present(timerVC, animated: true) + } + //自动播放(当环境分贝超过指定值时播放) + @objc private func autoActionClick(_ sender: MPSideA_PlayerActionView) { + guard authorize(observe: self) == true else { + print("No Microphone Access") + return + } + if autoView.isPlaying { + //关闭麦克风监听器 + MPSideA_MediaCenterManager.shared.stopMonitor() + }else { + //启动监听器 + MPSideA_MediaCenterManager.shared.openMonitor(0.5) + } + } + //播放/暂停 + @IBAction func playClick(_ sender: UIButton) { + //关闭麦克风监听器 + MPSideA_MediaCenterManager.shared.stopMonitor() + guard let music = MPSideA_MediaCenterManager.shared.getMusic() else { + //播放器未能持有音乐实体 + print("No Data Music") + return + } + switch MPSideA_MediaCenterManager.shared.getPlayerState() { + case .Null://启动播放 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + case .Playing://暂停播放 + MPSideA_MediaCenterManager.shared.playerPause() + case .Pause://继续播放 + MPSideA_MediaCenterManager.shared.playerResume() + } + } +} +//MARK: - 业务处理 +extension MPSideA_PlayerViewController: UIViewControllerTransitioningDelegate { + //声音值切换 + @objc fileprivate func volumeChangeAction(_ sender:Notification) { + guard let value = sender.object as? Float else { + return + } + volume = value + } + //页面状态切换 + private func setUpState(_ state:MPSideA_PlayerState) { + view.backgroundColor = state.viewBGColor + //黑夜展示背景图,白天隐藏 + backImageView.isHidden = !(state == .Dark) + maskView.isHidden = !(state == .Dark) + titleLabel.textColor = state.textColor + //调整毛玻璃 + effectView.effect = state.effctView + nameLabel.textColor = state.textColor + slider.thumbImage = state.thumbImage + slider.minTrackColors = state.minTrackColors + slider.maxTrackColors = state.minTrackColors + slider.setNeedsDisplay() + volumeLabel.textColor = state.textColor + //更改按钮的背景色 + disMissBtn.backgroundColor = state.buttonBGColor + lampView.backgroundColor = state.buttonBGColor + timerView.backgroundColor = state.buttonBGColor + autoView.backgroundColor = state.buttonBGColor + //更改按钮的高亮 + disMissBtn.isSelected = !(state == .Dark) + lampView.isDark = (state == .Dark) + timerView.isDark = (state == .Dark) + autoView.isDark = (state == .Dark) + } + + //计时值变化事件 + @objc private func timesAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + let time = sender.object as! TimeInterval + timerView.isPlaying = true + timerLabel.isHidden = false + timerLabel.text = setTimesToMins(time) + } + } + //计时结束事件 + @objc private func completeAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + timerView.isPlaying = false + timerLabel.isHidden = true + timerLabel.text = "00" + } + } + //启动音乐播放器 + @objc private func playMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + playBtn.isSelected = true + autoView.isPlaying = false + //旋转图片 + coverImageView.transform = .identity + timer.isPaused = false + } + } + //暂停音乐播放器 + @objc private func pauseMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + playBtn.isSelected = false + timer.isPaused = true + } + } + //继续音乐播放器 + @objc private func resumeMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + playBtn.isSelected = true + timer.isPaused = false + } + } + //终止音乐播放器 + @objc private func stopMusicAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + playBtn.isSelected = false + timerView.isPlaying = false + timerLabel.isHidden = true + timerLabel.text = "00" + timer.isPaused = true + coverImageView.transform = .identity + } + } + //开启麦克风监听器 + @objc private func openMonitorAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + autoView.isPlaying = true + } + } + //关闭麦克风监听器 + @objc private func stopMonitorAction(_ sender:Notification) { + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + autoView.isPlaying = false + } + } + + //计时器事件-封面图片随着音乐播放器状态旋转自身 + @objc private func coverRotationalAction(_ link:CADisplayLink) { + //当音乐播放器启动后,使得封面图片无限旋转,当音乐播放器暂停/结束后,图片会回正 + DispatchQueue.main.async { + [weak self] in + guard let self = self else { return } + let angle = CGFloat.pi / 200 + coverImageView.transform = coverImageView.transform.rotated(by: angle) + } + + } + + func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + return MPSideA_PresentationController(presentedViewController: presented, presenting: presenting) + } +} diff --git a/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.xib b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.xib new file mode 100644 index 0000000..0463233 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/ViewControllers/Home(音乐资源列表)/MPSideA_PlayerViewController.xib @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.swift b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.swift new file mode 100644 index 0000000..187a46e --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.swift @@ -0,0 +1,73 @@ +// +// MPBottomShowView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/8. +// + +import UIKit +///底部当前播放音乐展示View(播放器音乐存在时显现) +class MPSideA_BottomShowView: UIView, instanceFromNibDelegate { + @IBOutlet weak var backImageView: UIImageView!{ + didSet{ + backImageView.isUserInteractionEnabled = true + backImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(pushPlayerActionClick(_ :)))) + } + } + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + //播放器状态 + @IBOutlet weak var stateBtn: UIButton! + //倒计时按钮(常态显示,倒计时隐藏) + @IBOutlet weak var timerBtn: UIButton! + //倒计时View(常态隐藏,倒计时显示) + @IBOutlet weak var timerView: UIView!{ + didSet{ + timerView.layer.masksToBounds = false + timerView.isUserInteractionEnabled = true + timerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(timerActionClick(_ :)))) + } + } + //倒计时Label(常态隐藏,倒计时显示) + @IBOutlet weak var timerLabel: UILabel! + //弹出计时器闭包 + var modalTimerBlock:ActionBlock? + //前往播放器页面闭包 + var pushPlayerBlock:ActionBlock? + //切换播放器状态包 + var switchPlayerBlock:ActionBlock? + override func awakeFromNib() { + super.awakeFromNib() + + } + //MARK: - 交互事件 + //弹出计时器 + @IBAction func timerClick(_ sender: UIButton) { + guard modalTimerBlock != nil else { + return + } + modalTimerBlock!() + } + //启动播放/暂停播放 + @IBAction func switchStateClick(_ sender: UIButton) { + guard switchPlayerBlock != nil else { + return + } + switchPlayerBlock!() + } + //弹出计时选择器 + @objc private func timerActionClick(_ sender:UITapGestureRecognizer) { + guard modalTimerBlock != nil else { + return + } + modalTimerBlock!() + } + //前往播放器页面 + @objc private func pushPlayerActionClick(_ sender:UITapGestureRecognizer) { + guard pushPlayerBlock != nil else { + return + } + pushPlayerBlock!() + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.xib b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.xib new file mode 100644 index 0000000..3ab82a7 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_BottomShowView.xib @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBar.swift b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBar.swift new file mode 100644 index 0000000..d3e0423 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBar.swift @@ -0,0 +1,36 @@ +// +// MPCustomTabBar.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///自定义taBar +class MPSideA_CustomTabBar: UITabBar { + //tabBarView + fileprivate lazy var tabBarView:MPSideA_CustomTabBarView = { + let tabBarView:MPSideA_CustomTabBarView = .instanceFromNib() + return tabBarView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.addSubview(tabBarView) + backgroundColor = .clear + tabBarView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(72*width) + } + } + override func layoutSubviews() { + super.layoutSubviews() + //将tabBarView置于顶层 + self.bringSubviewToFront(tabBarView) + } + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + +} diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarItem.swift b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarItem.swift new file mode 100644 index 0000000..7a6948c --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarItem.swift @@ -0,0 +1,53 @@ +// +// MPCustomTabBarItem.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///自定义tabBarItem +class MPSideA_CustomTabBarItem: UIView { + //icon图片 + fileprivate lazy var iconImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + //展示的内容 + var title:String!{ + didSet{ + iconImageView.image = UIImage(named: title) + } + } + ///选中状态 + var isSelected:Bool = false{ + didSet{ + if isSelected { + //选中 + iconImageView.image = UIImage(named: title + " 1") + }else{ + //未选中 + iconImageView.image = UIImage(named: title) + } + } + } + override init(frame: CGRect) { + super.init(frame: frame) + setUpLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setUpLayout() + } + //MARK: - 布局实现 + fileprivate func setUpLayout() { + backgroundColor = .clear + addSubview(iconImageView) + iconImageView.snp.makeConstraints { make in + make.width.height.equalToSuperview() + make.center.equalToSuperview() + } + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.swift b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.swift new file mode 100644 index 0000000..007f614 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.swift @@ -0,0 +1,69 @@ +// +// MPCustomTabBarView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///自定义tabBarView +class MPSideA_CustomTabBarView: UIView, instanceFromNibDelegate { + @IBOutlet weak var bgImageView: UIImageView!{ + didSet{ + bgImageView.layer.masksToBounds = true + bgImageView.layer.cornerRadius = 24*width + bgImageView.layer.maskedCorners = [.layerMinXMinYCorner,.layerMaxXMinYCorner] + } + } + @IBOutlet var tabBarItems: [MPSideA_CustomTabBarItem]!{ + didSet{ + //添加点击事件 + tabBarItems.forEach { item in + item.isUserInteractionEnabled = true + item.title = titles[item.tag] + item.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(switchActionClick(_ :)))) + } + } + } + private lazy var titles:[String] = ["Home","Center"] + //当前选中item(默认为首位) + private lazy var selectedItem:Int = 0 + override func awakeFromNib() { + super.awakeFromNib() + setUpLayout() + } + override init(frame: CGRect) { + super.init(frame: frame) + setUpLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + deinit { + } + //布局 + private func setUpLayout() { + backgroundColor = .clear + //超出部分不切除 + layer.masksToBounds = false + //默认首位item处于选中状态 + tabBarItems[0].isSelected = true + } + //点击事件 + @objc private func switchActionClick(_ sender:UITapGestureRecognizer) { + endEditing(true) + let tag = sender.view?.tag ?? 0 + //根据tag值传送 + guard selectedItem != tag else { + //无效点击 + return + } + tabBarItems.forEach { item in + item.isSelected = item.tag == tag + } + selectedItem = tag + //发送页面切换通知 + NotificationCenter.notificationKey.post(notificationName: .switch_tabBarItem, object: tag) + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.xib b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.xib new file mode 100644 index 0000000..9eb18a9 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Base(基类-导航栏-标签栏)/MPSideA_CustomTabBarView.xib @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift new file mode 100644 index 0000000..9895a0d --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.swift @@ -0,0 +1,50 @@ +// +// CenterTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/2. +// + +import UIKit + +class MPSideA_CenterTableViewCell: UITableViewCell { + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var durationLabel: UILabel! + var musicView:MPSideA_MusicViewModel!{ + didSet{ + coverImageView.image = musicView.cover + titleLabel.text = musicView.title + durationLabel.text = musicView.duration + //判断当前音乐是否播放中,是不是这首音乐 + guard MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing, MPSideA_MediaCenterManager.shared.getMusic()?.identifier == musicView.music.identifier else { + //展示未播放状态 + titleLabel.textColor = .init(hex: "#FFFFFF") + durationLabel.textColor = .init(hex: "#FFFFFF") + return + } + //展示播放状态 + titleLabel.textColor = .init(hex: "#80F988") + durationLabel.textColor = .init(hex: "#80F988") + } + } + var moreBlock:((UIButton) -> Void)? + override func awakeFromNib() { + super.awakeFromNib() + selectionStyle = .none + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + //更多操作 + @IBAction func moreClick(_ sender: UIButton) { + guard moreBlock != nil else { + return + } + moreBlock!(sender) + } + +} diff --git a/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib new file mode 100644 index 0000000..b6c29d7 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_CenterTableViewCell.xib @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.swift new file mode 100644 index 0000000..4839792 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.swift @@ -0,0 +1,30 @@ +// +// SettingTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit + +class MPSideA_SettingTableViewCell: UITableViewCell { + @IBOutlet weak var iconImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + var title:String!{ + didSet{ + iconImageView.image = UIImage(named: title) + titleLabel.text = title + } + } + override func awakeFromNib() { + super.awakeFromNib() + selectionStyle = .none + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.xib new file mode 100644 index 0000000..1d59b65 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Center(个人资源)/MPSideA_SettingTableViewCell.xib @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift new file mode 100644 index 0000000..10a7194 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.swift @@ -0,0 +1,38 @@ +// +// Home_FirstListCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///首页音乐第一行展示列表Cell +class MPSideA_Home_FirstListCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var stateBtn: UIButton! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + var musicView:MPSideA_MusicViewModel!{ + didSet{ + coverImageView.image = musicView.cover + titleLabel.text = musicView.title + subtitleLabel.text = musicView.duration + //判断当前音乐是否播放中,是不是这首音乐 + guard MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing, MPSideA_MediaCenterManager.shared.getMusic()?.identifier == musicView.music.identifier else { + //展示未播放状态 + titleLabel.textColor = .init(hex: "#FFFFFF") + subtitleLabel.textColor = .init(hex: "#FFFFFF") + stateBtn.isSelected = false + return + } + //展示播放状态 + titleLabel.textColor = .init(hex: "#80F988") + subtitleLabel.textColor = .init(hex: "#80F988") + stateBtn.isSelected = true + } + } + override func awakeFromNib() { + super.awakeFromNib() + } + +} diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib new file mode 100644 index 0000000..28a838f --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FirstListCollectionViewCell.xib @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift new file mode 100644 index 0000000..81ffd48 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.swift @@ -0,0 +1,41 @@ +// +// Home_FourthListCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///首页音乐第四行展示列表Cell +class MPSideA_Home_FourthListCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + @IBOutlet weak var shieldView: UIView! + @IBOutlet weak var stateBtn: UIButton! + var musicView:MPSideA_MusicViewModel!{ + didSet{ + coverImageView.image = musicView.cover + titleLabel.text = musicView.title + subtitleLabel.text = musicView.duration + //判断当前音乐是否播放中,是不是这首音乐 + guard MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing, MPSideA_MediaCenterManager.shared.getMusic()?.identifier == musicView.music.identifier else { + //展示未播放状态 + titleLabel.textColor = .init(hex: "#FFFFFF") + subtitleLabel.textColor = .init(hex: "#FFFFFF") + stateBtn.isSelected = false + shieldView.isHidden = true + return + } + //展示播放状态 + titleLabel.textColor = .init(hex: "#80F988") + subtitleLabel.textColor = .init(hex: "#80F988") + stateBtn.isSelected = true + shieldView.isHidden = false + } + } + override func awakeFromNib() { + super.awakeFromNib() + + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib new file mode 100644 index 0000000..05223cb --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_FourthListCollectionViewCell.xib @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_HeadBannerView.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_HeadBannerView.swift new file mode 100644 index 0000000..6a06146 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_HeadBannerView.swift @@ -0,0 +1,36 @@ +// +// Home_HeadBannerView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///首页顶部标题View +class MPSideA_Home_HeadBannerView: UIView { + //banner + private lazy var bannerImageView:UIImageView = { + let imageView:UIImageView = .init(image: .init(named: "Home'banner")) + imageView.contentMode = .scaleAspectFill + return imageView + }() + override init(frame: CGRect) { + super.init(frame: frame) + setUpLayout() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setUpLayout() + } + //约束加载 + private func setUpLayout() { + addSubview(bannerImageView) + bannerImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(16*width) + make.height.equalTo(78*width) + make.width.equalTo(324*width) + make.top.equalToSuperview().offset(20*width) + } + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.swift new file mode 100644 index 0000000..c4112fd --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.swift @@ -0,0 +1,190 @@ +// +// Home_RowListsTableViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +//HomeTableViewcell展示类型 +enum MPSideA_HomeRowCellLayout: Int { + case Zero = 0 + case First = 1 + case Second = 2 + case Third = 3 + //collectionView的高度 + var height:CGFloat{ + switch self { + case .Zero: + return 140*width + case .First: + return 163*width + case .Second: + return 163*width + case .Third: + return 215*width + } + } + //collecitonViewCell的Size + var size:CGSize{ + switch self { + case .Zero: + return .init(width: 166*width, height: 140*width) + case .First: + return .init(width: 108*width, height: 118*width) + case .Second: + return .init(width: 108*width, height: 118*width) + case .Third: + return .init(width: 340*width, height: 54*width) + } + } + //collectionViewCell的外边距 + var edgeInsets:UIEdgeInsets{ + switch self { + case .Zero: + return .init(top: 0, left: 16*width, bottom: 0, right: 16*width) + case .First: + return .init(top: 0, left: 16*width, bottom: 45*width, right: 16*width) + case .Second: + return .init(top: 0, left: 16*width, bottom: 45*width, right: 16*width) + case .Third: + return .init(top: 0, left: 16*width, bottom: 17*width, right: 16*width) + } + } + //collectionViewCell的组距 + var columnDistance:CGFloat{ + return 17*width + } + //collectionViewCell的列距 + var rowDistance:CGFloat{ + return 8*width + } +} +class MPSideA_Home_RowListsTableViewCell: UITableViewCell { + @IBOutlet weak var collectionView: UICollectionView!{ + didSet{ + collectionView.contentInsetAdjustmentBehavior = .never + collectionView.dataSource = self + collectionView.delegate = self + collectionView.register(UINib(nibName: Home_FirstListCollectionViewCellID, bundle: nil), forCellWithReuseIdentifier: Home_FirstListCollectionViewCellID) + collectionView.register(UINib(nibName: Home_SecondListCollectionViewCellID, bundle: nil), forCellWithReuseIdentifier: Home_SecondListCollectionViewCellID) + collectionView.register(UINib(nibName: Home_FourthListCollectionViewCellID, bundle: nil), forCellWithReuseIdentifier: Home_FourthListCollectionViewCellID) + } + } + @IBOutlet weak var heightConstraint: NSLayoutConstraint! + var layout:MPSideA_HomeRowCellLayout = .Zero { + didSet{ + heightConstraint.constant = layout.height + collectionView.reloadData() + } + } + fileprivate let Home_FirstListCollectionViewCellID = "MPSideA_Home_FirstListCollectionViewCell" + fileprivate let Home_SecondListCollectionViewCellID = "MPSideA_Home_SecondListCollectionViewCell" + fileprivate let Home_FourthListCollectionViewCellID = "MPSideA_Home_FourthListCollectionViewCell" + override func awakeFromNib() { + super.awakeFromNib() + selectionStyle = .none + //添加通知 + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .sideA_play_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .sideA_stop_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .sideA_resume_music) + NotificationCenter.notificationKey.add(observer: self, selector: #selector(switchPlayerStateAction(_ :)), notificationName: .sideA_pause_music) + } + deinit{ + //移除所有通知 + NotificationCenter.default.removeObserver(self) + } + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + //当音乐播放器状态改变时 + @objc private func switchPlayerStateAction(_ sender:Notification) { + //回归主线程 + DispatchQueue.main.async { + [weak self] in + //刷新页面内容 + self?.collectionView.reloadData() + } + } +} +//MARK: - collectionView处理 +extension MPSideA_Home_RowListsTableViewCell:UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { + func numberOfSections(in collectionView: UICollectionView) -> Int { + return layout != .Third ? 1:3 + } + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + switch layout { + case .Zero: + return MPSideA_LoadDataMusic.shared.homeZeroMusics.count + case .First: + return MPSideA_LoadDataMusic.shared.homeFirstMusics.count + case .Second: + return MPSideA_LoadDataMusic.shared.homeSecondMusics.count + default: + return MPSideA_LoadDataMusic.shared.homeThirdMusics[section].count + } + } + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + switch layout { + case .Zero: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Home_FirstListCollectionViewCellID, for: indexPath) as! MPSideA_Home_FirstListCollectionViewCell + cell.musicView = MPSideA_LoadDataMusic.shared.homeZeroMusics[indexPath.row] + return cell + case .First: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Home_SecondListCollectionViewCellID, for: indexPath) as! MPSideA_Home_SecondListCollectionViewCell + cell.musicView = MPSideA_LoadDataMusic.shared.homeFirstMusics[indexPath.row] + return cell + case .Second: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Home_SecondListCollectionViewCellID, for: indexPath) as! MPSideA_Home_SecondListCollectionViewCell + cell.musicView = MPSideA_LoadDataMusic.shared.homeSecondMusics[indexPath.row] + return cell + default: + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Home_FourthListCollectionViewCellID, for: indexPath) as! MPSideA_Home_FourthListCollectionViewCell + cell.musicView = MPSideA_LoadDataMusic.shared.homeThirdMusics[indexPath.section][indexPath.row] + return cell + } + } + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return layout.size + } + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return layout.edgeInsets + } + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return layout.rowDistance + } + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return layout.columnDistance + } + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + var music:MPSideA_MusicModel! + switch layout { + case .Zero: + //获取一首音乐 + music = MPSideA_LoadDataMusic.shared.homeZeroMusics[indexPath.row].music + case .First: + music = MPSideA_LoadDataMusic.shared.homeFirstMusics[indexPath.row].music + case .Second: + music = MPSideA_LoadDataMusic.shared.homeSecondMusics[indexPath.row].music + default: + music = MPSideA_LoadDataMusic.shared.homeThirdMusics[indexPath.section][indexPath.row].music + } + //检索当前音乐状态 + guard MPSideA_MediaCenterManager.shared.getMusic()?.identifier != music.identifier else { + //同一首,检索是否播放中 + switch MPSideA_MediaCenterManager.shared.getPlayerState() { + case .Null://没有播放 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + case .Playing://播放中 + break + case .Pause://继续播放 + MPSideA_MediaCenterManager.shared.playerResume() + } + return + } + //新的一首 + MPSideA_MediaCenterManager.shared.playerStart(music, actionType: .Normal) + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.xib new file mode 100644 index 0000000..99e6af2 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_RowListsTableViewCell.xib @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift new file mode 100644 index 0000000..10aa0a2 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.swift @@ -0,0 +1,38 @@ +// +// Home_SecondListCollectionViewCell.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/3/27. +// + +import UIKit +///首页音乐第二/三行展示列表Cell +class MPSideA_Home_SecondListCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var coverImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var subtitleLabel: UILabel! + @IBOutlet weak var shieldView: UIView! + var musicView:MPSideA_MusicViewModel!{ + didSet{ + coverImageView.image = musicView.cover + titleLabel.text = musicView.title + subtitleLabel.text = musicView.duration + //判断当前音乐是否播放中,是不是这首音乐 + guard MPSideA_MediaCenterManager.shared.getPlayerState() == .Playing, MPSideA_MediaCenterManager.shared.getMusic()?.identifier == musicView.music.identifier else { + //展示未播放状态 + titleLabel.textColor = .init(hex: "#FFFFFF") + subtitleLabel.textColor = .init(hex: "#FFFFFF") + shieldView.isHidden = true + return + } + //展示播放状态 + titleLabel.textColor = .init(hex: "#80F988") + subtitleLabel.textColor = .init(hex: "#80F988") + shieldView.isHidden = false + } + } + override func awakeFromNib() { + super.awakeFromNib() + layer.masksToBounds = false + } +} diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib new file mode 100644 index 0000000..17aaf80 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_Home_SecondListCollectionViewCell.xib @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_PlayerActionView.swift b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_PlayerActionView.swift new file mode 100644 index 0000000..dda8289 --- /dev/null +++ b/MusicPlayer/MP/MPSideA/Views/Home(音乐资源列表-播放器)/MPSideA_PlayerActionView.swift @@ -0,0 +1,79 @@ +// +// PlayerActionView.swift +// MusicPlayer +// +// Created by Mr.Zhou on 2024/4/10. +// + +import UIKit +///播放器各事项View +class MPSideA_PlayerActionView: UIView { + //常规图片(展示dark和light状态的图片) + private lazy var normalImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + //运行时图片(当功能运行时图片,视图最上层) + private lazy var playingImageView:UIImageView = { + let imageView:UIImageView = .init() + imageView.contentMode = .scaleAspectFill + return imageView + }() + //dark状态下图片 + var darkImage:UIImage! + //light状态下图片 + var lightImage:UIImage! + //playing状态下图片 + var playingImage:UIImage! + //是dark还是light? + var isDark:Bool = true{ + didSet{ + normalImageView.image = isDark ? darkImage:lightImage + } + } + //是否运行时 + var isPlaying:Bool = false{ + didSet{ + playingImageView.image = playingImage + normalImageView.isHidden = isPlaying + playingImageView.isHidden = !isPlaying + } + } + override init(frame: CGRect) { + super.init(frame: frame) + setUpLayout() + } + override func awakeFromNib() { + super.awakeFromNib() + setUpLayout() + } + required init?(coder: NSCoder) { + super.init(coder: coder) +// setUpLayout() + } + override func layoutSubviews() { + super.layoutSubviews() + //xib加载完成后,设置圆角 + layer.masksToBounds = true + layer.cornerRadius = frame.size.width/2 + } + + //约束加载 + private func setUpLayout() { + isUserInteractionEnabled = true + addSubview(normalImageView) + normalImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(26*width) + } + normalImageView.isHidden = false + addSubview(playingImageView) + playingImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.width.height.equalTo(26*width) + } + playingImageView.isHidden = true + } + +}