add
无故事王国
2024-05-28 64d4343b54e747804656a3fb7eca4a2d14d6e5de
add
9个文件已修改
31个文件已添加
1909 ■■■■■ 已修改文件
DolphinEnglishLearnStudent.xcodeproj/project.pbxproj 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/AppDelegate.swift 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/btn_radio.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/btn_radio@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/btn_radio_u.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/btn_radio_u@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/icon_fullScreen.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/icon_fullScreen@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/Contents.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/icon_question.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/icon_question@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Base/BaseVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.xib 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.swift 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.xib 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.xib 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
@@ -51,7 +51,11 @@
        130278992BFD9FBF00DDCE81 /* Home_1_TCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130278932BFD9FBF00DDCE81 /* Home_1_TCell.swift */; };
        1302789A2BFD9FBF00DDCE81 /* AddressManageTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130278942BFD9FBF00DDCE81 /* AddressManageTCell.swift */; };
        1302789B2BFD9FBF00DDCE81 /* GoodsItemTCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 130278952BFD9FBF00DDCE81 /* GoodsItemTCell.swift */; };
        1316A22E2C05CE5900BE6CAA /* GameBeginTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1316A22D2C05CE5900BE6CAA /* GameBeginTipView.swift */; };
        1316A2302C05CE6100BE6CAA /* GameBeginTipView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1316A22F2C05CE6100BE6CAA /* GameBeginTipView.xib */; };
        133386382C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133386372C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift */; };
        13397D962C05EA9D003440F9 /* ListenFight_Game_CCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13397D942C05EA9D003440F9 /* ListenFight_Game_CCell.swift */; };
        13397D972C05EA9D003440F9 /* ListenFight_Game_CCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13397D952C05EA9D003440F9 /* ListenFight_Game_CCell.xib */; };
        1362C75F2BFF4BA900BD7F73 /* StudyHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1362C75E2BFF4BA900BD7F73 /* StudyHandleView.swift */; };
        1362C7612BFF4BB100BD7F73 /* StudyHandleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1362C7602BFF4BB100BD7F73 /* StudyHandleView.xib */; };
        13649E982C002534001B04E2 /* HomeListenFight_lesson_1_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13649E972C002534001B04E2 /* HomeListenFight_lesson_1_VC.swift */; };
@@ -60,8 +64,23 @@
        137CB4292BFF505800D32862 /* HomeListenFightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137CB4282BFF505800D32862 /* HomeListenFightVC.swift */; };
        138964002BFDF98200AEDCD9 /* StudyVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 138963FE2BFDF98200AEDCD9 /* StudyVC.swift */; };
        138964012BFDF98200AEDCD9 /* StudyVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 138963FF2BFDF98200AEDCD9 /* StudyVC.xib */; };
        13A049FF2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A049FE2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift */; };
        13A04A012C05BFCE00F1F52E /* HomeListenGame_1_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A04A002C05BFCE00F1F52E /* HomeListenGame_1_VC.swift */; };
        13A04A032C05BFDC00F1F52E /* HomeListenGame_2_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A04A022C05BFDC00F1F52E /* HomeListenGame_2_VC.swift */; };
        13A04A052C05C29300F1F52E /* ChooseLevelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A04A042C05C29300F1F52E /* ChooseLevelView.swift */; };
        13A04A072C05C29D00F1F52E /* ChooseLevelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13A04A062C05C29D00F1F52E /* ChooseLevelView.xib */; };
        13A830F12C04196400BB2F23 /* HomeListenFight_lesson_3_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A830F02C04196400BB2F23 /* HomeListenFight_lesson_3_VC.swift */; };
        13A830F42C041B4400BB2F23 /* ListenFight_lesson_3_CCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13A830F32C041B4400BB2F23 /* ListenFight_lesson_3_CCell.xib */; };
        13A830F52C041B4400BB2F23 /* ListenFight_lesson_3_CCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A830F22C041B4400BB2F23 /* ListenFight_lesson_3_CCell.swift */; };
        13A830F82C043A0000BB2F23 /* Lesson_3_AnswerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A830F72C043A0000BB2F23 /* Lesson_3_AnswerView.swift */; };
        13A830FA2C043A0600BB2F23 /* Lesson_3_AnswerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13A830F92C043A0600BB2F23 /* Lesson_3_AnswerView.xib */; };
        13AA25392C00759600F075B3 /* HomeStudyCompleteVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13AA25372C00759600F075B3 /* HomeStudyCompleteVC.swift */; };
        13AA253A2C00759600F075B3 /* HomeStudyCompleteVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13AA25382C00759600F075B3 /* HomeStudyCompleteVC.xib */; };
        13CDF4492C0566E400E8D4FD /* HomeListenFight_lesson_4_VC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CDF4482C0566E400E8D4FD /* HomeListenFight_lesson_4_VC.swift */; };
        13CDF44C2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CDF44B2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.xib */; };
        13CDF44D2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CDF44A2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.swift */; };
        13CDF44F2C05756C00E8D4FD /* Lesson_4_AnswerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CDF44E2C05756C00E8D4FD /* Lesson_4_AnswerView.swift */; };
        13CDF4512C05757400E8D4FD /* Lesson_4_AnswerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CDF4502C05757400E8D4FD /* Lesson_4_AnswerView.xib */; };
        13E07DF12BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E07DF02BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift */; };
        13EEB8912BFED3F3002996FC /* AwardListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8902BFED3F3002996FC /* AwardListView.swift */; };
        13EEB8932BFED3FA002996FC /* AwardListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EEB8922BFED3FA002996FC /* AwardListView.xib */; };
@@ -126,7 +145,11 @@
        130278932BFD9FBF00DDCE81 /* Home_1_TCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Home_1_TCell.swift; sourceTree = "<group>"; };
        130278942BFD9FBF00DDCE81 /* AddressManageTCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressManageTCell.swift; sourceTree = "<group>"; };
        130278952BFD9FBF00DDCE81 /* GoodsItemTCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GoodsItemTCell.swift; sourceTree = "<group>"; };
        1316A22D2C05CE5900BE6CAA /* GameBeginTipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameBeginTipView.swift; sourceTree = "<group>"; };
        1316A22F2C05CE6100BE6CAA /* GameBeginTipView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GameBeginTipView.xib; sourceTree = "<group>"; };
        133386372C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFight_lesson_2_VC.swift; sourceTree = "<group>"; };
        13397D942C05EA9D003440F9 /* ListenFight_Game_CCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListenFight_Game_CCell.swift; sourceTree = "<group>"; };
        13397D952C05EA9D003440F9 /* ListenFight_Game_CCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ListenFight_Game_CCell.xib; sourceTree = "<group>"; };
        1362C75E2BFF4BA900BD7F73 /* StudyHandleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyHandleView.swift; sourceTree = "<group>"; };
        1362C7602BFF4BB100BD7F73 /* StudyHandleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StudyHandleView.xib; sourceTree = "<group>"; };
        13649E972C002534001B04E2 /* HomeListenFight_lesson_1_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HomeListenFight_lesson_1_VC.swift; path = DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift; sourceTree = SOURCE_ROOT; };
@@ -135,8 +158,23 @@
        137CB4282BFF505800D32862 /* HomeListenFightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFightVC.swift; sourceTree = "<group>"; };
        138963FE2BFDF98200AEDCD9 /* StudyVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyVC.swift; sourceTree = "<group>"; };
        138963FF2BFDF98200AEDCD9 /* StudyVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StudyVC.xib; sourceTree = "<group>"; };
        13A049FE2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFight_lesson_5_VC.swift; sourceTree = "<group>"; };
        13A04A002C05BFCE00F1F52E /* HomeListenGame_1_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenGame_1_VC.swift; sourceTree = "<group>"; };
        13A04A022C05BFDC00F1F52E /* HomeListenGame_2_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenGame_2_VC.swift; sourceTree = "<group>"; };
        13A04A042C05C29300F1F52E /* ChooseLevelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChooseLevelView.swift; sourceTree = "<group>"; };
        13A04A062C05C29D00F1F52E /* ChooseLevelView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ChooseLevelView.xib; sourceTree = "<group>"; };
        13A830F02C04196400BB2F23 /* HomeListenFight_lesson_3_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFight_lesson_3_VC.swift; sourceTree = "<group>"; };
        13A830F22C041B4400BB2F23 /* ListenFight_lesson_3_CCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListenFight_lesson_3_CCell.swift; sourceTree = "<group>"; };
        13A830F32C041B4400BB2F23 /* ListenFight_lesson_3_CCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ListenFight_lesson_3_CCell.xib; sourceTree = "<group>"; };
        13A830F72C043A0000BB2F23 /* Lesson_3_AnswerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lesson_3_AnswerView.swift; sourceTree = "<group>"; };
        13A830F92C043A0600BB2F23 /* Lesson_3_AnswerView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Lesson_3_AnswerView.xib; sourceTree = "<group>"; };
        13AA25372C00759600F075B3 /* HomeStudyCompleteVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStudyCompleteVC.swift; sourceTree = "<group>"; };
        13AA25382C00759600F075B3 /* HomeStudyCompleteVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeStudyCompleteVC.xib; sourceTree = "<group>"; };
        13CDF4482C0566E400E8D4FD /* HomeListenFight_lesson_4_VC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeListenFight_lesson_4_VC.swift; sourceTree = "<group>"; };
        13CDF44A2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListenFight_lesson_4_CCell.swift; sourceTree = "<group>"; };
        13CDF44B2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ListenFight_lesson_4_CCell.xib; sourceTree = "<group>"; };
        13CDF44E2C05756C00E8D4FD /* Lesson_4_AnswerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lesson_4_AnswerView.swift; sourceTree = "<group>"; };
        13CDF4502C05757400E8D4FD /* Lesson_4_AnswerView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Lesson_4_AnswerView.xib; sourceTree = "<group>"; };
        13E07DF02BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExchangeRecordHistoryVC.swift; sourceTree = "<group>"; };
        13EEB8902BFED3F3002996FC /* AwardListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwardListView.swift; sourceTree = "<group>"; };
        13EEB8922BFED3FA002996FC /* AwardListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AwardListView.xib; sourceTree = "<group>"; };
@@ -354,6 +392,12 @@
            children = (
                13649E9A2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift */,
                13649E9B2C00304C001B04E2 /* ListenFight_lesson_1_CCell.xib */,
                13A830F22C041B4400BB2F23 /* ListenFight_lesson_3_CCell.swift */,
                13A830F32C041B4400BB2F23 /* ListenFight_lesson_3_CCell.xib */,
                13CDF44A2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.swift */,
                13CDF44B2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.xib */,
                13397D942C05EA9D003440F9 /* ListenFight_Game_CCell.swift */,
                13397D952C05EA9D003440F9 /* ListenFight_Game_CCell.xib */,
            );
            path = CCell;
            sourceTree = "<group>";
