Browse Source

考试引导

Steven 4 years ago
parent
commit
f5840a5d4e
40 changed files with 1039 additions and 29 deletions
  1. 29 3
      MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj
  2. 6 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/Contents.json
  3. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/Contents.json
  4. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/guide_firstPage@2x.png
  5. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/guide_firstPage@3x.png
  6. 22 0
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/Contents.json
  7. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/guide_secondPage@2x.png
  8. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/guide_secondPage@3x.png
  9. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@2x.png
  10. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@3x.png
  11. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@2x.png
  12. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@3x.png
  13. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@3x.png
  14. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@2x.png
  15. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@3x.png
  16. 2 2
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/Contents.json
  17. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@2x.png
  18. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@3x.png
  19. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_microphone@2x.png
  20. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_microphone@3x.png
  21. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@2x.png
  22. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@3x.png
  23. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@2x.png
  24. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@3x.png
  25. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@2x.png
  26. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@3x.png
  27. BIN
      MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@3x.png
  28. 8 8
      MusicGradeExam/MusicGradeExam/Define/PrefixHeader.pch
  29. 2 2
      MusicGradeExam/MusicGradeExam/UI/Classroom/Service/Classroom/ClassroomService.m
  30. 17 0
      MusicGradeExam/MusicGradeExam/UI/Exam/Controller/ExamGuideViewController.h
  31. 78 0
      MusicGradeExam/MusicGradeExam/UI/Exam/Controller/ExamGuideViewController.m
  32. 3 1
      MusicGradeExam/MusicGradeExam/UI/Exam/Controller/WaitExamViewController.m
  33. 23 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.h
  34. 343 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.m
  35. 318 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.xib
  36. 19 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.h
  37. 26 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.m
  38. 110 0
      MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.xib
  39. 3 3
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.m
  40. 8 10
      MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.xib

+ 29 - 3
MusicGradeExam/MusicGradeExam.xcodeproj/project.pbxproj

@@ -297,6 +297,11 @@
 		27544CFB24BC338900EF58AF /* UserCenterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27544CFA24BC338900EF58AF /* UserCenterViewController.m */; };
 		278D113424CA8E4D00599421 /* ExamDisplayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 278D113324CA8E4D00599421 /* ExamDisplayViewController.m */; };
 		278D113624CADC4800599421 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278D113524CADC4800599421 /* Photos.framework */; };
+		278D113924CFBACA00599421 /* ExamGuideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 278D113824CFBACA00599421 /* ExamGuideViewController.m */; };
+		278D113C24CFC6A200599421 /* ExamDeviceCheckView.m in Sources */ = {isa = PBXBuildFile; fileRef = 278D113B24CFC6A200599421 /* ExamDeviceCheckView.m */; };
+		278D113E24CFC6B600599421 /* ExamDeviceCheckView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 278D113D24CFC6B600599421 /* ExamDeviceCheckView.xib */; };
+		278D114124CFD58800599421 /* GuideNextPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 278D114024CFD58800599421 /* GuideNextPageView.m */; };
+		278D114324CFD59B00599421 /* GuideNextPageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 278D114224CFD59B00599421 /* GuideNextPageView.xib */; };
 		2794D1B024BC604800BAF6F3 /* VefiBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2794D1AF24BC604800BAF6F3 /* VefiBodyView.m */; };
 		2794D1B224BC605600BAF6F3 /* VefiBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2794D1B124BC605600BAF6F3 /* VefiBodyView.xib */; };
 		2794D1B524BC662600BAF6F3 /* VeriCheckView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2794D1B424BC662600BAF6F3 /* VeriCheckView.m */; };
@@ -933,6 +938,14 @@
 		278D113224CA8E4D00599421 /* ExamDisplayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExamDisplayViewController.h; sourceTree = "<group>"; };
 		278D113324CA8E4D00599421 /* ExamDisplayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExamDisplayViewController.m; sourceTree = "<group>"; };
 		278D113524CADC4800599421 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = System/Library/Frameworks/Photos.framework; sourceTree = SDKROOT; };
+		278D113724CFBACA00599421 /* ExamGuideViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExamGuideViewController.h; sourceTree = "<group>"; };
+		278D113824CFBACA00599421 /* ExamGuideViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExamGuideViewController.m; sourceTree = "<group>"; };
+		278D113A24CFC6A100599421 /* ExamDeviceCheckView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExamDeviceCheckView.h; sourceTree = "<group>"; };
+		278D113B24CFC6A200599421 /* ExamDeviceCheckView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExamDeviceCheckView.m; sourceTree = "<group>"; };
+		278D113D24CFC6B600599421 /* ExamDeviceCheckView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ExamDeviceCheckView.xib; sourceTree = "<group>"; };
+		278D113F24CFD58800599421 /* GuideNextPageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GuideNextPageView.h; sourceTree = "<group>"; };
+		278D114024CFD58800599421 /* GuideNextPageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GuideNextPageView.m; sourceTree = "<group>"; };
+		278D114224CFD59B00599421 /* GuideNextPageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideNextPageView.xib; sourceTree = "<group>"; };
 		2794D1AE24BC604800BAF6F3 /* VefiBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VefiBodyView.h; sourceTree = "<group>"; };
 		2794D1AF24BC604800BAF6F3 /* VefiBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VefiBodyView.m; sourceTree = "<group>"; };
 		2794D1B124BC605600BAF6F3 /* VefiBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VefiBodyView.xib; sourceTree = "<group>"; };
@@ -1727,6 +1740,8 @@
 				27544CF724BC337D00EF58AF /* ExamTicketViewController.m */,
 				27EF3EF924BEFC79002068A2 /* WaitExamViewController.h */,
 				27EF3EFA24BEFC79002068A2 /* WaitExamViewController.m */,
+				278D113724CFBACA00599421 /* ExamGuideViewController.h */,
+				278D113824CFBACA00599421 /* ExamGuideViewController.m */,
 			);
 			path = Controller;
 			sourceTree = "<group>";
@@ -1751,6 +1766,12 @@
 				27EF3EFC24BF015A002068A2 /* WaitExamBodyView.h */,
 				27EF3EFD24BF015A002068A2 /* WaitExamBodyView.m */,
 				27EF3EFF24BF016B002068A2 /* WaitExamBodyView.xib */,
+				278D113A24CFC6A100599421 /* ExamDeviceCheckView.h */,
+				278D113B24CFC6A200599421 /* ExamDeviceCheckView.m */,
+				278D113D24CFC6B600599421 /* ExamDeviceCheckView.xib */,
+				278D113F24CFD58800599421 /* GuideNextPageView.h */,
+				278D114024CFD58800599421 /* GuideNextPageView.m */,
+				278D114224CFD59B00599421 /* GuideNextPageView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -2430,11 +2451,11 @@
 			isa = PBXGroup;
 			children = (
 				27A0089F24BD96C50002452B /* KSNetworkAlert.h */,
-				27A008A024BD96C50002452B /* NetworkBodyView.m */,
-				27A008A124BD96C50002452B /* NetworkBodyView.xib */,
 				27A008A224BD96C50002452B /* KSNetworkAlert.m */,
-				27A008A324BD96C50002452B /* NetworkBodyView.h */,
 				27A008A424BD96C50002452B /* KSNetworkAlert.xib */,
+				27A008A324BD96C50002452B /* NetworkBodyView.h */,
+				27A008A024BD96C50002452B /* NetworkBodyView.m */,
+				27A008A124BD96C50002452B /* NetworkBodyView.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -2768,6 +2789,7 @@
 				27A008E524BDA6C40002452B /* FeedbackBodyView.xib in Resources */,
 				2747718A24BC0C0500181362 /* WMPlayer.bundle in Resources */,
 				27476F5624BBFB5C00181362 /* LaunchScreen.storyboard in Resources */,
+				278D113E24CFC6B600599421 /* ExamDeviceCheckView.xib in Resources */,
 				2747727F24BC0C7C00181362 /* RCColor.plist in Resources */,
 				2729F7EC24C8329700E1F3C4 /* RecordBodyView.xib in Resources */,
 				27EF3EF824BEF1E8002068A2 /* TicketBodyView.xib in Resources */,
@@ -2794,6 +2816,7 @@
 				2747728224BC0C7D00181362 /* Emoji.plist in Resources */,
 				2747728024BC0C7C00181362 /* RongCloudKit.strings in Resources */,
 				2748F8F624C138A0003F8E11 /* ExamLibraryListCell.xib in Resources */,
+				278D114324CFD59B00599421 /* GuideNextPageView.xib in Resources */,
 				27476F5124BBFB5900181362 /* Main.storyboard in Resources */,
 				2729F7D324C8175E00E1F3C4 /* FileNameView.xib in Resources */,
 				27EF3EF324BEE885002068A2 /* NotifyMessageCell.xib in Resources */,
@@ -2947,6 +2970,7 @@
 				274771A624BC0C0500181362 /* MSSBrowseActionSheet.m in Sources */,
 				2747720124BC0C0500181362 /* UIDevice+zhDeviceType.m in Sources */,
 				274771F124BC0C0500181362 /* KSUpdateManager.m in Sources */,
+				278D113924CFBACA00599421 /* ExamGuideViewController.m in Sources */,
 				2747721424BC0C0500181362 /* NSDate+Transform.m in Sources */,
 				27EF3F2324C02B68002068A2 /* ClassVideoListView.m in Sources */,
 				27A008DD24BDA6950002452B /* PhoneCheckBodyView.m in Sources */,
@@ -2979,6 +3003,7 @@
 				2747721524BC0C0500181362 /* UIScreen+Extend.m in Sources */,
 				274771A324BC0C0500181362 /* MSSBrowseLocalViewController.m in Sources */,
 				2747723024BC0C0500181362 /* KSFullDatePicker.m in Sources */,
+				278D113C24CFC6A200599421 /* ExamDeviceCheckView.m in Sources */,
 				2794D1B824BC699700BAF6F3 /* RegisterBodyView.m in Sources */,
 				2747720A24BC0C0500181362 /* UIColor+Extend.m in Sources */,
 				274771B524BC0C0500181362 /* TYCyclePagerTransformLayout.m in Sources */,
@@ -3044,6 +3069,7 @@
 				274771BB24BC0C0500181362 /* ALCalendarDate.m in Sources */,
 				2729F7CA24C6EB4A00E1F3C4 /* SubjectNameModel.m in Sources */,
 				2747724D24BC0C0500181362 /* JXCategoryNumberCellModel.m in Sources */,
+				278D114124CFD58800599421 /* GuideNextPageView.m in Sources */,
 				274771C024BC0C0500181362 /* ALCalendarManager.m in Sources */,
 				2747724C24BC0C0500181362 /* JXCategoryNumberCell.m in Sources */,
 				274771B824BC0C0500181362 /* ALCalendarCell.m in Sources */,

+ 6 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "guide_firstPage@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "guide_firstPage@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/guide_firstPage@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_firstPage.imageset/guide_firstPage@3x.png


+ 22 - 0
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "guide_secondPage@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "guide_secondPage@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/guide_secondPage@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/Guide/guide_secondPage.imageset/guide_secondPage@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_audioSuccess.imageset/check_audioSuccess@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_device.imageset/check_device@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_fail.imageset/check_fail@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_loudspeaker.imageset/check_loudspeaker@3x.png


+ 2 - 2
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "check_ microphone@2x.png",
+      "filename" : "check_microphone@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "check_ microphone@3x.png",
+      "filename" : "check_microphone@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_ microphone@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_microphone@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_microphone.imageset/check_microphone@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_networking.imageset/check_networking@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_notification.imageset/check_notification@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@2x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/check_success.imageset/check_success@3x.png


BIN
MusicGradeExam/MusicGradeExam/Assets.xcassets/check_device/checking.imageset/checking@3x.png


+ 8 - 8
MusicGradeExam/MusicGradeExam/Define/PrefixHeader.pch

@@ -85,17 +85,17 @@
 
 //#ifdef DEBUG
 
-//#define hostURL (@"http://kjtest.dayaedu.com")
-//#define SEALCLASSHOST (@"http://kjtest.dayaedu.com/api-im")
+#define hostURL (@"https://test.kj.colexiu.com")
+#define SEALCLASSHOST (@"https://test.kj.colexiu.com/api-im")
+#define WEBHOST (@"https://test.m.kj.colexiu.com")
+#define JSPUSH_ENVIRONMENT (NO)
+#define RCIM_KEY (@"8luwapkv84g3l")
+
+//#define hostURL (@"http://192.168.3.28:8000")
+//#define SEALCLASSHOST (@"http://192.168.3.28:8000/api-im")
 //#define WEBHOST (@"http://mkjtest.dayaedu.com")
 //#define JSPUSH_ENVIRONMENT (NO)
 //#define RCIM_KEY (@"8luwapkv84g3l")
-
-#define hostURL (@"http://192.168.3.28:8000")
-#define SEALCLASSHOST (@"http://192.168.3.28:8000/api-im")
-#define WEBHOST (@"http://mkjtest.dayaedu.com")
-#define JSPUSH_ENVIRONMENT (NO)
-#define RCIM_KEY (@"8luwapkv84g3l")
 //#else    // 线上
 
 //#define hostURL (@"https://online.dayaedu.com")

+ 2 - 2
MusicGradeExam/MusicGradeExam/UI/Classroom/Service/Classroom/ClassroomService.m

@@ -21,7 +21,7 @@
 #import "InviteUpgradeMessage.h"
 #import "ControlDeviceNotifyMessage.h"
 #import <RongIMKit/RongIMKit.h>
-
+#import "RoomLoginHelper.h"
 @interface ClassroomService ()
 @property (nonatomic, copy) NSString *auth;
 @end
@@ -149,7 +149,7 @@
         return;
     }
     NSLog(@"leave classroom start");