@@ -368,8 +412,28 @@
                137CB4282BFF505800D32862 /* HomeListenFightVC.swift */,
                13649E972C002534001B04E2 /* HomeListenFight_lesson_1_VC.swift */,
                133386372C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift */,
                13A830F02C04196400BB2F23 /* HomeListenFight_lesson_3_VC.swift */,
                13CDF4482C0566E400E8D4FD /* HomeListenFight_lesson_4_VC.swift */,
                13A049FE2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift */,
                13A04A002C05BFCE00F1F52E /* HomeListenGame_1_VC.swift */,
                13A04A022C05BFDC00F1F52E /* HomeListenGame_2_VC.swift */,
            );
            path = VC;
            sourceTree = "<group>";
        };
        13A830F62C0439C300BB2F23 /* View */ = {
            isa = PBXGroup;
            children = (
                13A830F72C043A0000BB2F23 /* Lesson_3_AnswerView.swift */,
                13A830F92C043A0600BB2F23 /* Lesson_3_AnswerView.xib */,
                13CDF44E2C05756C00E8D4FD /* Lesson_4_AnswerView.swift */,
                13CDF4502C05757400E8D4FD /* Lesson_4_AnswerView.xib */,
                13A04A042C05C29300F1F52E /* ChooseLevelView.swift */,
                13A04A062C05C29D00F1F52E /* ChooseLevelView.xib */,
                1316A22D2C05CE5900BE6CAA /* GameBeginTipView.swift */,
                1316A22F2C05CE6100BE6CAA /* GameBeginTipView.xib */,
            );
            path = View;
            sourceTree = "<group>";
        };
        13AA25362C00757300F075B3 /* VC */ = {
@@ -402,6 +466,7 @@
        13EEB89E2BFF2853002996FC /* Listen */ = {
            isa = PBXGroup;
            children = (
                13A830F62C0439C300BB2F23 /* View */,
                13649E992C002FDF001B04E2 /* CCell */,
                137CB4272BFF500700D32862 /* VC */,
                13EEB8A12BFF3507002996FC /* TCell */,
@@ -504,23 +569,30 @@
                130278612BFD999200DDCE81 /* LoginVC.xib in Resources */,
                13EEB8982BFF1531002996FC /* AwardListCCell.xib in Resources */,
                13AA253A2C00759600F075B3 /* HomeStudyCompleteVC.xib in Resources */,
                13A830F42C041B4400BB2F23 /* ListenFight_lesson_3_CCell.xib in Resources */,
                1302785B2BFD985E00DDCE81 /* CommonAlertView.xib in Resources */,
                130278972BFD9FBF00DDCE81 /* AddressManageTCell.xib in Resources */,
                1302787C2BFD9ED600DDCE81 /* MarketContentVC.xib in Resources */,
                130278332BFD957300DDCE81 /* Assets.xcassets in Resources */,
                130278822BFD9F0700DDCE81 /* MeVC.xib in Resources */,
                1316A2302C05CE6100BE6CAA /* GameBeginTipView.xib in Resources */,
                13EEB8A52BFF353C002996FC /* HomeListen_process_TCell.xib in Resources */,
                13A830FA2C043A0600BB2F23 /* Lesson_3_AnswerView.xib in Resources */,
                1302785D2BFD985E00DDCE81 /* CommonInputView.xib in Resources */,
                1302787A2BFD9ED600DDCE81 /* ExchangeResultVC.xib in Resources */,
                130278362BFD957300DDCE81 /* Base in Resources */,
                13397D972C05EA9D003440F9 /* ListenFight_Game_CCell.xib in Resources */,
                1302788E2BFD9F4200DDCE81 /* CoinRecordHistoryVC.xib in Resources */,
                130278312BFD957100DDCE81 /* Base in Resources */,
                1362C7612BFF4BB100BD7F73 /* StudyHandleView.xib in Resources */,
                138964012BFDF98200AEDCD9 /* StudyVC.xib in Resources */,
                130278662BFD9E8C00DDCE81 /* HomeVC.xib in Resources */,
                130278772BFD9ED600DDCE81 /* MarketCCell.xib in Resources */,
                13A04A072C05C29D00F1F52E /* ChooseLevelView.xib in Resources */,
                13EEB8A92BFF354B002996FC /* HomeListen_item_TCell.xib in Resources */,
                13CDF4512C05757400E8D4FD /* Lesson_4_AnswerView.xib in Resources */,
                130278982BFD9FBF00DDCE81 /* GoodsItemTCell.xib in Resources */,
                13CDF44C2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.xib in Resources */,
                130278962BFD9FBF00DDCE81 /* Home_1_TCell.xib in Resources */,
                1302787F2BFD9ED600DDCE81 /* MarketVC.xib in Resources */,
                1302787E2BFD9ED600DDCE81 /* MarketExchangeVC.xib in Resources */,
@@ -580,28 +652,38 @@
                130278832BFD9F0700DDCE81 /* MeVC.swift in Sources */,
                130278992BFD9FBF00DDCE81 /* Home_1_TCell.swift in Sources */,
                1302784B2BFD979200DDCE81 /* TapBtn.swift in Sources */,
                13CDF44F2C05756C00E8D4FD /* Lesson_4_AnswerView.swift in Sources */,
                13EEB8A82BFF354B002996FC /* HomeListen_item_TCell.swift in Sources */,
                13A830F12C04196400BB2F23 /* HomeListenFight_lesson_3_VC.swift in Sources */,
                13CDF44D2C056A6900E8D4FD /* ListenFight_lesson_4_CCell.swift in Sources */,
                1362C75F2BFF4BA900BD7F73 /* StudyHandleView.swift in Sources */,
                130278672BFD9E8C00DDCE81 /* HomeVC.swift in Sources */,
                130278482BFD979200DDCE81 /* BaseNav.swift in Sources */,
                130278622BFD999200DDCE81 /* LoginVC.swift in Sources */,
                13EEB89C2BFF1C35002996FC /* HomeListenMenuVC.swift in Sources */,
                13CDF4492C0566E400E8D4FD /* HomeListenFight_lesson_4_VC.swift in Sources */,
                13A04A012C05BFCE00F1F52E /* HomeListenGame_1_VC.swift in Sources */,
                138964002BFDF98200AEDCD9 /* StudyVC.swift in Sources */,
                13EEB8972BFF1531002996FC /* AwardListCCell.swift in Sources */,
                13649E982C002534001B04E2 /* HomeListenFight_lesson_1_VC.swift in Sources */,
                1302782A2BFD957100DDCE81 /* AppDelegate.swift in Sources */,
                130278762BFD9ED600DDCE81 /* MarketCCell.swift in Sources */,
                1316A22E2C05CE5900BE6CAA /* GameBeginTipView.swift in Sources */,
                13397D962C05EA9D003440F9 /* ListenFight_Game_CCell.swift in Sources */,
                13EEB8A42BFF353C002996FC /* HomeListen_process_TCell.swift in Sources */,
                130278782BFD9ED600DDCE81 /* MarketVC.swift in Sources */,
                1302785E2BFD985E00DDCE81 /* CommonWebVC.swift in Sources */,
                13EEB8AB2BFF36E0002996FC /* HomeListenSubVC.swift in Sources */,
                13A830F82C043A0000BB2F23 /* Lesson_3_AnswerView.swift in Sources */,
                1302789B2BFD9FBF00DDCE81 /* GoodsItemTCell.swift in Sources */,
                13E07DF12BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift in Sources */,
                130278872BFD9F2A00DDCE81 /* AddressManageHandleVC.swift in Sources */,
                130278892BFD9F2A00DDCE81 /* AddressManageVC.swift in Sources */,
                1302785C2BFD985E00DDCE81 /* CommonInputView.swift in Sources */,
                13A04A052C05C29300F1F52E /* ChooseLevelView.swift in Sources */,
                130278792BFD9ED600DDCE81 /* ExchangeResultVC.swift in Sources */,
                1302788D2BFD9F4200DDCE81 /* CoinRecordHistoryVC.swift in Sources */,
                13A049FF2C058B1400F1F52E /* HomeListenFight_lesson_5_VC.swift in Sources */,
                1302785A2BFD985E00DDCE81 /* CommonAlertView.swift in Sources */,
                1302782C2BFD957100DDCE81 /* SceneDelegate.swift in Sources */,
                1302787D2BFD9ED600DDCE81 /* MarketExchangeVC.swift in Sources */,
@@ -610,7 +692,9 @@
                13EEB8912BFED3F3002996FC /* AwardListView.swift in Sources */,
                130278412BFD978900DDCE81 /* Config.swift in Sources */,
                1302784A2BFD979200DDCE81 /* BaseVC.swift in Sources */,
                13A830F52C041B4400BB2F23 /* ListenFight_lesson_3_CCell.swift in Sources */,
                137CB4292BFF505800D32862 /* HomeListenFightVC.swift in Sources */,
                13A04A032C05BFDC00F1F52E /* HomeListenGame_2_VC.swift in Sources */,
                130278592BFD985E00DDCE81 /* BitrhdayPickerView.swift in Sources */,
                133386382C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift in Sources */,
                1302787B2BFD9ED600DDCE81 /* MarketContentVC.swift in Sources */,
@@ -784,7 +868,7 @@
                    "@executable_path/Frameworks",
                );
                MARKETING_VERSION = 1.0;
                PRODUCT_BUNDLE_IDENTIFIER = com.sinata.dolphinEnLearn.student.DolphinEnglishLearnStudent;
                PRODUCT_BUNDLE_IDENTIFIER = com.sinata.dollearn.test;
                PRODUCT_NAME = "$(TARGET_NAME)";
                PROVISIONING_PROFILE_SPECIFIER = "";
                SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@@ -820,7 +904,7 @@
                    "@executable_path/Frameworks",
                );
                MARKETING_VERSION = 1.0;
                PRODUCT_BUNDLE_IDENTIFIER = com.sinata.dolphinEnLearn.student.DolphinEnglishLearnStudent;
                PRODUCT_BUNDLE_IDENTIFIER = com.sinata.dollearn;
                PRODUCT_NAME = "$(TARGET_NAME)";
                PROVISIONING_PROFILE_SPECIFIER = "";
                SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
DolphinEnglishLearnStudent/AppDelegate.swift
@@ -8,6 +8,7 @@
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
                var window: UIWindow?
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "btn_radio.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "btn_radio@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/btn_radio.png
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_cir.imageset/btn_radio@2x.png
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "btn_radio_u.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "btn_radio_u@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/btn_radio_u.png
DolphinEnglishLearnStudent/Assets.xcassets/Btn/btn_radio_u_cir.imageset/btn_radio_u@2x.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "icon_fullScreen.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_fullScreen@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/icon_fullScreen.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_fullScreen.imageset/icon_fullScreen@2x.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/Contents.json
New file
@@ -0,0 +1,22 @@
{
  "images" : [
    {
      "filename" : "icon_question.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "icon_question@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/icon_question.png
DolphinEnglishLearnStudent/Assets.xcassets/Icon/icon_question.imageset/icon_question@2x.png
DolphinEnglishLearnStudent/Base/BaseVC.swift
@@ -60,7 +60,7 @@
                                                navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
                                }
                                if !self.isKind(of: HomeVC.self) && !self.isKind(of: HomeListenSubVC.self) && !self.isKind(of: HomeListenFight_lesson_1_VC.self) && !self.isKind(of: HomeListenFight_lesson_2_VC.self){
                                if !self.isKind(of: HomeVC.self) && !self.isKind(of: HomeListenSubVC.self) && !self.isKind(of: HomeListenFight_lesson_1_VC.self) && !self.isKind(of: HomeListenFight_lesson_2_VC.self) && !self.isKind(of: HomeListenFight_lesson_3_VC.self) && !self.isKind(of: HomeListenFight_lesson_4_VC.self) && !self.isKind(of: HomeListenFight_lesson_5_VC.self) && !self.isKind(of: HomeListenGame_1_VC.self) && !self.isKind(of: HomeListenGame_2_VC.self){
                                                let titleV = UIView()
                                                titleV.bounds = CGRect(x: 0, y: 0, width: 156, height: 63)
                                                titleV.sizeToFit()
DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift
@@ -61,7 +61,7 @@
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(24)
                                                make.centerX.equalToSuperview()
                                                make.height.equalTo(52)
                                                make.width.equalTo(159)
                                                make.width.equalTo(199)
                                }
                }
@@ -99,7 +99,7 @@
                                                self.menuView.snp.updateConstraints { make in
                                                                make.top.equalTo(self.view).offset(v.origin.y + UIDevice.jq_safeEdges.top + 101 + 50)
                                                                make.left.equalToSuperview().offset(v.origin.x + 194)
                                                                make.width.equalTo(v.size.width - 10)
                                                                make.width.equalTo(v.size.width + 50)
                                                                make.height.equalTo(40)
                                                }
                                                self.view.layoutIfNeeded()
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift
New file
@@ -0,0 +1,17 @@
//
//  ListenFight_Game_CCell.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class ListenFight_Game_CCell: UICollectionViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib
New file
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="_ListenFight_Game_CCell" id="gTV-IL-0wX" customClass="ListenFight_Game_CCell" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
            <autoresizingMask key="autoresizingMask"/>
            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
                <rect key="frame" x="0.0" y="0.0" width="50" height="50"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
            </view>
            <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/>
            <point key="canvasLocation" x="61" y="20"/>
        </collectionViewCell>
    </objects>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift
New file
@@ -0,0 +1,19 @@
//
//  ListenFight_lesson_3_CCell.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/27.
//
import UIKit
import JQTools
class ListenFight_lesson_3_CCell: UICollectionViewCell {
                @IBOutlet weak var img_cover: UIImageView!
                @IBOutlet weak var view_container: UIView!
                override func awakeFromNib() {
        super.awakeFromNib()
                                view_container.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1)
    }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib
New file
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="ListenFight_lesson_3_CCell" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="630" height="554"/>
            <autoresizingMask key="autoresizingMask"/>
            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
                <rect key="frame" x="0.0" y="0.0" width="630" height="554"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vtr-2e-B5C">
                        <rect key="frame" x="0.0" y="33" width="159" height="52"/>
                        <subviews>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7yc-PU-RgV">
                                <rect key="frame" x="104" y="10" width="32" height="32"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_play"/>
                            </button>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9Dc-Ns-SMP">
                                <rect key="frame" x="25" y="12.5" width="27" height="27"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_play_1"/>
                            </button>
                        </subviews>
                        <color key="backgroundColor" red="0.25490196078431371" green="0.63529411764705879" blue="0.92156862745098034" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="9Dc-Ns-SMP" firstAttribute="centerY" secondItem="vtr-2e-B5C" secondAttribute="centerY" id="C8e-Iq-OaB"/>
                            <constraint firstItem="7yc-PU-RgV" firstAttribute="centerY" secondItem="vtr-2e-B5C" secondAttribute="centerY" id="EUe-pu-sAP"/>
                            <constraint firstAttribute="trailing" secondItem="7yc-PU-RgV" secondAttribute="trailing" constant="23" id="Rms-9S-fkG"/>
                            <constraint firstAttribute="height" constant="52" id="Y2Z-EL-K2n"/>
                            <constraint firstAttribute="width" constant="159" id="oI7-Oh-ubD"/>
                            <constraint firstItem="9Dc-Ns-SMP" firstAttribute="leading" secondItem="vtr-2e-B5C" secondAttribute="leading" constant="25" id="xRi-cc-X9V"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="8"/>
                            </userDefinedRuntimeAttribute>
                        </userDefinedRuntimeAttributes>
                    </view>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qxz-6s-e5b">
                        <rect key="frame" x="0.0" y="110" width="630" height="434"/>
                        <subviews>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="n5n-eb-5xI">
                                <rect key="frame" x="5" y="5" width="620" height="424"/>
                                <color key="backgroundColor" red="0.94509803921568625" green="0.94509803921568625" blue="0.94509803921568625" alpha="0.84999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstAttribute="bottom" secondItem="n5n-eb-5xI" secondAttribute="bottom" constant="5" id="ksf-ST-JbM"/>
                            <constraint firstItem="n5n-eb-5xI" firstAttribute="top" secondItem="qxz-6s-e5b" secondAttribute="top" constant="5" id="tyC-6a-6Sp"/>
                            <constraint firstItem="n5n-eb-5xI" firstAttribute="leading" secondItem="qxz-6s-e5b" secondAttribute="leading" constant="5" id="vnP-H4-REp"/>
                            <constraint firstAttribute="trailing" secondItem="n5n-eb-5xI" secondAttribute="trailing" constant="5" id="yjy-hO-zxo"/>
                        </constraints>
                    </view>
                </subviews>
            </view>
            <constraints>
                <constraint firstAttribute="trailing" secondItem="qxz-6s-e5b" secondAttribute="trailing" id="HMD-Sa-FHB"/>
                <constraint firstItem="qxz-6s-e5b" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="SLN-pI-I4q"/>
                <constraint firstItem="vtr-2e-B5C" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="enY-sX-Oib"/>
                <constraint firstItem="qxz-6s-e5b" firstAttribute="top" secondItem="vtr-2e-B5C" secondAttribute="bottom" constant="25" id="iLs-4C-NaW"/>
                <constraint firstItem="vtr-2e-B5C" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="33" id="jbw-ZJ-YrV"/>
                <constraint firstAttribute="bottom" secondItem="qxz-6s-e5b" secondAttribute="bottom" constant="10" id="msT-T9-1c4"/>
            </constraints>
            <size key="customSize" width="630" height="554"/>
            <connections>
                <outlet property="img_cover" destination="n5n-eb-5xI" id="Wk5-s2-MQj"/>
                <outlet property="view_container" destination="qxz-6s-e5b" id="Ikx-kW-UkZ"/>
            </connections>
            <point key="canvasLocation" x="352.6829268292683" y="263.38983050847457"/>
        </collectionViewCell>
    </objects>
    <resources>
        <image name="icon_play" width="32" height="32"/>
        <image name="icon_play_1" width="27" height="27"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.swift
New file
@@ -0,0 +1,21 @@
//
//  ListenFight_lesson_4_CCell.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class ListenFight_lesson_4_CCell: UICollectionViewCell {
                @IBOutlet weak var view_handle: UIView!
                @IBOutlet weak var img_cover: UIImageView!
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var img_state: UIImageView!
                override func awakeFromNib() {
                                super.awakeFromNib()
                                view_container.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1)
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_4_CCell.xib
New file
@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="_ListenFight_lesson_4_CCell" id="gTV-IL-0wX" customClass="ListenFight_lesson_4_CCell" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="597" height="510"/>
            <autoresizingMask key="autoresizingMask"/>
            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
                <rect key="frame" x="0.0" y="0.0" width="597" height="510"/>
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <subviews>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Xjz-V8-keG">
                        <rect key="frame" x="0.0" y="0.0" width="159" height="52"/>
                        <subviews>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LLy-9v-eQJ">
                                <rect key="frame" x="104" y="10" width="32" height="32"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_play"/>
                            </button>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kgj-Ss-D90">
                                <rect key="frame" x="65" y="12.5" width="27" height="27"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_play_1"/>
                            </button>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZuK-r9-26C">
                                <rect key="frame" x="14" y="9.5" width="33" height="33"/>
                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                <state key="normal" image="icon_question"/>
                            </button>
                        </subviews>
                        <color key="backgroundColor" red="0.25490196079999999" green="0.63529411759999999" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="width" constant="159" id="7Mr-KM-NTE"/>
                            <constraint firstAttribute="trailing" secondItem="LLy-9v-eQJ" secondAttribute="trailing" constant="23" id="9dR-Nl-sPa"/>
                            <constraint firstItem="ZuK-r9-26C" firstAttribute="centerY" secondItem="Xjz-V8-keG" secondAttribute="centerY" id="Erm-17-erv"/>
                            <constraint firstItem="LLy-9v-eQJ" firstAttribute="centerY" secondItem="Xjz-V8-keG" secondAttribute="centerY" id="FB0-fx-81Z"/>
                            <constraint firstItem="LLy-9v-eQJ" firstAttribute="leading" secondItem="kgj-Ss-D90" secondAttribute="trailing" constant="12" id="MoJ-Ne-mlq"/>
                            <constraint firstAttribute="height" constant="52" id="gfp-ph-1NP"/>
                            <constraint firstItem="kgj-Ss-D90" firstAttribute="leading" secondItem="ZuK-r9-26C" secondAttribute="trailing" constant="18" id="qM1-Yp-Nha"/>
                            <constraint firstItem="kgj-Ss-D90" firstAttribute="centerY" secondItem="Xjz-V8-keG" secondAttribute="centerY" id="zxl-IP-PhN"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                            <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                <real key="value" value="8"/>
                            </userDefinedRuntimeAttribute>
                        </userDefinedRuntimeAttributes>
                    </view>
                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OJ6-0b-fVC">
                        <rect key="frame" x="0.0" y="77" width="597" height="423"/>
                        <subviews>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="XW5-ds-CXG">
                                <rect key="frame" x="5" y="5" width="587" height="413"/>
                                <color key="backgroundColor" red="0.94509803920000002" green="0.94509803920000002" blue="0.94509803920000002" alpha="0.84999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                            </imageView>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_success" translatesAutoresizingMaskIntoConstraints="NO" id="eyJ-Qy-E0w">
                                <rect key="frame" x="258.5" y="171" width="80" height="81"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstItem="eyJ-Qy-E0w" firstAttribute="centerY" secondItem="XW5-ds-CXG" secondAttribute="centerY" id="Ik1-E3-TsU"/>
                            <constraint firstItem="eyJ-Qy-E0w" firstAttribute="centerX" secondItem="XW5-ds-CXG" secondAttribute="centerX" id="dXx-99-JQ1"/>
                            <constraint firstItem="XW5-ds-CXG" firstAttribute="leading" secondItem="OJ6-0b-fVC" secondAttribute="leading" constant="5" id="dvd-Mt-moN"/>
                            <constraint firstAttribute="bottom" secondItem="XW5-ds-CXG" secondAttribute="bottom" constant="5" id="hB3-8N-tDw"/>
                            <constraint firstItem="XW5-ds-CXG" firstAttribute="top" secondItem="OJ6-0b-fVC" secondAttribute="top" constant="5" id="hyd-FZ-pb6"/>
                            <constraint firstAttribute="trailing" secondItem="XW5-ds-CXG" secondAttribute="trailing" constant="5" id="iFL-yH-aeG"/>
                        </constraints>
                    </view>
                </subviews>
            </view>
            <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/>
            <constraints>
                <constraint firstItem="Xjz-V8-keG" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="3SB-P6-hOR"/>
                <constraint firstItem="Xjz-V8-keG" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="5Iq-AY-uUK"/>
                <constraint firstItem="OJ6-0b-fVC" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="6p8-30-BD6"/>
                <constraint firstAttribute="trailing" secondItem="OJ6-0b-fVC" secondAttribute="trailing" id="EAu-4C-peY"/>
                <constraint firstItem="OJ6-0b-fVC" firstAttribute="top" secondItem="Xjz-V8-keG" secondAttribute="bottom" constant="25" id="YpO-u8-Uyg"/>
                <constraint firstAttribute="bottom" secondItem="OJ6-0b-fVC" secondAttribute="bottom" constant="10" id="m6e-nJ-ukf"/>
            </constraints>
            <size key="customSize" width="597" height="510"/>
            <connections>
                <outlet property="img_cover" destination="XW5-ds-CXG" id="yuo-h2-TG8"/>
                <outlet property="img_state" destination="eyJ-Qy-E0w" id="6YM-Di-5yt"/>
                <outlet property="view_container" destination="OJ6-0b-fVC" id="4Y2-jo-yTH"/>
                <outlet property="view_handle" destination="Xjz-V8-keG" id="XGi-ed-WJo"/>
            </connections>
            <point key="canvasLocation" x="339.8780487804878" y="136.77966101694915"/>
        </collectionViewCell>
    </objects>
    <resources>
        <image name="icon_play" width="32" height="32"/>
        <image name="icon_play_1" width="27" height="27"/>
        <image name="icon_question" width="33" height="33"/>
        <image name="icon_success" width="80" height="81"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.swift
@@ -8,7 +8,8 @@
import UIKit
class HomeListen_item_TCell: UITableViewCell {
                @IBOutlet weak var label_title: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
                                backgroundColor = .clear
DolphinEnglishLearnStudent/Moudle/Home/Listen/TCell/HomeListen_item_TCell.xib
@@ -138,6 +138,9 @@
                    <constraint firstAttribute="trailing" secondItem="Guy-ui-ByM" secondAttribute="trailing" id="Z4n-MP-9SL"/>
                </constraints>
            </tableViewCellContentView>
            <connections>
                <outlet property="label_title" destination="28J-ZC-IiE" id="kDk-K7-10L"/>
            </connections>
            <point key="canvasLocation" x="282.80487804878049" y="47.033898305084747"/>
        </tableViewCell>
    </objects>
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -14,6 +14,11 @@
enum ListenType{
                case lesson1 //自主学习-听音选图
                case lesson2 //自主学习-看图选音
                case lesson3 //自主学习-归纳排除
                case lesson4 //自主学习-有问有答
                case lesson5 //自主学习-音图相配
                case game1 //游戏类型-超级听力
                case game2 //游戏类型-超级记忆
}
class HomeListenFightViewModel{
@@ -86,6 +91,13 @@
                                btn_exit.addTarget(self, action: #selector(quitAction), for: .touchUpInside)
                                btn_forward.addTarget(self, action: #selector(beforeAction), for: .touchUpInside)
                                if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                                                btn_forward.isHidden = true
                                                label_pageNum.isHidden = true
                                }
    }
                override func setUI() {
@@ -97,7 +109,11 @@
                                pageVC.view.snp.makeConstraints { make in
                                                make.left.right.equalToSuperview()
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top)
                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-32)
                                                if self.viewModel.listenType.value == .lesson3 || self.viewModel.listenType.value == .lesson4{
                                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-18)
                                                }else{
                                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-32)
                                                }
                                }
                }
@@ -187,6 +203,32 @@
                                                return vc
                                }
                                if viewModel.listenType.value == .lesson3{
                                                let vc = HomeListenFight_lesson_3_VC()
                                                return vc
                                }
                                if viewModel.listenType.value == .lesson4{
                                                let vc = HomeListenFight_lesson_4_VC()
                                                return vc
                                }
                                if viewModel.listenType.value == .lesson5{
                                                let vc = HomeListenFight_lesson_5_VC()
                                                return vc
                                }
                                if viewModel.listenType.value == .game1{
                                                let vc = HomeListenGame_1_VC()
                                                return vc
                                }
                                if viewModel.listenType.value == .game2{
                                                let vc = HomeListenGame_2_VC()
                                                return vc
                                }
                                let vc = UIViewController()
                                return vc
                }
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
New file
@@ -0,0 +1,212 @@
//
//  HomeListenFight_lesson_3_VC.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/27.
//
import UIKit
class HomeListenFight_lesson_3_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                private lazy var collectionView:UICollectionView = {
                                let flowLayout = UICollectionViewFlowLayout()
                                let w = (JQ_ScreenW - 97 - 54 - 36) / 3.0
                                flowLayout.itemSize = CGSize(width: w, height: w * 0.947)
                                flowLayout.minimumInteritemSpacing = 18
                                flowLayout.scrollDirection = .vertical
                                let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
                                collection.register(UINib(nibName: "ListenFight_lesson_3_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_3_CCell")
                                collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
                                return collection
                }()
                private lazy var stackView:UIStackView = {
                                let sta = UIStackView()
                                sta.spacing = 5
                                sta.distribution = .equalSpacing
                                sta.axis = .horizontal
                                return sta
                }()
                override func viewDidLoad() {
                                super.viewDidLoad()
                                navigationItem.titleView = UIView()
                                viewModel.selectIndex.accept(IndexPath(row: 0, section: 0))
                }
                override func setUI() {
                                super.setUI()
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.showsVerticalScrollIndicator = false
                                collectionView.backgroundColor = .clear
                                view.addSubview(collectionView)
                                collectionView.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
                                                make.left.equalTo(97)
                                                make.right.equalTo(-54)
                                                make.bottom.equalToSuperview()
                                }
                }
                private func answerSuccess(_ cell:ListenFight_lesson_1_CCell,index:Int){
                }
                private func resetStackView(){
                }
                override func setRx() {
                                viewModel.selectIndex.subscribe(onNext: {[weak self] index in
                                                guard let index = index else { return }
                                                //判断选中是否正确逻辑
                                                if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: index) as? ListenFight_lesson_1_CCell{
                                                                var answerType:Fight_lessonType = .none
                                                                answerType = .success
                                                                switch answerType {
                                                                                case .success:
                                                                                                self?.viewModel.answerType.accept(.success)
                                                                                case .fail:
                                                                                                self?.viewModel.answerType.accept(.fail)
                                                                                default:break
                                                                }
                                                }
                                }).disposed(by: disposeBag)
                }
                private func setAnswerStackView(){
                                for subView in stackView.arrangedSubviews{
                                                subView.removeFromSuperview()
                                }
                                view.addSubview(stackView)
                                stackView.snp.makeConstraints { make in
                                                make.right.equalToSuperview().offset(-82)
                                                make.centerY.equalToSuperview()
                                                make.height.equalTo(52)
                                }
                                for i in 0...2{
                                                let answerView = Lesson_3_AnswerView.jq_loadNibView()
                                                answerView.alpha = 0
                                                answerView.btn_choose.addTarget(self, action: #selector(chooseAnswerAction), for: .touchUpInside)
                                                answerView.btn_fullscreen.addTarget(self, action: #selector(fullscreenAction), for: .touchUpInside)
                                                answerView.btn_choose.tag = 10+i
                                                answerView.btn_fullscreen.tag = 20+i
                                                answerView.snp.makeConstraints { make in
                                                                make.width.equalTo(85)
                                                                make.height.equalTo(52)
                                                }
                                                UIView.animate(withDuration: 0.05 + Double(i)) {
                                                                answerView.alpha = 1
                                                }
                                                stackView.insertArrangedSubview(answerView, at: 0)
                                }
                }
                @objc private func chooseAnswerAction(btn:UIButton){
                                let index = btn.tag - 10
                                var subV:Lesson_3_AnswerView?
                                for (i,v) in stackView.arrangedSubviews.reversed().enumerated(){
                                                if index == i{subV = v as? Lesson_3_AnswerView;break}
                                }
                                var answerType:Fight_lessonType = .none
                                answerType = .success
                                switch answerType {
                                                case .success:
                                                                viewModel.answerType.accept(.success)
                                                                let copyViewFrame = subV?.convert(subV!.bounds, to: self.view)
                                                                let copyView = subV?.copyView()
                                                                copyView?.frame = copyViewFrame!
                                                                copyView?.backgroundColor = .red
                                                                self.view.addSubview(copyView!)
                                                                copyView?.layoutIfNeeded()
                                                                if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: viewModel.selectIndex.value!) as? ListenFight_lesson_3_CCell{
                                                                                cell.layoutIfNeeded()
                                                                                var newFrame = cell.img_cover.convert(cell.img_cover.bounds, to: self.view)
                                                                                copyView?.img_cover.image = cell.img_cover.image
                                                                                newFrame.origin.x += 97
                                                                                newFrame.origin.y += (JQ_NavBarHeight - 15)
                                                                                UIView.animate(withDuration: 0.4) {
                                                                                                copyView?.frame = newFrame
                                                                                } completion: { _ in
                                                                                                for subView in self.stackView.arrangedSubviews{
                                                                                                                subView.removeFromSuperview()
                                                                                                }
                                                                                }
                                                                }
                                                case .fail:
                                                                viewModel.answerType.accept(.fail)
                                                                UIView.animate(withDuration: 0.4) {
                                                                                subV?.img_state.alpha = 1
                                                                                subV?.btn_fullscreen.alpha = 0
                                                                }completion: { _ in
                                                                                DispatchQueue.main.asyncAfter(deadline: .now()+1.5) {
                                                                                                self.setAnswerStackView()
                                                                                }
                                                                }
                                                default:break
                                }
                }
                @objc private func fullscreenAction(btn:UIButton){
                                print("全屏:\(btn.tag)")
                }
}
extension HomeListenFight_lesson_3_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                                setAnswerStackView()
                }
}
extension HomeListenFight_lesson_3_VC:UICollectionViewDelegateFlowLayout{
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                                if section == 0{
                                                return CGSize.zero
                                }
                                return CGSizeMake(JQ_ScreenW, 100)
                }
}
extension HomeListenFight_lesson_3_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: indexPath) as! ListenFight_lesson_3_CCell
                                cell.backgroundColor = .clear
                                cell.contentView.backgroundColor = .clear
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
                                let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
                                return reusableView
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 3
                }
                func numberOfSections(in collectionView: UICollectionView) -> Int {
                                return 2
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
New file
@@ -0,0 +1,201 @@
//
//  HomeListenFight_lesson_4_VC.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class HomeListenFight_lesson_4_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                private lazy var stackView:UIStackView = {
                                let sta = UIStackView()
                                sta.spacing = 41
                                sta.distribution = .equalSpacing
                                sta.axis = .vertical
                                return sta
                }()
                private lazy var collectionView:UICollectionView = {
                                let flowLayout = UICollectionViewFlowLayout()
                                let w = (JQ_ScreenW - 164 * 2 - 62) / 2.0
                                flowLayout.itemSize = CGSize(width: w, height: w * 0.842)
                                flowLayout.minimumInteritemSpacing = 0
                                flowLayout.scrollDirection = .vertical
                                let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
                                collection.contentInset = UIEdgeInsets(top: 33, left: 0, bottom: 0, right: 0)
                                collection.register(UINib(nibName: "ListenFight_lesson_4_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_4_CCell")
                                collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
                                return collection
                }()
    override func viewDidLoad() {
        super.viewDidLoad()
    }
                override func setUI() {
                                super.setUI()
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.showsVerticalScrollIndicator = false
                                collectionView.backgroundColor = .clear
                                view.addSubview(collectionView)
                                collectionView.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
                                                make.left.equalTo(164)
                                                make.width.equalTo(JQ_ScreenW - 164 * 2)
                                                make.bottom.equalToSuperview()
                                }
                }
                private func setAnswerStackView(){
                                for subView in stackView.arrangedSubviews{
                                                subView.removeFromSuperview()
                                }
                                if !view.subviews.contains(stackView){
                                                view.addSubview(stackView)
                                                stackView.snp.makeConstraints { make in
                                                                make.right.equalToSuperview().offset(-14)
                                                                make.centerY.equalToSuperview()
                                                }
                                }
                                for i in 0...2{
                                                let answerView = Lesson_4_AnswerView.jq_loadNibView()
                                                answerView.btn_choose.tag = 10 + i
                                                answerView.btn_choose.addTarget(self, action: #selector(answerAction), for: .touchUpInside)
                                                answerView.alpha = 0
                                                answerView.snp.makeConstraints { make in
                                                                make.width.equalTo(221)
                                                                make.height.equalTo(52)
                                                }
                                                UIView.animate(withDuration: 0.05 + Double(i)) {
                                                                answerView.alpha = 1
                                                }
                                                stackView.insertArrangedSubview(answerView, at: 0)
                                }
                }
                @objc func answerAction(btn:UIButton){
                                var tempSubV:Lesson_4_AnswerView?
                                for subV in stackView.arrangedSubviews{
                                                if let s = subV as? Lesson_4_AnswerView{
                                                                s.btn_choose.isSelected = btn.tag == s.btn_choose.tag
                                                                if s.btn_choose.isSelected{tempSubV = s}
                                                }
                                }
                                var answerType:Fight_lessonType = .none
                                answerType = .success
                                switch answerType {
                                                case .success:
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.4) {
                                                                                if let copyView = tempSubV?.copyView(){
                                                                                                tempSubV?.alpha = 0
                                                                                                let newRect = tempSubV!.view_handle.convert(tempSubV!.bounds, to: self.view)
                                                                                                copyView.frame = CGRect(origin: newRect.origin, size: CGSize(width: 152, height: 52))
                                                                                                copyView.view_state.isHidden = true
                                                                                                self.view.addSubview(copyView)
                                                                                                self.view.layoutIfNeeded()
                                                                                                //获取Cell的顶部试图
                                                                                                if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: self.viewModel.selectIndex.value!) as? ListenFight_lesson_4_CCell{
                                                                                                                var newRect1 = cell.convert(cell.bounds, to: self.collectionView)
                                                                                                                newRect1.origin.x += 76
                                                                                                                newRect1.origin.y += 33
                                                                                                                self.collectionView.reloadData()
                                                                                                                UIView.animate(withDuration: 0.4) {
                                                                                                                                copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: 152, height: 52))
                                                                                                                } completion: { _ in
                                                                                                                                self.setAnswerStackView()
                                                                                                                }
                                                                                                }
                                                                                }
                                                                }
                                                case .fail:
                                                                UIView.animate(withDuration: 0.4) {
                                                                                tempSubV?.img_state.alpha = 1
                                                                }completion: { _ in
                                                                                DispatchQueue.main.asyncAfter(deadline: .now()+3) {
                                                                                                self.setAnswerStackView()
                                                                                }
                                                                }
                                                case .none:
                                                                break
                                }
                }
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                                UIView.animate(withDuration: 0.5) {
                                                self.collectionView.snp.remakeConstraints { make in
                                                                make.left.equalTo(76)
                                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(0)
                                                                make.width.equalTo(JQ_ScreenW - 164 * 2)
                                                                make.bottom.equalToSuperview()
                                                }
                                                self.view.layoutIfNeeded()
                                }
                                self.setAnswerStackView()
                }
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDelegateFlowLayout{
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                                return CGSize.zero
                }
}
extension HomeListenFight_lesson_4_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_4_CCell", for: indexPath) as! ListenFight_lesson_4_CCell
                                cell.backgroundColor = .clear
                                cell.contentView.backgroundColor = .clear
                                if indexPath == viewModel.selectIndex.value{
                                                UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.4,options: .layoutSubviews) {
                                                                cell.img_state.alpha = 1
                                                                cell.img_state.transform = .init(scaleX: 1.0, y: 1.0)
                                                }
                                }else{
                                                cell.img_state.alpha = 0
                                                cell.img_state.transform = .init(scaleX: 0.1, y: 0.1)
                                }
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
                                let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
                                return reusableView
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 2
                }
                func numberOfSections(in collectionView: UICollectionView) -> Int {
                                return 2
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift
New file
@@ -0,0 +1,173 @@
//
//  HomeListenFight_lesson_5_VC.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class HomeListenFight_lesson_5_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                private lazy var collectionView:UICollectionView = {
                                let flowLayout = UICollectionViewFlowLayout()
                                let w = (JQ_ScreenW - 189 * 2 - 18) / 2.0
                                flowLayout.itemSize = CGSize(width: w, height: w * 0.75)
                                flowLayout.minimumInteritemSpacing = 15
                                flowLayout.minimumLineSpacing = 15
                                flowLayout.scrollDirection = .vertical
                                let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
                                collection.register(UINib(nibName: "ListenFight_lesson_1_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_lesson_1_CCell")
                                collection.register(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "header")
                                return collection
                }()
                private lazy var stackView:UIStackView = {
                                let sta = UIStackView()
                                sta.spacing = 89
                                sta.distribution = .equalSpacing
                                sta.axis = .horizontal
                                return sta
                }()
                override func viewDidLoad() {
                                super.viewDidLoad()
                }
                override func setUI() {
                                super.setUI()
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.showsVerticalScrollIndicator = false
                                collectionView.backgroundColor = .clear
                                view.addSubview(collectionView)
                                collectionView.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(89)
                                                make.left.equalTo(189)
                                                make.width.equalTo(JQ_ScreenW - 189 * 2)
                                                make.bottom.equalToSuperview()
                                }
                                view.addSubview(stackView)
                                stackView.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(19)
                                                make.centerX.equalToSuperview()
                                                make.height.equalTo(52)
                                }
                                setAnswerStackView()
                }
                private func setAnswerStackView(){
                                for subView in stackView.arrangedSubviews{
                                                subView.removeFromSuperview()
                                }
                                if !view.subviews.contains(stackView){
                                                view.addSubview(stackView)
                                                stackView.snp.makeConstraints { make in
                                                                make.right.equalToSuperview().offset(-14)
                                                                make.centerY.equalToSuperview()
                                                }
                                }
                                for i in 0...3{
                                                let answerView = StudyHandleView.jq_loadNibView()
                                                answerView.view_choose.isHidden = true
                                                answerView.snp.makeConstraints { make in
                                                                make.width.equalTo(159)
                                                                make.height.equalTo(52)
                                                }
                                                UIView.animate(withDuration: 0.05 + Double(i)) {
                                                                answerView.alpha = 1
                                                }
                                                stackView.insertArrangedSubview(answerView, at: 0)
                                }
                }
}
extension HomeListenFight_lesson_5_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                                var answerType:Fight_lessonType = .none
                                answerType = .success
                                let tempSubV = stackView.arrangedSubviews[indexPath.row] as! StudyHandleView
                                switch answerType {
                                                case .success:
                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.4) {
                                                                                let copyView = tempSubV.copyView()
                                                                                copyView.view_choose.isHidden = true
                                                                                tempSubV.alpha = 0
                                                                                let newRect = tempSubV.convert(tempSubV.bounds, to: self.view)
                                                                                copyView.frame = CGRect(origin: newRect.origin, size: CGSize(width: 159, height: 52))
                                                                                self.view.addSubview(copyView)
                                                                                //获取Cell的顶部试图
                                                                                let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
                                                                                if let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: self.viewModel.selectIndex.value!) as? ListenFight_lesson_1_CCell{
                                                                                                var newRect1 = cell.convert(cell.bounds, to: self.collectionView)
                                                                                                newRect1.origin.x += (collectionView.frame.origin.x + 5)
                                                                                                newRect1.origin.y += 94
                                                                                                UIView.animateKeyframes(withDuration: 0.4, delay: 0,options: .calculationModeLinear) {
                                                                                                                copyView.frame = CGRect(origin: newRect1.origin, size: CGSize(width: flowLayout.itemSize.width - 10 , height: 40))
                                                                                                }completion: { _ in
                                                                                                }
                                                                                }
                                                                }
                                                case .fail:
                                                                collectionView.reloadData()
                                                case .none:
                                                                break
                                }
                }
}
extension HomeListenFight_lesson_5_VC:UICollectionViewDelegateFlowLayout{
                func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                                return CGSize.zero
                }
}
extension HomeListenFight_lesson_5_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_1_CCell", for: indexPath) as! ListenFight_lesson_1_CCell
                                cell.jq_addShadows(shadowColor: .black.withAlphaComponent(0.31), corner: 8, radius: 3, offset: CGSize(width: 0, height: 1), opacity: 1)
                                if viewModel.selectIndex.value == indexPath{
                                                cell.setState(state: .success)
                                }else{
                                                cell.setState(state: .none)
                                }
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
                                let reusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath)
                                return reusableView
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 4
                }
                func numberOfSections(in collectionView: UICollectionView) -> Int {
                                return 1
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
New file
@@ -0,0 +1,72 @@
//
//  HomeListenGame_1_VC.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class HomeListenGame_1_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                private lazy var collectionView:UICollectionView = {
                                let flowLayout = UICollectionViewFlowLayout()
                                let w = (JQ_ScreenW - 35 * 2 - 12) / 4.0
                                flowLayout.itemSize = CGSize(width: w, height: w * 0.73)
                                flowLayout.minimumInteritemSpacing = 3
                                flowLayout.minimumLineSpacing = 13
                                flowLayout.scrollDirection = .vertical
                                let collection = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
                                collection.contentInset = UIEdgeInsets(top: 0, left: 35, bottom: 0, right: 35)
                                collection.register(UINib(nibName: "ListenFight_Game_CCell", bundle: nil), forCellWithReuseIdentifier: "_ListenFight_Game_CCell")
                                return collection
                }()
    override func viewDidLoad() {
        super.viewDidLoad()
                                ChooseLevelView.show { level in
                                                GameBeginTipView.show {
                                                }
                                }
    }
                override func setUI() {
                                super.setUI()
                                collectionView.delegate = self
                                collectionView.dataSource = self
                                collectionView.showsVerticalScrollIndicator = false
                                collectionView.backgroundColor = .clear
                                view.addSubview(collectionView)
                                collectionView.snp.makeConstraints { make in
                                                make.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(99)
                                                make.left.right.equalToSuperview()
                                                make.bottom.equalToSuperview()
                                }
                }
}
extension HomeListenGame_1_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                }
}
extension HomeListenGame_1_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_Game_CCell", for: indexPath) as! ListenFight_Game_CCell
                                cell.backgroundColor = .jq_randomColor
                                cell.contentView.backgroundColor = .jq_randomColor
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 12
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift
New file
@@ -0,0 +1,19 @@
//
//  HomeListenGame_2_VC.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
class HomeListenGame_2_VC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift
@@ -53,6 +53,25 @@
                                                if indexPath.row == 1{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson2))
                                                }
                                                if indexPath.row == 2{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson3))
                                                }
                                                if indexPath.row == 3{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson4))
                                                }
                                                if indexPath.row == 4{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .lesson5))
                                                }
                                                if indexPath.row == 5{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game1))
                                                }
                                                if indexPath.row == 6{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game2))
                                                }
                                }
                }
}
@@ -62,11 +81,11 @@
                                if section == 0{
                                                return 1
                                }
                                return 5
                                return 8
                }
                func numberOfSections(in tableView: UITableView) -> Int {
                                if page <= 5{
                                if page <= 6{
                                                return 2
                                }
                                return 1
@@ -78,6 +97,7 @@
                                                return cell
                                }else{
                                                let cell = tableView.dequeueReusableCell(withIdentifier: "_HomeListen_item_TCell", for: indexPath) as! HomeListen_item_TCell
                                                cell.label_title.text = "\(indexPath.row + 1)"
                                                return cell
                                }
                }
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift
@@ -12,7 +12,7 @@
class HomeListenVC: BaseVC {
                //限制后面的点击:天数(1开始)
                private var limitDay = 5
                private var limitDay = 7
                private lazy var menu:SPPageMenu = {
                                let menu = SPPageMenu(frame: .zero, trackerStyle: .line)
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift
New file
@@ -0,0 +1,66 @@
//
//  ChooseLevelView.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
import JQTools
import QMUIKit
class ChooseLevelView: UIView,JQNibView{
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var tackView_level: UIStackView!
                private var clouseLevel:((Int)->Void)!
                private var level:Int = 1
                override func awakeFromNib() {
                                super.awakeFromNib()
                                alpha = 0
                                transform = .init(scaleX: 0.1, y: 0.1)
                                layoutIfNeeded()
                }
                static func show(clouse:@escaping (Int)->Void){
                                let levelView = ChooseLevelView.jq_loadNibView()
                                levelView.clouseLevel = clouse
                                sceneDelegate?.window?.addSubview(levelView)
                                levelView.frame = sceneDelegate?.window?.frame ?? .zero
                                UIView.animate(withDuration: 0.4) {
                                                levelView.transform = .init(scaleX: 1.0, y: 1.0)
                                                levelView.alpha = 1
                                } completion: { _ in
                                }
                }
                @IBAction func chooseAction(_ sender: QMUIButton) {
                                level = sender.tag - 9
                                for subView in tackView_level.arrangedSubviews as! [QMUIButton]{
                                                subView.isSelected = sender.tag == subView.tag
                                }
                }
                @IBAction func closeAction(_ sender: UIButton) {
                                UIView.animate(withDuration: 0.4) {
                                                self.transform = .init(scaleX: 0.1, y: 0.1)
                                                self.alpha = 0
                                } completion: { _ in
                                                self.removeFromSuperview()
                                }
                }
                @IBAction func completeAction(_ sender: UIButton) {
                                UIView.animate(withDuration: 0.4) {
                                                self.transform = .init(scaleX: 0.1, y: 0.1)
                                                self.alpha = 0
                                } completion: { _ in
                                                self.removeFromSuperview()
                                                self.clouseLevel(self.level)
                                }
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.xib
New file
@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ChooseLevelView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="820" height="1180"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="x4l-72-4Ul">
                    <rect key="frame" x="206" y="469.5" width="408" height="245"/>
                    <subviews>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="提示" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HNc-nA-rkX">
                            <rect key="frame" x="185.5" y="32" width="37" height="18"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="18" id="rha-Hn-Pf2"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="请选择难度:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SZ9-8L-wUx">
                            <rect key="frame" x="47" y="96" width="90" height="19.5"/>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.81000000000000005" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="5Gu-z5-bpP">
                            <rect key="frame" x="145" y="95.5" width="224" height="21"/>
                            <subviews>
                                <button opaque="NO" tag="10" contentMode="scaleToFill" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="90w-7c-Frs" customClass="QMUIButton">
                                    <rect key="frame" x="0.0" y="0.0" width="64" height="21"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="入门级" image="btn_radio_u_cir">
                                        <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                    <state key="selected" image="btn_radio_cir"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="number" keyPath="spacingBetweenImageAndTitle">
                                            <real key="value" value="7"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="chooseAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="3VF-Iw-62q"/>
                                    </connections>
                                </button>
                                <button opaque="NO" tag="11" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GxK-lP-67f" customClass="QMUIButton">
                                    <rect key="frame" x="80" y="0.0" width="64" height="21"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="中级" image="btn_radio_u_cir">
                                        <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                    <state key="selected" image="btn_radio_cir"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="number" keyPath="spacingBetweenImageAndTitle">
                                            <real key="value" value="7"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="chooseAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="qgs-B5-ekd"/>
                                    </connections>
                                </button>
                                <button opaque="NO" tag="12" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JeY-VZ-dhW" customClass="QMUIButton">
                                    <rect key="frame" x="160" y="0.0" width="64" height="21"/>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="高级" image="btn_radio_u_cir">
                                        <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
                                    </state>
                                    <state key="selected" image="btn_radio_cir"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="number" keyPath="spacingBetweenImageAndTitle">
                                            <real key="value" value="7"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="chooseAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="eeg-bM-Nja"/>
                                    </connections>
                                </button>
                            </subviews>
                        </stackView>
                        <stackView opaque="NO" contentMode="scaleToFill" spacing="27" translatesAutoresizingMaskIntoConstraints="NO" id="Wkm-Kk-HI1">
                            <rect key="frame" x="66.5" y="179" width="275" height="40"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CV9-Xp-hsa">
                                    <rect key="frame" x="0.0" y="0.0" width="124" height="40"/>
                                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                    <constraints>
                                        <constraint firstAttribute="width" constant="124" id="Czz-hv-Fc1"/>
                                        <constraint firstAttribute="height" constant="40" id="wSs-0H-v3Q"/>
                                    </constraints>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="关闭">
                                        <color key="titleColor" red="0.31764705879999999" green="0.66666666669999997" blue="0.92941176469999998" alpha="1" colorSpace="calibratedRGB"/>
                                    </state>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                            <real key="value" value="4"/>
                                        </userDefinedRuntimeAttribute>
                                        <userDefinedRuntimeAttribute type="color" keyPath="ld_borderColorXIB">
                                            <color key="value" red="0.31764705879999999" green="0.66666666669999997" blue="0.92941176469999998" alpha="1" colorSpace="calibratedRGB"/>
                                        </userDefinedRuntimeAttribute>
                                        <userDefinedRuntimeAttribute type="number" keyPath="ld_borderWidthXIB">
                                            <real key="value" value="1"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="closeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="NAe-Wr-co7"/>
                                    </connections>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="jOc-UA-Yvr">
                                    <rect key="frame" x="151" y="0.0" width="124" height="40"/>
                                    <color key="backgroundColor" red="0.31764705879999999" green="0.66666666669999997" blue="0.92941176469999998" alpha="1" colorSpace="calibratedRGB"/>
                                    <constraints>
                                        <constraint firstAttribute="height" constant="40" id="3Z5-80-z2X"/>
                                        <constraint firstAttribute="width" constant="124" id="EST-fQ-jxE"/>
                                    </constraints>
                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" title="确认"/>
                                    <userDefinedRuntimeAttributes>
                                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                            <real key="value" value="4"/>
                                        </userDefinedRuntimeAttribute>
                                    </userDefinedRuntimeAttributes>
                                    <connections>
                                        <action selector="completeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Xu6-7d-ghE"/>
                                    </connections>
                                </button>
                            </subviews>
                        </stackView>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstAttribute="width" secondItem="x4l-72-4Ul" secondAttribute="height" multiplier="1:0.6" id="5H7-3R-Ce4"/>
                        <constraint firstAttribute="bottom" secondItem="Wkm-Kk-HI1" secondAttribute="bottom" constant="26" id="HBo-2R-Igz"/>
                        <constraint firstItem="SZ9-8L-wUx" firstAttribute="leading" secondItem="x4l-72-4Ul" secondAttribute="leading" constant="47" id="WrE-t4-mO9"/>
                        <constraint firstItem="HNc-nA-rkX" firstAttribute="top" secondItem="x4l-72-4Ul" secondAttribute="top" constant="32" id="Yux-eq-vs6"/>
                        <constraint firstItem="Wkm-Kk-HI1" firstAttribute="centerX" secondItem="x4l-72-4Ul" secondAttribute="centerX" id="gzz-BE-KXu"/>
                        <constraint firstItem="SZ9-8L-wUx" firstAttribute="top" secondItem="x4l-72-4Ul" secondAttribute="top" constant="96" id="kED-7u-3TD"/>
                        <constraint firstItem="HNc-nA-rkX" firstAttribute="centerX" secondItem="x4l-72-4Ul" secondAttribute="centerX" id="rh3-JQ-Fem"/>
                        <constraint firstItem="5Gu-z5-bpP" firstAttribute="leading" secondItem="SZ9-8L-wUx" secondAttribute="trailing" constant="8" id="tfL-t0-6rJ"/>
                        <constraint firstItem="5Gu-z5-bpP" firstAttribute="centerY" secondItem="SZ9-8L-wUx" secondAttribute="centerY" id="twO-ly-hUx"/>
                        <constraint firstAttribute="height" constant="245" id="uGV-vZ-dDD"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="10"/>
                        </userDefinedRuntimeAttribute>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                    </userDefinedRuntimeAttributes>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="sRGB"/>
            <constraints>
                <constraint firstItem="x4l-72-4Ul" firstAttribute="centerX" secondItem="vUN-kp-3ea" secondAttribute="centerX" id="qUX-A9-fAd"/>
                <constraint firstItem="x4l-72-4Ul" firstAttribute="centerY" secondItem="vUN-kp-3ea" secondAttribute="centerY" id="vBn-p9-1pN"/>
            </constraints>
            <connections>
                <outlet property="tackView_level" destination="5Gu-z5-bpP" id="mpe-aW-FdQ"/>
                <outlet property="view_container" destination="x4l-72-4Ul" id="twD-2O-23d"/>
            </connections>
            <point key="canvasLocation" x="61" y="20"/>
        </view>
    </objects>
    <resources>
        <image name="btn_radio_cir" width="21" height="21"/>
        <image name="btn_radio_u_cir" width="21" height="20"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.swift
New file
@@ -0,0 +1,88 @@
//
//  GameBeginTipView.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
import JQTools
import QMUIKit
class GameBeginTipView: UIView,JQNibView{
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var label_time: UILabel!
                private var completeClouse:(()->Void)!
                override func awakeFromNib() {
                                super.awakeFromNib()
                                alpha = 0
                                transform = .init(scaleX: 0.1, y: 0.1)
                                layoutIfNeeded()
                }
                static func show(clouse:@escaping ()->Void){
                                let levelView = GameBeginTipView.jq_loadNibView()
                                levelView.completeClouse = clouse
                                sceneDelegate?.window?.addSubview(levelView)
                                levelView.frame = sceneDelegate?.window?.frame ?? .zero
                                UIView.animate(withDuration: 0.4) {
                                                levelView.transform = .init(scaleX: 1.0, y: 1.0)
                                                levelView.alpha = 1
                                } completion: { _ in
                                                levelView.layoutIfNeeded()
                                                var time:Int = 5
                                                Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
                                                                time -= 1
                                                                levelView.label_time.text = "\(time)"
                                                                levelView.animation()
                                                                if time <= 0{
                                                                                timer.invalidate()
                                                                                UIView.animate(withDuration: 0.4) {
                                                                                                levelView.transform = .init(scaleX: 0.1, y: 0.1)
                                                                                                levelView.alpha = 0
                                                                                } completion: { _ in
                                                                                                levelView.removeFromSuperview()
                                                                                                levelView.completeClouse()
                                                                                }
                                                                }
                                                }
                                }
                }
                private func animation(){
                                let aniLabel = label_time.customCopy()
                                aniLabel.frame = label_time.frame
                                self.view_container.addSubview(aniLabel)
                                UIView.animate(withDuration: 1.0) {
                                                aniLabel.alpha = 0
                                                aniLabel.transform = .init(scaleX: 2.5, y: 2.5)
                                }completion: { _ in
                                                aniLabel.removeFromSuperview()
                                }
                }
                @IBAction func completeAction(_ sender: UIButton) {
                                UIView.animate(withDuration: 0.4) {
                                                self.transform = .init(scaleX: 0.1, y: 0.1)
                                                self.alpha = 0
                                } completion: { _ in
                                                self.removeFromSuperview()
                                                self.completeClouse()
                                }
                }
}
private extension UILabel{
                func customCopy()->UILabel{
                                let copyLabel = UILabel()
                                copyLabel.font = self.font
                                copyLabel.alpha = 1
                                copyLabel.text = self.text
                                copyLabel.textColor = self.textColor
                                copyLabel.textAlignment = .center
                                return copyLabel
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.xib
New file
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="landscape" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GameBeginTipView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="1180" height="820"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="V8a-Jc-oJ6">
                    <rect key="frame" x="385.5" y="289.5" width="409" height="245"/>
                    <subviews>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="提示" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rb4-KR-EuP">
                            <rect key="frame" x="186" y="32" width="37" height="18"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="18" id="boa-7C-lYw"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="游戏将在倒计时结束后开始,请注意听题!" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CFF-3K-SiP">
                            <rect key="frame" x="53.5" y="67" width="302.5" height="20"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="20" id="eWP-cM-3cB"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.58999999999999997" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="5" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5e5-ea-cUc">
                            <rect key="frame" x="0.0" y="92" width="409" height="88"/>
                            <fontDescription key="fontDescription" name="Impact" family="Impact" pointSize="72"/>
                            <color key="textColor" red="0.25490196078431371" green="0.63529411764705879" blue="0.92156862745098034" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <nil key="highlightedColor"/>
                        </label>
                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xBM-3M-8RU">
                            <rect key="frame" x="94" y="189" width="221" height="40"/>
                            <color key="backgroundColor" red="0.25490196079999999" green="0.63529411759999999" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstAttribute="height" constant="40" id="dCN-yv-6rA"/>
                            </constraints>
                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                            <state key="normal" title="立即开始"/>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                    <real key="value" value="4"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                            <connections>
                                <action selector="completeAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="0fJ-wl-fg2"/>
                            </connections>
                        </button>
                    </subviews>
                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    <constraints>
                        <constraint firstItem="xBM-3M-8RU" firstAttribute="leading" secondItem="V8a-Jc-oJ6" secondAttribute="leading" constant="94" id="6Zf-39-taQ"/>
                        <constraint firstItem="CFF-3K-SiP" firstAttribute="centerX" secondItem="rb4-KR-EuP" secondAttribute="centerX" id="8Oa-Tq-x1T"/>
                        <constraint firstItem="xBM-3M-8RU" firstAttribute="centerX" secondItem="rb4-KR-EuP" secondAttribute="centerX" id="BTj-EW-az2"/>
                        <constraint firstItem="5e5-ea-cUc" firstAttribute="leading" secondItem="V8a-Jc-oJ6" secondAttribute="leading" id="CxO-Qq-ZlR"/>
                        <constraint firstAttribute="trailing" secondItem="xBM-3M-8RU" secondAttribute="trailing" constant="94" id="ECx-y1-EW7"/>
                        <constraint firstAttribute="width" secondItem="V8a-Jc-oJ6" secondAttribute="height" multiplier="1:0.5994" id="EUj-h8-jXt"/>
                        <constraint firstItem="5e5-ea-cUc" firstAttribute="top" secondItem="CFF-3K-SiP" secondAttribute="bottom" constant="5" id="IkZ-q9-lUa"/>
                        <constraint firstAttribute="trailing" secondItem="5e5-ea-cUc" secondAttribute="trailing" id="Rct-zJ-FRC"/>
                        <constraint firstItem="CFF-3K-SiP" firstAttribute="top" secondItem="rb4-KR-EuP" secondAttribute="bottom" constant="17" id="ekD-DV-h2c"/>
                        <constraint firstItem="5e5-ea-cUc" firstAttribute="centerX" secondItem="rb4-KR-EuP" secondAttribute="centerX" id="fst-vW-9Bb"/>
                        <constraint firstAttribute="bottom" secondItem="xBM-3M-8RU" secondAttribute="bottom" constant="16" id="mt1-ua-8HO"/>
                        <constraint firstItem="rb4-KR-EuP" firstAttribute="top" secondItem="V8a-Jc-oJ6" secondAttribute="top" constant="32" id="qOG-CC-CG4"/>
                        <constraint firstAttribute="height" constant="245" id="qUC-hS-Nzw"/>
                        <constraint firstItem="rb4-KR-EuP" firstAttribute="centerX" secondItem="V8a-Jc-oJ6" secondAttribute="centerX" id="wfs-hz-nxT"/>
                    </constraints>
                    <userDefinedRuntimeAttributes>
                        <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                        <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                            <real key="value" value="10"/>
                        </userDefinedRuntimeAttribute>
                    </userDefinedRuntimeAttributes>
                </view>
            </subviews>
            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
            <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
            <constraints>
                <constraint firstItem="V8a-Jc-oJ6" firstAttribute="centerY" secondItem="vUN-kp-3ea" secondAttribute="centerY" id="WYo-2n-d4F"/>
                <constraint firstItem="V8a-Jc-oJ6" firstAttribute="centerX" secondItem="vUN-kp-3ea" secondAttribute="centerX" id="yPy-6D-xcr"/>
            </constraints>
            <connections>
                <outlet property="label_time" destination="5e5-ea-cUc" id="XRc-Ez-qeG"/>
                <outlet property="view_container" destination="V8a-Jc-oJ6" id="Rb2-y4-qeK"/>
            </connections>
            <point key="canvasLocation" x="61" y="20"/>
        </view>
    </objects>
    <resources>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.swift
New file
@@ -0,0 +1,32 @@
//
//  Lesson_3_AnswerView.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/27.
//
import UIKit
import JQTools
class Lesson_3_AnswerView: UIView,JQNibView{
                @IBOutlet weak var img_state: UIImageView!
                @IBOutlet weak var btn_choose: UIButton!
                @IBOutlet weak var btn_fullscreen: UIButton!
                @IBOutlet weak var img_cover: UIImageView!
                override func awakeFromNib() {
                                super.awakeFromNib()
                                img_state.alpha = 0
                }
                @IBAction func fullscreenAction(_ sender: UIButton) {
                }
                func copyView()->Lesson_3_AnswerView{
                                let copyV = Lesson_3_AnswerView.jq_loadNibView()
                                copyV.bounds = self.bounds
                                return copyV
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_3_AnswerView.xib
New file
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="Lesson_3_AnswerView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="109" height="52"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="CCd-CG-c2c">
                    <rect key="frame" x="0.0" y="0.0" width="109" height="52"/>
                </imageView>
                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_fail" translatesAutoresizingMaskIntoConstraints="NO" id="5f1-hr-qeo">
                    <rect key="frame" x="34.5" y="6" width="40" height="40"/>
                    <constraints>
                        <constraint firstAttribute="width" constant="40" id="kVm-un-uT2"/>
                        <constraint firstAttribute="height" constant="40" id="x1u-18-WvZ"/>
                    </constraints>
                </imageView>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HEL-Qx-AZ6">
                    <rect key="frame" x="0.0" y="0.0" width="109" height="52"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                </button>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lsC-KD-Ubq">
                    <rect key="frame" x="79" y="-4" width="34" height="34"/>
                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                    <state key="normal" image="icon_fullScreen"/>
                    <connections>
                        <action selector="fullscreenAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Uc9-lH-7i1"/>
                    </connections>
                </button>
            </subviews>
            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
            <constraints>
                <constraint firstItem="CCd-CG-c2c" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="0lR-wa-kf0"/>
                <constraint firstAttribute="trailing" secondItem="CCd-CG-c2c" secondAttribute="trailing" id="6mx-m0-SBM"/>
                <constraint firstAttribute="bottom" secondItem="CCd-CG-c2c" secondAttribute="bottom" id="8BN-vk-9Ex"/>
                <constraint firstItem="HEL-Qx-AZ6" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="92l-QJ-G0c"/>
                <constraint firstItem="HEL-Qx-AZ6" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="UeJ-VW-jKb"/>
                <constraint firstAttribute="bottom" secondItem="HEL-Qx-AZ6" secondAttribute="bottom" id="ZmM-zn-mIT"/>
                <constraint firstItem="CCd-CG-c2c" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="c6t-Hh-BhR"/>
                <constraint firstItem="5f1-hr-qeo" firstAttribute="centerX" secondItem="CCd-CG-c2c" secondAttribute="centerX" id="j25-sz-lbO"/>
                <constraint firstItem="5f1-hr-qeo" firstAttribute="centerY" secondItem="CCd-CG-c2c" secondAttribute="centerY" id="qFU-Vr-9X5"/>
                <constraint firstAttribute="trailing" secondItem="HEL-Qx-AZ6" secondAttribute="trailing" id="so9-ay-EmQ"/>
                <constraint firstAttribute="trailing" secondItem="lsC-KD-Ubq" secondAttribute="trailing" constant="-4" id="wb6-UI-mdg"/>
                <constraint firstItem="lsC-KD-Ubq" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="-4" id="xzn-fY-YTT"/>
            </constraints>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <userDefinedRuntimeAttributes>
                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                    <real key="value" value="8"/>
                </userDefinedRuntimeAttribute>
            </userDefinedRuntimeAttributes>
            <connections>
                <outlet property="btn_choose" destination="HEL-Qx-AZ6" id="1JV-QC-IUY"/>
                <outlet property="btn_fullscreen" destination="lsC-KD-Ubq" id="1rA-Ol-u91"/>
                <outlet property="img_cover" destination="CCd-CG-c2c" id="3XA-hS-oxl"/>
                <outlet property="img_state" destination="5f1-hr-qeo" id="7li-fQ-6OE"/>
            </connections>
            <point key="canvasLocation" x="-167.19512195121951" y="-253.22033898305085"/>
        </view>
    </objects>
    <resources>
        <image name="icon_fail" width="80" height="80"/>
        <image name="icon_fullScreen" width="34" height="34"/>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.swift
New file
@@ -0,0 +1,32 @@
//
//  Lesson_4_AnswerView.swift
//  DolphinEnglishLearnStudent
//
//  Created by 无故事王国 on 2024/5/28.
//
import UIKit
import JQTools
class Lesson_4_AnswerView: UIView,JQNibView{
                @IBOutlet weak var img_state: UIImageView!
                @IBOutlet weak var btn_choose: UIButton!
                @IBOutlet weak var view_state: UIView!
                @IBOutlet weak var view_handle: UIView!
                override func awakeFromNib() {
                                super.awakeFromNib()
                                img_state.alpha = 0
                }
                func copyView()->Lesson_4_AnswerView{
                                let copyV = Lesson_4_AnswerView.jq_loadNibView()
                                copyV.bounds = self.bounds
                                return copyV
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/Lesson_4_AnswerView.xib
New file
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
    <device id="ipad10_9rounded" orientation="portrait" layout="fullscreen" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="Lesson_4_AnswerView" customModule="DolphinEnglishLearnStudent" customModuleProvider="target">
            <rect key="frame" x="0.0" y="0.0" width="234" height="52"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="17" translatesAutoresizingMaskIntoConstraints="NO" id="ubz-gZ-9yW">
                    <rect key="frame" x="0.0" y="0.0" width="234" height="52"/>
                    <subviews>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qsr-6I-w3R">
                            <rect key="frame" x="0.0" y="0.0" width="152" height="52"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="otl-1Z-qED">
                                    <rect key="frame" x="18" y="9.5" width="33" height="33"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" image="icon_question"/>
                                </button>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mba-RI-50M">
                                    <rect key="frame" x="70" y="12.5" width="27" height="27"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" image="icon_play_1"/>
                                </button>
                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_fail" translatesAutoresizingMaskIntoConstraints="NO" id="mkh-g4-79e">
                                    <rect key="frame" x="108" y="10" width="32" height="32"/>
                                    <constraints>
                                        <constraint firstAttribute="height" constant="32" id="unt-83-tZW"/>
                                        <constraint firstAttribute="width" constant="32" id="yDR-8r-kHx"/>
                                    </constraints>
                                </imageView>
                            </subviews>
                            <color key="backgroundColor" red="0.25490196079999999" green="0.63529411759999999" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                            <constraints>
                                <constraint firstItem="mba-RI-50M" firstAttribute="leading" secondItem="otl-1Z-qED" secondAttribute="trailing" constant="19" id="0nx-t9-1zV"/>
                                <constraint firstAttribute="width" constant="152" id="3Zx-vg-H2U"/>
                                <constraint firstItem="otl-1Z-qED" firstAttribute="leading" secondItem="qsr-6I-w3R" secondAttribute="leading" constant="18" id="6CA-c8-Zr7"/>
                                <constraint firstItem="mba-RI-50M" firstAttribute="centerY" secondItem="otl-1Z-qED" secondAttribute="centerY" id="FTc-eb-PWk"/>
                                <constraint firstItem="mkh-g4-79e" firstAttribute="centerY" secondItem="otl-1Z-qED" secondAttribute="centerY" id="N6f-d4-80e"/>
                                <constraint firstItem="mkh-g4-79e" firstAttribute="leading" secondItem="mba-RI-50M" secondAttribute="trailing" constant="11" id="a9o-Lq-9SP"/>
                                <constraint firstItem="otl-1Z-qED" firstAttribute="centerY" secondItem="qsr-6I-w3R" secondAttribute="centerY" id="v0P-gn-zbN"/>
                            </constraints>
                            <userDefinedRuntimeAttributes>
                                <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
                                <userDefinedRuntimeAttribute type="number" keyPath="ld_cornerRadiusXIB">
                                    <real key="value" value="8"/>
                                </userDefinedRuntimeAttribute>
                            </userDefinedRuntimeAttributes>
                        </view>
                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Gbs-f8-132">
                            <rect key="frame" x="182" y="0.0" width="52" height="52"/>
                            <subviews>
                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="v7f-gv-EWR">
                                    <rect key="frame" x="0.0" y="0.0" width="52" height="52"/>
                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                    <state key="normal" image="btn_radio_u"/>
                                    <state key="selected" image="btn_radio"/>
                                </button>
                            </subviews>
                            <constraints>
                                <constraint firstAttribute="trailing" secondItem="v7f-gv-EWR" secondAttribute="trailing" id="1hR-5c-llk"/>
                                <constraint firstItem="v7f-gv-EWR" firstAttribute="leading" secondItem="Gbs-f8-132" secondAttribute="leading" id="3wJ-TQ-8uq"/>
                                <constraint firstAttribute="bottom" secondItem="v7f-gv-EWR" secondAttribute="bottom" id="GCe-Zk-vfw"/>
                                <constraint firstItem="v7f-gv-EWR" firstAttribute="top" secondItem="Gbs-f8-132" secondAttribute="top" id="Uzt-W1-9lA"/>
                                <constraint firstAttribute="width" constant="52" id="qf4-74-pQq"/>
                            </constraints>
                        </view>
                    </subviews>
                </stackView>
            </subviews>
            <constraints>
                <constraint firstAttribute="trailing" secondItem="ubz-gZ-9yW" secondAttribute="trailing" id="2hW-IR-BhV"/>
                <constraint firstItem="ubz-gZ-9yW" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="HeQ-EX-wTa"/>
                <constraint firstItem="ubz-gZ-9yW" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="OkT-RW-3Kx"/>
                <constraint firstAttribute="bottom" secondItem="ubz-gZ-9yW" secondAttribute="bottom" id="iFU-tb-Rgx"/>
            </constraints>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <connections>
                <outlet property="btn_choose" destination="v7f-gv-EWR" id="wFE-Gp-xAd"/>
                <outlet property="img_state" destination="mkh-g4-79e" id="IzD-w8-jjK"/>
                <outlet property="view_handle" destination="qsr-6I-w3R" id="ptU-09-NIc"/>
                <outlet property="view_state" destination="Gbs-f8-132" id="Swt-nY-Bpv"/>
            </connections>
            <point key="canvasLocation" x="-163.17073170731706" y="-245.08474576271189"/>
        </view>
    </objects>
    <resources>
        <image name="btn_radio" width="52" height="52"/>
        <image name="btn_radio_u" width="52" height="52"/>
        <image name="icon_fail" width="80" height="80"/>
        <image name="icon_play_1" width="27" height="27"/>
        <image name="icon_question" width="33" height="33"/>
    </resources>
</document>