-    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:self.currentRoom.roomId, @"roomId", nil];
+    NSDictionary *dic = @{@"registrationId": [RoomLoginHelper sharedInstance].roomId};
     [HTTPUtility requestWithHTTPMethod:HTTPMethodPost
                              URLString:@"/room/leave"
                             parameters:dic

+ 17 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/Controller/ExamGuideViewController.h

@@ -0,0 +1,17 @@
+//
+//  ExamGuideViewController.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ExamGuideViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 78 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/Controller/ExamGuideViewController.m

@@ -0,0 +1,78 @@
+//
+//  ExamGuideViewController.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "ExamGuideViewController.h"
+#import "ExamDeviceCheckView.h"
+#import "GuideNextPageView.h"
+
+@interface ExamGuideViewController ()
+
+@property (nonatomic, strong) ExamDeviceCheckView *bodyView;
+
+@property (nonatomic, strong) GuideNextPageView *nextPageView;
+
+@end
+
+@implementation ExamGuideViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"考试引导"];
+    [self configUI];
+}
+
+- (void)configUI {
+    [self.scrollView addSubview:self.bodyView];
+    self.scrollView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - iPhoneXSafeBottomMargin - kNaviBarHeight);
+    self.scrollView.contentSize = CGSizeMake(kScreenWidth, kScreenHeight - iPhoneXSafeBottomMargin - kNaviBarHeight);
+}
+
+
+
+#pragma mark --- lazying
+- (ExamDeviceCheckView *)bodyView {
+    if (!_bodyView) {
+        _bodyView = [ExamDeviceCheckView shareInstance];
+        _bodyView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin);
+        MJWeakSelf;
+        [_bodyView completeCheck:^{
+            [weakSelf showNextPage];
+        }];
+    }
+    return _bodyView;
+}
+
+- (void)showNextPage {
+    [self.scrollView addSubview:self.nextPageView];
+    CGFloat height = kScreenWidth / 370 * 203 + 52 + 52 + kScreenWidth / 370 * 409 + 100;
+    height = height > kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin ? height : kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin;
+    self.scrollView.contentSize = CGSizeMake(kScreenWidth, height);
+}
+
+- (GuideNextPageView *)nextPageView {
+    if (!_nextPageView) {
+        _nextPageView = [GuideNextPageView shareInstance];
+        CGFloat height = kScreenWidth / 370 * 203 + 52 + 52 + kScreenWidth / 370 * 409 + 100;
+        height = height > kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin ? height : kScreenHeight - kNaviBarHeight - iPhoneXSafeBottomMargin;
+        _nextPageView.frame = CGRectMake(0, 0, kScreenWidth, height);
+    }
+    return _nextPageView;
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 3 - 1
MusicGradeExam/MusicGradeExam/UI/Exam/Controller/WaitExamViewController.m

@@ -11,6 +11,7 @@
 #import "TicketDetailModel.h"
 #import "OnlineRoomManager.h"
 #import "RecordExamViewController.h"
+#import "ExamGuideViewController.h"
 
 @interface WaitExamViewController ()
 
@@ -127,7 +128,8 @@
             break;
         case JOINROOMACTION_GUIDE: // 引导页
         {
-            
+            ExamGuideViewController *guideVC = [[ExamGuideViewController alloc] init];
+            [self.navigationController pushViewController:guideVC animated:YES];
         }
             break;
         case JOINROOMACTION_JOIN:  // 加入房间

+ 23 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.h

@@ -0,0 +1,23 @@
+//
+//  ExamDeviceCheckView.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^CheckCallback)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ExamDeviceCheckView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)completeCheck:(CheckCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 343 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.m

@@ -0,0 +1,343 @@
+//
+//  ExamDeviceCheckView.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "ExamDeviceCheckView.h"
+#import "AudioRecordManager.h"
+#import "AudioPlayManager.h"
+#import "Reachability.h"
+#import <UserNotifications/UserNotifications.h>
+
+@interface ExamDeviceCheckView ()<AudioRecordManagerDelegate>
+
+@property (weak, nonatomic) IBOutlet UIImageView *TopImageView;
+
+@property (weak, nonatomic) IBOutlet UIButton *oneButton;
+@property (weak, nonatomic) IBOutlet UIView *oneButtonView;
+
+@property (weak, nonatomic) IBOutlet UIView *twoButtonView;
+@property (weak, nonatomic) IBOutlet UIButton *twoPreButton;
+@property (weak, nonatomic) IBOutlet UIButton *twoNextButton;
+
+
+@property (weak, nonatomic) IBOutlet UIImageView *statusOne;
+@property (weak, nonatomic) IBOutlet UIImageView *statusTwo;
+@property (weak, nonatomic) IBOutlet UIImageView *statusThree;
+@property (weak, nonatomic) IBOutlet UIImageView *statusFour;
+@property (weak, nonatomic) IBOutlet UIImageView *statusFive;
+@property (weak, nonatomic) IBOutlet UIImageView *statusSix;
+
+@property (weak, nonatomic) IBOutlet UIImageView *lineOne;
+@property (weak, nonatomic) IBOutlet UIImageView *lineTwo;
+@property (weak, nonatomic) IBOutlet UIImageView *lineThree;
+@property (weak, nonatomic) IBOutlet UIImageView *lineFour;
+@property (weak, nonatomic) IBOutlet UIImageView *linefive;
+
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+@property (weak, nonatomic) IBOutlet UILabel *descLabel;
+@property (weak, nonatomic) IBOutlet UILabel *followLabel;
+
+
+@property (nonatomic, assign) NSInteger currentIndex;
+
+
+@property (nonatomic, assign) BOOL isRecording;
+
+@property (nonatomic, strong) AudioRecordManager *recordManager; //音频录音管理
+
+@property (nonatomic, strong) AudioPlayManager *playManager;        // 音频播放
+
+@property (nonatomic, copy) CheckCallback callback;
+
+@end
+
+@implementation ExamDeviceCheckView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    [self resetView];
+}
+
+- (void)resetView {
+    self.currentIndex = 0;
+    self.isRecording = NO;
+}
+
++ (instancetype)shareInstance {
+    ExamDeviceCheckView *view = [[[NSBundle mainBundle] loadNibNamed:@"ExamDeviceCheckView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)completeCheck:(CheckCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (void)setCurrentIndex:(NSInteger)currentIndex {
+    _currentIndex = currentIndex;
+    switch (currentIndex) {
+        case 0:
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_device"]];
+            [self.statusOne setImage:[UIImage imageNamed:@"checking"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusThree setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusFour setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusFive setImage:[UIImage imageNamed:@"check_wait"]];
+            [self.statusSix setImage:[UIImage imageNamed:@"check_wait"]];
+            
+            [self.lineOne setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineTwo setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineThree setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.lineFour setImage:[UIImage imageNamed:@"check_dotted"]];
+            [self.linefive setImage:[UIImage imageNamed:@"check_dotted"]];
+            
+            self.twoButtonView.hidden = YES;
+            
+            [self.titleLabel setText:@"设备检测"];
+            [self.descLabel setText:@"为确保您能正常考试,现在进行声音测试"];
+            [self.followLabel setText:@""];
+            [self.oneButton setTitle:@"开始测试" forState:UIControlStateNormal];
+            
+        }
+            break;
+        case 1: // 话筒
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_microphone"]];
+            [self.statusOne setImage:[UIImage imageNamed:@"check_success"]];
+            [self.lineOne setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"手机话筒检测"];
+            [self.descLabel setText:@"请按录音并念出下方文字"];
+            [self.followLabel setText:@"“我正在测试话筒与扬声器”"];
+            [self.oneButton setTitle:@"开始录音" forState:UIControlStateNormal];
+        }
+            break;
+        case 2: // 扬声器
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_loudspeaker"]];
+            [self.statusTwo setImage:[UIImage imageNamed:@"check_success"]];
+            [self.lineTwo setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusThree setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"扬声器检测"];
+            [self.descLabel setText:@"录音内容播放中请听是否有声音"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = NO;
+            [self.twoPreButton setTitle:@"无声音" forState:UIControlStateNormal];
+            [self.twoNextButton setTitle:@"有声音" forState:UIControlStateNormal];
+        }
+            break;
+        case 3: // 设备检测成功
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_audioSuccess"]];
+            [self.lineThree setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusFour setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"设备检测成功"];
+            [self.descLabel setText:@"恭喜您!话筒与扬声器测试已通过"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"下一步" forState:UIControlStateNormal];
+        }
+            break;
+        case 4: // 网络
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_networking"]];
+            [self.lineFour setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusFive setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"网络检测中"];
+            [self.descLabel setText:@"检测中..."];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"下一步" forState:UIControlStateNormal];
+        }
+            break;
+        case 5: // 通知权限
+        {
+            [self.TopImageView setImage:[UIImage imageNamed:@"check_notification"]];
+            [self.linefive setImage:[UIImage imageNamed:@"check_line"]];
+            [self.statusSix setImage:[UIImage imageNamed:@"checking"]];
+            [self.titleLabel setText:@"通知权限"];
+            [self.descLabel setText:@"通知权限已开启,再也不会错过考试提醒了"];
+            [self.followLabel setText:@""];
+            self.twoButtonView.hidden = YES;
+            [self.oneButton setTitle:@"完成测试" forState:UIControlStateNormal];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (void)hiddenView {
+    if (self.callback) {
+        [self removeFromSuperview];
+        self.callback();
+    }
+}
+
+
+#pragma mark ---- one button action
+
+- (IBAction)oneButtonAction:(UIButton *)sender {
+    if (self.currentIndex == 5) {
+        [self hiddenView];
+    }
+    else if (self.currentIndex == 0) {
+        self.currentIndex++;
+    }
+    else if (self.currentIndex == 1) {
+        if (_isRecording == NO) { // 如果没有开始录音
+            _isRecording = YES;
+            [sender setTitle:@"停止录音" forState:UIControlStateNormal];
+            [self.recordManager ks_record];
+        }
+        else {
+            _isRecording = NO;
+            [self.recordManager ks_stop];
+            NSURL *fileUrl = [self.recordManager getSavePath];
+            self.playManager = [AudioPlayManager shareInstanceWithFileUrl:fileUrl];
+            [self.playManager playMusic];
+            self.currentIndex++;
+        }
+
+    }
+    else if (self.currentIndex == 3) {
+        [self.recordManager ks_deleteRecording];
+        [self.playManager stopMusic];
+        
+        [self checkNetWorkStatus];
+    }
+    else if (self.currentIndex == 4) {
+        [self checkNotificationStatus];
+    }
+    
+}
+
+
+- (void)checkNotificationStatus {
+    if ([self isAllowedNotification]) { // 通知开启了
+        self.currentIndex++;
+        [self.statusSix setImage:[UIImage imageNamed:@"check_success"]];
+    }
+    else {
+        self.currentIndex++;
+        [self.statusSix setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.descLabel setText:@"通知权限未开启,可能错过上课提醒哦! 快去开启通知权限吧~"];
+        self.twoButtonView.hidden = NO;
+        [self.twoPreButton setTitle:@"完成测试" forState:UIControlStateNormal];
+        [self.twoNextButton setTitle:@"去设置" forState:UIControlStateNormal];
+    }
+}
+
+- (BOOL)isAllowedNotification {
+    UIUserNotificationSettings *setting = [[UIApplication sharedApplication] currentUserNotificationSettings];
+    if (UIUserNotificationTypeNone == setting.types) {
+        return NO;
+    }else{
+        return YES;
+    }
+}
+
+
+#pragma mark --- two view aciton
+
+- (IBAction)preAction:(UIButton *)sender {
+    if (self.currentIndex == 2) { // 点击无声音按钮
+        [self.lineThree setImage:[UIImage imageNamed:@"check_line"]];
+        
+        [self.statusTwo setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.statusThree setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.statusFour setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.titleLabel setText:@"扬声器故障"];
+        self.twoPreButton.userInteractionEnabled = NO;
+        self.twoNextButton.userInteractionEnabled = NO;
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            [self checkNetWorkStatus];
+            self.twoPreButton.userInteractionEnabled = YES;
+            self.twoNextButton.userInteractionEnabled = YES;
+        });
+    }
+    else if (self.currentIndex == 5) {
+        [self hiddenView];
+    }
+}
+
+- (IBAction)nextAction:(UIButton *)sender {
+    if (self.currentIndex == 2) {
+        [self.statusThree setImage:[UIImage imageNamed:@"check_success"]];
+        self.currentIndex++;
+        [self.statusFour setImage:[UIImage imageNamed:@"check_success"]];
+    }
+    else if (self.currentIndex == 5) {
+        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
+    }
+}
+
+/**
+ *  获得录音机管理
+ *
+ *  @return 录音机对象
+ */
+- (AudioRecordManager *)recordManager {
+    if (!_recordManager) {
+        _recordManager = [AudioRecordManager shareManager];
+        _recordManager.delegate = self;
+    }
+    return _recordManager;
+}
+
+
+- (void)checkNetWorkStatus {
+    self.currentIndex = 4;
+    if ([self checkNetworkAvaiable]) {
+        [self.statusFive setImage:[UIImage imageNamed:@"check_success"]];
+        [self.titleLabel setText:@"网络检测成功"];
+        [self.descLabel setText:@"您当前的网络状态良好"];
+    }
+    else {
+        [self.statusFive setImage:[UIImage imageNamed:@"check_fail"]];
+        [self.titleLabel setText:@"网络检测失败"];
+        [self.descLabel setText:@"您当前网络不顺畅"];
+    }
+}
+
+- (BOOL)checkNetworkAvaiable {
+    BOOL isExistenceNetwork = YES;
+    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
+    switch ([reach currentReachabilityStatus]) {
+        case NotReachable:
+            isExistenceNetwork = NO;
+            //NSLog(@"notReachable");
+            break;
+        case ReachableViaWiFi:
+            isExistenceNetwork = YES;
+            //NSLog(@"WIFI");
+            break;
+        case ReachableViaWWAN:
+            isExistenceNetwork = YES;
+            //NSLog(@"3G");
+            break;
+    }
+    return isExistenceNetwork;
+}
+
+
+
+#pragma mark ---- AudioRecordManagerDelegate
+- (void)recordInterruption {
+    
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 318 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/ExamDeviceCheckView.xib

@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <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"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="ExamDeviceCheckView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Zj-N7-Kkf">
+                    <rect key="frame" x="26" y="64" width="362" height="35.5"/>
+                    <attributedString key="attributedText">
+                        <fragment content="为保证正常考级,现从声音、网络、设备位置等方面进行测试">
+                            <attributes>
+                                <color key="NSColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                                <font key="NSFont" size="14" name=".PingFangSC-Regular"/>
+                                <paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4" tighteningFactorForTruncation="0.0"/>
+                            </attributes>
+                        </fragment>
+                    </attributedString>
+                    <nil key="highlightedColor"/>
+                </label>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bc9-Kl-Ad2">
+                    <rect key="frame" x="0.0" y="99.5" width="414" height="350"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_device" translatesAutoresizingMaskIntoConstraints="NO" id="9hS-C8-9oD">
+                            <rect key="frame" x="136.5" y="32" width="141" height="100"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="100" id="7ax-ch-YJe"/>
+                                <constraint firstAttribute="width" constant="141" id="Ao7-bw-yAB"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="为确保您能正常上课,现在 进行声音测试" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7I2-EN-weU">
+                            <rect key="frame" x="72" y="224" width="270" height="17"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.46666666670000001" green="0.46666666670000001" blue="0.46666666670000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <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="1tJ-pa-zNA">
+                            <rect key="frame" x="168.5" y="191" width="77.5" height="23"/>
+                            <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="19"/>
+                            <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="“我正在测试话筒与扬声器”" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4gq-r8-hKI">
+                            <rect key="frame" x="72" y="246" width="270" height="17"/>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                            <color key="textColor" red="0.97647058819999999" green="0.44705882349999998" blue="0.08235294118" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="s92-Mv-XRN">
+                            <rect key="frame" x="64" y="140" width="286" height="30"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checking" translatesAutoresizingMaskIntoConstraints="NO" id="xws-4A-RHe">
+                                    <rect key="frame" x="0.0" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="2za-Ee-0dt"/>
+                                        <constraint firstAttribute="height" constant="16" id="EPo-p7-mS6"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="s4h-tj-fKu">
+                                    <rect key="frame" x="54" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="ReP-Oj-NVE"/>
+                                        <constraint firstAttribute="width" constant="16" id="mTX-pZ-jT4"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="d3S-pf-H16">
+                                    <rect key="frame" x="108" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="9Sa-ov-peA"/>
+                                        <constraint firstAttribute="height" constant="16" id="c2O-PL-4xZ"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="wU3-YV-T1O">
+                                    <rect key="frame" x="162" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="90l-fj-q4l"/>
+                                        <constraint firstAttribute="height" constant="16" id="IF6-tY-qPG"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="oDa-bH-qvI">
+                                    <rect key="frame" x="216" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="16" id="13F-y4-SyA"/>
+                                        <constraint firstAttribute="height" constant="16" id="YKp-hP-95P"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_wait" translatesAutoresizingMaskIntoConstraints="NO" id="n6w-fq-nQE">
+                                    <rect key="frame" x="270" y="7" width="16" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="Jze-If-gru"/>
+                                        <constraint firstAttribute="width" constant="16" id="wpP-LK-qk8"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="Hzb-8F-G8v">
+                                    <rect key="frame" x="19" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="ewR-MP-zta"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="6k3-Me-WEV">
+                                    <rect key="frame" x="73" y="14.5" width="30" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="OxL-we-Hie"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="SDX-zc-6Ok">
+                                    <rect key="frame" x="127" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="Igz-c1-3ja"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="NkN-1x-Oli">
+                                    <rect key="frame" x="181" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="pLC-pG-rsH"/>
+                                    </constraints>
+                                </imageView>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="check_dotted" translatesAutoresizingMaskIntoConstraints="NO" id="iRs-nJ-Abm">
+                                    <rect key="frame" x="235" y="14.5" width="32" height="1"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="6tf-VU-vwr"/>
+                                    </constraints>
+                                </imageView>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="d3S-pf-H16" firstAttribute="centerY" secondItem="xws-4A-RHe" secondAttribute="centerY" id="0BS-rC-tbo"/>
+                                <constraint firstItem="xws-4A-RHe" firstAttribute="centerY" secondItem="s92-Mv-XRN" secondAttribute="centerY" id="2cs-37-7et"/>
+                                <constraint firstItem="NkN-1x-Oli" firstAttribute="leading" secondItem="wU3-YV-T1O" secondAttribute="trailing" constant="3" id="DZl-Gs-X1Q"/>
+                                <constraint firstItem="NkN-1x-Oli" firstAttribute="centerY" secondItem="6k3-Me-WEV" secondAttribute="centerY" id="Gu1-Xo-1SZ"/>
+                                <constraint firstItem="SDX-zc-6Ok" firstAttribute="leading" secondItem="d3S-pf-H16" secondAttribute="trailing" constant="3" id="I82-zJ-tQX"/>
+                                <constraint firstItem="n6w-fq-nQE" firstAttribute="leading" secondItem="oDa-bH-qvI" secondAttribute="trailing" constant="38" id="Mts-XK-MVI"/>
+                                <constraint firstAttribute="width" constant="286" id="PBM-zA-b9z"/>
+                                <constraint firstItem="xws-4A-RHe" firstAttribute="leading" secondItem="s92-Mv-XRN" secondAttribute="leading" id="Pxq-VH-CH7"/>
+                                <constraint firstItem="wU3-YV-T1O" firstAttribute="centerY" secondItem="xws-4A-RHe" secondAttribute="centerY" id="Qfu-xH-TCf"/>
+                                <constraint firstItem="oDa-bH-qvI" firstAttribute="leading" secondItem="NkN-1x-Oli" secondAttribute="trailing" constant="3" id="RWH-2Z-PFU"/>
+                                <constraint firstItem="6k3-Me-WEV" firstAttribute="centerY" secondItem="s92-Mv-XRN" secondAttribute="centerY" id="TlA-yf-8g4"/>
+                                <constraint firstItem="6k3-Me-WEV" firstAttribute="leading" secondItem="s4h-tj-fKu" secondAttribute="trailing" constant="3" id="UXK-Hs-lF3"/>
+                                <constraint firstItem="n6w-fq-nQE" firstAttribute="centerY" secondItem="xws-4A-RHe" secondAttribute="centerY" id="XGR-mQ-ghr"/>
+                                <constraint firstItem="s4h-tj-fKu" firstAttribute="centerY" secondItem="xws-4A-RHe" secondAttribute="centerY" id="XR4-bR-2QA"/>
+                                <constraint firstAttribute="trailing" secondItem="n6w-fq-nQE" secondAttribute="trailing" id="Y6t-nV-U8w"/>
+                                <constraint firstItem="SDX-zc-6Ok" firstAttribute="centerY" secondItem="6k3-Me-WEV" secondAttribute="centerY" id="Y7n-HH-4hf"/>
+                                <constraint firstItem="iRs-nJ-Abm" firstAttribute="centerY" secondItem="6k3-Me-WEV" secondAttribute="centerY" id="afu-av-Syc"/>
+                                <constraint firstItem="n6w-fq-nQE" firstAttribute="leading" secondItem="iRs-nJ-Abm" secondAttribute="trailing" constant="3" id="gur-qe-j9V"/>
+                                <constraint firstItem="Hzb-8F-G8v" firstAttribute="centerY" secondItem="s92-Mv-XRN" secondAttribute="centerY" id="iex-6w-Jef"/>
+                                <constraint firstItem="Hzb-8F-G8v" firstAttribute="leading" secondItem="xws-4A-RHe" secondAttribute="trailing" constant="3" id="jV1-cZ-1qw"/>
+                                <constraint firstAttribute="height" constant="30" id="jXf-Dl-PjL"/>
+                                <constraint firstItem="oDa-bH-qvI" firstAttribute="leading" secondItem="wU3-YV-T1O" secondAttribute="trailing" constant="38" id="l7S-Z6-6zJ"/>
+                                <constraint firstItem="iRs-nJ-Abm" firstAttribute="leading" secondItem="oDa-bH-qvI" secondAttribute="trailing" constant="3" id="qq1-BS-oBi"/>
+                                <constraint firstItem="s4h-tj-fKu" firstAttribute="leading" secondItem="xws-4A-RHe" secondAttribute="trailing" constant="38" id="r1i-lI-dZg"/>
+                                <constraint firstItem="wU3-YV-T1O" firstAttribute="leading" secondItem="SDX-zc-6Ok" secondAttribute="trailing" constant="3" id="s2f-zd-EHQ"/>
+                                <constraint firstItem="oDa-bH-qvI" firstAttribute="centerY" secondItem="xws-4A-RHe" secondAttribute="centerY" id="tzs-TU-9Fs"/>
+                                <constraint firstItem="wU3-YV-T1O" firstAttribute="leading" secondItem="d3S-pf-H16" secondAttribute="trailing" constant="38" id="uek-2d-Lvw"/>
+                                <constraint firstItem="s4h-tj-fKu" firstAttribute="leading" secondItem="Hzb-8F-G8v" secondAttribute="trailing" constant="3" id="v4h-Xv-c4Z"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ehX-MZ-qgf">
+                            <rect key="frame" x="0.0" y="277" width="414" height="45"/>
+                            <subviews>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0AR-Ph-gQG">
+                                    <rect key="frame" x="60" y="0.0" width="294" height="45"/>
+                                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="45" id="NXb-CR-6yc"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="开始测试"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="20"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="oneButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="9UZ-tq-iqp"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="0AR-Ph-gQG" firstAttribute="top" secondItem="ehX-MZ-qgf" secondAttribute="top" id="G2U-pO-2xy"/>
+                                <constraint firstItem="0AR-Ph-gQG" firstAttribute="leading" secondItem="ehX-MZ-qgf" secondAttribute="leading" constant="60" id="Ww0-Yy-5jj"/>
+                                <constraint firstAttribute="trailing" secondItem="0AR-Ph-gQG" secondAttribute="trailing" constant="60" id="ci1-us-zkX"/>
+                                <constraint firstAttribute="height" constant="45" id="uN5-h8-yA5"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qn1-ek-Ma0">
+                            <rect key="frame" x="0.0" y="277" width="414" height="45"/>
+                            <subviews>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="193-DS-VAC">
+                                    <rect key="frame" x="219" y="0.0" width="167" height="45"/>
+                                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="有声音"/>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="22.5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="nextAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="i3c-xA-jON"/>
+                                    </connections>
+                                </button>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5RC-yu-zq4">
+                                    <rect key="frame" x="28" y="0.0" width="167" height="45"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <state key="normal" title="无声音">
+                                        <color key="titleColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    </state>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="22.5"/>
+                                        </userDefinedRuntimeAttribute>
+                                        <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                            <color key="value" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                    <connections>
+                                        <action selector="preAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Ivu-R5-fuO"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="193-DS-VAC" firstAttribute="leading" secondItem="5RC-yu-zq4" secondAttribute="trailing" constant="24" id="6Rb-cW-jaM"/>
+                                <constraint firstAttribute="bottom" secondItem="193-DS-VAC" secondAttribute="bottom" id="9LV-am-TAJ"/>
+                                <constraint firstItem="5RC-yu-zq4" firstAttribute="leading" secondItem="Qn1-ek-Ma0" secondAttribute="leading" constant="28" id="OdM-91-L6e"/>
+                                <constraint firstAttribute="trailing" secondItem="193-DS-VAC" secondAttribute="trailing" constant="28" id="PSX-fV-TRi"/>
+                                <constraint firstAttribute="height" constant="45" id="bdg-Pr-aNI"/>
+                                <constraint firstItem="193-DS-VAC" firstAttribute="width" secondItem="5RC-yu-zq4" secondAttribute="width" id="cNl-6i-hrM"/>
+                                <constraint firstItem="193-DS-VAC" firstAttribute="top" secondItem="Qn1-ek-Ma0" secondAttribute="top" id="mV1-Qo-9M1"/>
+                                <constraint firstAttribute="bottom" secondItem="5RC-yu-zq4" secondAttribute="bottom" id="pod-Y5-2W0"/>
+                                <constraint firstItem="5RC-yu-zq4" firstAttribute="top" secondItem="Qn1-ek-Ma0" secondAttribute="top" id="tfP-zy-LU3"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="4gq-r8-hKI" secondAttribute="trailing" constant="72" id="14p-0X-ifN"/>
+                        <constraint firstItem="s92-Mv-XRN" firstAttribute="centerX" secondItem="bc9-Kl-Ad2" secondAttribute="centerX" id="1Rh-Kt-fsO"/>
+                        <constraint firstAttribute="height" constant="350" id="3JD-UY-eui"/>
+                        <constraint firstItem="s92-Mv-XRN" firstAttribute="top" secondItem="9hS-C8-9oD" secondAttribute="bottom" constant="8" id="6dH-D2-1Cz"/>
+                        <constraint firstAttribute="bottom" secondItem="ehX-MZ-qgf" secondAttribute="bottom" constant="28" id="AFQ-9b-zAo"/>
+                        <constraint firstAttribute="trailing" secondItem="7I2-EN-weU" secondAttribute="trailing" constant="72" id="HbJ-EG-T43"/>
+                        <constraint firstItem="7I2-EN-weU" firstAttribute="centerX" secondItem="1tJ-pa-zNA" secondAttribute="centerX" id="R5m-xc-QFu"/>
+                        <constraint firstAttribute="bottom" secondItem="Qn1-ek-Ma0" secondAttribute="bottom" constant="28" id="WMD-HU-pO8"/>
+                        <constraint firstItem="4gq-r8-hKI" firstAttribute="top" secondItem="7I2-EN-weU" secondAttribute="bottom" constant="5" id="cgx-Cw-AhF"/>
+                        <constraint firstItem="7I2-EN-weU" firstAttribute="leading" secondItem="bc9-Kl-Ad2" secondAttribute="leading" constant="72" id="cyF-6h-LER"/>
+                        <constraint firstItem="9hS-C8-9oD" firstAttribute="centerX" secondItem="bc9-Kl-Ad2" secondAttribute="centerX" id="dg2-jO-Mci"/>
+                        <constraint firstItem="7I2-EN-weU" firstAttribute="top" secondItem="1tJ-pa-zNA" secondAttribute="bottom" constant="10" id="ktp-GG-AYU"/>
+                        <constraint firstAttribute="trailing" secondItem="Qn1-ek-Ma0" secondAttribute="trailing" id="l0G-wK-4XL"/>
+                        <constraint firstAttribute="trailing" secondItem="ehX-MZ-qgf" secondAttribute="trailing" id="m7d-dY-MQY"/>
+                        <constraint firstItem="ehX-MZ-qgf" firstAttribute="top" secondItem="4gq-r8-hKI" secondAttribute="bottom" constant="14" id="mbc-nl-VEb"/>
+                        <constraint firstItem="9hS-C8-9oD" firstAttribute="top" secondItem="bc9-Kl-Ad2" secondAttribute="top" constant="32" id="n9v-jM-XMo"/>
+                        <constraint firstItem="Qn1-ek-Ma0" firstAttribute="leading" secondItem="bc9-Kl-Ad2" secondAttribute="leading" id="rJk-Ai-rGX"/>
+                        <constraint firstItem="4gq-r8-hKI" firstAttribute="leading" secondItem="bc9-Kl-Ad2" secondAttribute="leading" constant="72" id="uvy-cT-qop"/>
+                        <constraint firstItem="ehX-MZ-qgf" firstAttribute="leading" secondItem="bc9-Kl-Ad2" secondAttribute="leading" id="yKy-Aw-H1o"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <constraints>
+                <constraint firstItem="bc9-Kl-Ad2" firstAttribute="top" secondItem="7Zj-N7-Kkf" secondAttribute="bottom" id="12C-nT-dnk"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="7Zj-N7-Kkf" secondAttribute="trailing" constant="26" id="8s1-sC-6no"/>
+                <constraint firstItem="7Zj-N7-Kkf" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="26" id="VmW-oR-0FU"/>
+                <constraint firstItem="7Zj-N7-Kkf" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="20" id="inA-5Q-WOH"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="bc9-Kl-Ad2" secondAttribute="trailing" id="mvn-0o-eVD"/>
+                <constraint firstItem="bc9-Kl-Ad2" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="rkY-mM-bap"/>
+            </constraints>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <connections>
+                <outlet property="TopImageView" destination="9hS-C8-9oD" id="GLA-iS-BTT"/>
+                <outlet property="descLabel" destination="7I2-EN-weU" id="QfD-YL-2p9"/>
+                <outlet property="followLabel" destination="4gq-r8-hKI" id="FiQ-gk-WQ8"/>
+                <outlet property="lineFour" destination="NkN-1x-Oli" id="GgU-M2-rvE"/>
+                <outlet property="lineOne" destination="Hzb-8F-G8v" id="XLU-I1-qk0"/>
+                <outlet property="lineThree" destination="SDX-zc-6Ok" id="q1Z-vH-LF3"/>
+                <outlet property="lineTwo" destination="6k3-Me-WEV" id="n4l-v9-2mf"/>
+                <outlet property="linefive" destination="iRs-nJ-Abm" id="AE1-Pw-rDH"/>
+                <outlet property="oneButton" destination="0AR-Ph-gQG" id="mnZ-ec-6Su"/>
+                <outlet property="oneButtonView" destination="ehX-MZ-qgf" id="TH2-R1-IIZ"/>
+                <outlet property="statusFive" destination="oDa-bH-qvI" id="R6n-uY-Cax"/>
+                <outlet property="statusFour" destination="wU3-YV-T1O" id="vUD-Dc-cwI"/>
+                <outlet property="statusOne" destination="xws-4A-RHe" id="iVO-tC-AsY"/>
+                <outlet property="statusSix" destination="n6w-fq-nQE" id="Ccc-oT-vi4"/>
+                <outlet property="statusThree" destination="d3S-pf-H16" id="gKB-om-cf0"/>
+                <outlet property="statusTwo" destination="s4h-tj-fKu" id="VAq-Ab-jR5"/>
+                <outlet property="titleLabel" destination="1tJ-pa-zNA" id="vMT-S0-J0Q"/>
+                <outlet property="twoButtonView" destination="Qn1-ek-Ma0" id="Ua4-y2-hSL"/>
+                <outlet property="twoNextButton" destination="193-DS-VAC" id="Xkd-OC-M6n"/>
+                <outlet property="twoPreButton" destination="5RC-yu-zq4" id="z8a-Hx-i1J"/>
+            </connections>
+            <point key="canvasLocation" x="132" y="107"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="check_device" width="150" height="118"/>
+        <image name="check_dotted" width="30" height="1"/>
+        <image name="check_wait" width="16" height="16"/>
+        <image name="checking" width="16" height="16"/>
+    </resources>
+</document>

+ 19 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.h

@@ -0,0 +1,19 @@
+//
+//  GuideNextPageView.h
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GuideNextPageView : UIView
+
++ (instancetype)shareInstance;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.m

@@ -0,0 +1,26 @@
+//
+//  GuideNextPageView.m
+//  MusicGradeExam
+//
+//  Created by Kyle on 2020/7/28.
+//  Copyright © 2020 DayaMusic. All rights reserved.
+//
+
+#import "GuideNextPageView.h"
+
+@implementation GuideNextPageView
+
++ (instancetype)shareInstance {
+    GuideNextPageView *view = [[[NSBundle mainBundle] loadNibNamed:@"GuideNextPageView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 110 - 0
MusicGradeExam/MusicGradeExam/UI/Exam/View/GuideNextPageView.xib

@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
+        <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"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GuideNextPageView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="摄像机及摄像位置" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ev7-3d-bgm">
+                    <rect key="frame" x="16" y="65" width="147" height="25"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="25" id="BeP-d8-1ZB"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="18"/>
+                    <color key="textColor" red="0.26666666666666666" green="0.26666666666666666" blue="0.26666666666666666" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GeY-JT-GtT">
+                    <rect key="frame" x="16" y="98" width="382" height="36.5"/>
+                    <attributedString key="attributedText">
+                        <fragment content="请将设备固定,头部置于参考位置,视频中以体现完整的上半身及乐器为宜,建议摄像头距离考生约">
+                            <attributes>
+                                <color key="NSColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                                <font key="NSFont" size="14" name=".PingFangSC-Regular"/>
+                                <paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4" tighteningFactorForTruncation="0.0"/>
+                            </attributes>
+                        </fragment>
+                        <fragment content="1">
+                            <attributes>
+                                <color key="NSColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                                <font key="NSFont" metaFont="menu" size="14"/>
+                                <paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4" tighteningFactorForTruncation="0.0"/>
+                            </attributes>
+                        </fragment>
+                        <fragment content="米距离。">
+                            <attributes>
+                                <color key="NSColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                                <font key="NSFont" size="14" name=".PingFangSC-Regular"/>
+                                <paragraphStyle key="NSParagraphStyle" alignment="natural" lineBreakMode="wordWrapping" baseWritingDirection="natural" lineSpacing="4" tighteningFactorForTruncation="0.0"/>
+                            </attributes>
+                        </fragment>
+                    </attributedString>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="guide_firstPage" translatesAutoresizingMaskIntoConstraints="NO" id="YFW-YW-mhk">
+                    <rect key="frame" x="22" y="186.5" width="370" height="203"/>
+                    <constraints>
+                        <constraint firstAttribute="width" secondItem="YFW-YW-mhk" secondAttribute="height" multiplier="370:203" id="8LP-7g-Ydi"/>
+                    </constraints>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="横屏" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wwt-El-kZ7">
+                    <rect key="frame" x="190.5" y="154.5" width="33" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="22" id="zCo-8V-w5H"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                    <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="epm-Jt-ixd">
+                    <rect key="frame" x="190.5" y="409.5" width="33" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="22" id="i9u-Ql-R25"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                    <color key="textColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="guide_secondPage" translatesAutoresizingMaskIntoConstraints="NO" id="3Zp-pd-XZ3">
+                    <rect key="frame" x="22" y="441.5" width="370" height="409"/>
+                    <constraints>
+                        <constraint firstAttribute="width" secondItem="3Zp-pd-XZ3" secondAttribute="height" multiplier="370:409" id="RZd-gv-fhO"/>
+                    </constraints>
+                </imageView>
+            </subviews>
+            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <constraints>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="3Zp-pd-XZ3" secondAttribute="trailing" constant="22" id="0WC-yx-O99"/>
+                <constraint firstItem="GeY-JT-GtT" firstAttribute="top" secondItem="ev7-3d-bgm" secondAttribute="bottom" constant="8" id="4hS-SF-nit"/>
+                <constraint firstItem="epm-Jt-ixd" firstAttribute="top" secondItem="YFW-YW-mhk" secondAttribute="bottom" constant="20" id="5ZO-Jo-TDq"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="YFW-YW-mhk" secondAttribute="trailing" constant="22" id="9hg-LM-XH5"/>
+                <constraint firstItem="GeY-JT-GtT" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="16" id="EVu-0e-3o2"/>
+                <constraint firstItem="YFW-YW-mhk" firstAttribute="top" secondItem="wwt-El-kZ7" secondAttribute="bottom" constant="10" id="HPM-ic-saL"/>
+                <constraint firstItem="ev7-3d-bgm" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="21" id="RMv-7G-1vX"/>
+                <constraint firstItem="3Zp-pd-XZ3" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="22" id="S8X-ja-gD8"/>
+                <constraint firstItem="ev7-3d-bgm" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="16" id="SGB-Gs-AWr"/>
+                <constraint firstItem="epm-Jt-ixd" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Sar-dr-44n"/>
+                <constraint firstItem="3Zp-pd-XZ3" firstAttribute="top" secondItem="epm-Jt-ixd" secondAttribute="bottom" constant="10" id="eA0-Sv-9D2"/>
+                <constraint firstItem="YFW-YW-mhk" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="22" id="eF3-if-pVN"/>
+                <constraint firstItem="wwt-El-kZ7" firstAttribute="top" secondItem="GeY-JT-GtT" secondAttribute="bottom" constant="20" id="r3b-7G-9jE"/>
+                <constraint firstItem="wwt-El-kZ7" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="ryw-e1-Wbc"/>
+                <constraint firstAttribute="trailing" secondItem="GeY-JT-GtT" secondAttribute="trailing" constant="16" id="u3G-nK-2ey"/>
+            </constraints>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <point key="canvasLocation" x="131.8840579710145" y="104.79910714285714"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="guide_firstPage" width="332" height="203"/>
+        <image name="guide_secondPage" width="332" height="409"/>
+    </resources>
+</document>

+ 3 - 3
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.m

@@ -89,7 +89,7 @@
             self.twoButtonView.hidden = YES;
             
             [self.titleLabel setText:@"设备检测"];
-            [self.descLabel setText:@"为确保您能正常上课,现在进行声音测试"];
+            [self.descLabel setText:@"为确保您能正常考试,现在进行声音测试"];
             [self.followLabel setText:@""];
             [self.oneButton setTitle:@"开始测试" forState:UIControlStateNormal];
             
@@ -151,7 +151,7 @@
             [self.linefive setImage:[UIImage imageNamed:@"check_line"]];
             [self.statusSix setImage:[UIImage imageNamed:@"checking"]];
             [self.titleLabel setText:@"通知权限"];
-            [self.descLabel setText:@"通知权限已开启,再也不会错过上课提醒了"];
+            [self.descLabel setText:@"通知权限已开启,再也不会错过考试提醒了"];
             [self.followLabel setText:@""];
             self.twoButtonView.hidden = YES;
             [self.oneButton setTitle:@"完成测试" forState:UIControlStateNormal];
@@ -303,7 +303,7 @@
     self.currentIndex = 4;
     if ([self checkNetworkAvaiable]) {
         [self.statusFive setImage:[UIImage imageNamed:@"check_success"]];
-        [self.titleLabel setText:@"网络测成功"];
+        [self.titleLabel setText:@"网络测成功"];
         [self.descLabel setText:@"您当前的网络状态良好"];
     }
     else {

+ 8 - 10
MusicGradeExam/MusicGradeExam/UI/UserCenter/DeviceCheck/DeviceCheckView.xib

@@ -1,11 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
-    <device id="retina6_1" orientation="portrait">
-        <adaptation id="fullscreen"/>
-    </device>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -166,7 +164,7 @@
                             <subviews>
                                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AQ9-e9-PS8">
                                     <rect key="frame" x="60" y="0.0" width="200" height="45"/>
-                                    <color key="backgroundColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="45" id="mqD-6p-bqe"/>
                                     </constraints>
@@ -195,7 +193,7 @@
                             <subviews>
                                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SPT-Hd-ERF">
                                     <rect key="frame" x="172" y="0.0" width="120" height="45"/>
-                                    <color key="backgroundColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
                                     <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                     <state key="normal" title="有声音"/>
                                     <userDefinedRuntimeAttributes>
@@ -211,7 +209,7 @@
                                     <rect key="frame" x="28" y="0.0" width="120" height="45"/>
                                     <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
                                     <state key="normal" title="无声音">
-                                        <color key="titleColor" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <color key="titleColor" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                     </state>
                                     <userDefinedRuntimeAttributes>
                                         <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
@@ -221,7 +219,7 @@
                                             <real key="value" value="22.5"/>
                                         </userDefinedRuntimeAttribute>
                                         <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
-                                            <color key="value" red="0.078431372550000003" green="0.57254901960000004" blue="0.54117647059999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                            <color key="value" red="0.1764705882352941" green="0.7803921568627451" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                         </userDefinedRuntimeAttribute>
                                     </userDefinedRuntimeAttributes>
                                     <connections>
@@ -308,7 +306,7 @@
     </objects>
     <resources>
         <image name="check_cancle" width="14" height="14"/>
-        <image name="check_device" width="141" height="100"/>
+        <image name="check_device" width="150" height="118"/>
         <image name="check_dotted" width="30" height="1"/>
         <image name="check_wait" width="16" height="16"/>
         <image name="checking" width="16" height="16"/>