Forráskód Böngészése

全功能开发完毕,并清理了明显的问题

100Years 3 hónapja
szülő
commit
e531998a82
100 módosított fájl, 2185 hozzáadás és 92 törlés
  1. 132 16
      Girly.xcodeproj/project.pbxproj
  2. 30 10
      Girly.xcodeproj/xcshareddata/xcschemes/Girly.xcscheme
  3. 9 1
      Girly.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist
  4. BIN
      Girly/Assets.xcassets/App-Icon.imageset/App-Icon 1.png
  5. 21 0
      Girly/Assets.xcassets/App-Icon.imageset/Contents.json
  6. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-1024.png
  7. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png
  8. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png
  9. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
  10. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
  11. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png
  12. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png
  13. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
  14. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
  15. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
  16. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
  17. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png
  18. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png
  19. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png
  20. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
  21. BIN
      Girly/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
  22. 6 0
      Girly/Assets.xcassets/Flash/Contents.json
  23. 22 0
      Girly/Assets.xcassets/Flash/flashlight_light.imageset/Contents.json
  24. BIN
      Girly/Assets.xcassets/Flash/flashlight_light.imageset/flashlight_light@2x.png
  25. BIN
      Girly/Assets.xcassets/Flash/flashlight_light.imageset/flashlight_light@3x.png
  26. 22 0
      Girly/Assets.xcassets/Flash/flashlight_off.imageset/Contents.json
  27. BIN
      Girly/Assets.xcassets/Flash/flashlight_off.imageset/flashlight_off@2x.png
  28. BIN
      Girly/Assets.xcassets/Flash/flashlight_off.imageset/flashlight_off@3x.png
  29. 22 0
      Girly/Assets.xcassets/Flash/flashlight_on.imageset/Contents.json
  30. BIN
      Girly/Assets.xcassets/Flash/flashlight_on.imageset/flashlight_on@2x.png
  31. BIN
      Girly/Assets.xcassets/Flash/flashlight_on.imageset/flashlight_on@3x.png
  32. 22 0
      Girly/Assets.xcassets/Flash/launch_logo1.imageset/Contents.json
  33. BIN
      Girly/Assets.xcassets/Flash/launch_logo1.imageset/launch_logo1@2x.png
  34. BIN
      Girly/Assets.xcassets/Flash/launch_logo1.imageset/launch_logo1@3x.png
  35. 22 0
      Girly/Assets.xcassets/Flash/light_alarm.imageset/Contents.json
  36. BIN
      Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@2x.png
  37. BIN
      Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@3x.png
  38. 22 0
      Girly/Assets.xcassets/Flash/light_disco.imageset/Contents.json
  39. BIN
      Girly/Assets.xcassets/Flash/light_disco.imageset/light_disco@2.png
  40. BIN
      Girly/Assets.xcassets/Flash/light_disco.imageset/light_disco@3x.png
  41. 22 0
      Girly/Assets.xcassets/Flash/light_flash.imageset/Contents.json
  42. BIN
      Girly/Assets.xcassets/Flash/light_flash.imageset/light_flash@2x.png
  43. BIN
      Girly/Assets.xcassets/Flash/light_flash.imageset/light_flash@3x.png
  44. 22 0
      Girly/Assets.xcassets/Flash/light_night.imageset/Contents.json
  45. BIN
      Girly/Assets.xcassets/Flash/light_night.imageset/light_night@2x.png
  46. BIN
      Girly/Assets.xcassets/Flash/light_night.imageset/light_night@3x.png
  47. 22 0
      Girly/Assets.xcassets/Flash/light_warning.imageset/Contents.json
  48. BIN
      Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@2x.png
  49. BIN
      Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@3x.png
  50. 22 0
      Girly/Assets.xcassets/Flash/nav_title_flash.imageset/Contents.json
  51. BIN
      Girly/Assets.xcassets/Flash/nav_title_flash.imageset/nav_title_flash@2x.png
  52. BIN
      Girly/Assets.xcassets/Flash/nav_title_flash.imageset/nav_title_flash@3x.png
  53. 22 0
      Girly/Assets.xcassets/Flash/nopermission.imageset/Contents.json
  54. BIN
      Girly/Assets.xcassets/Flash/nopermission.imageset/nopermission@2x.png
  55. BIN
      Girly/Assets.xcassets/Flash/nopermission.imageset/nopermission@3x.png
  56. 6 0
      Girly/Assets.xcassets/Setting/Contents.json
  57. 22 0
      Girly/Assets.xcassets/Setting/nav_title_setting.imageset/Contents.json
  58. BIN
      Girly/Assets.xcassets/Setting/nav_title_setting.imageset/nav_title_setting@2x.png
  59. BIN
      Girly/Assets.xcassets/Setting/nav_title_setting.imageset/nav_title_setting@3x.png
  60. 22 0
      Girly/Assets.xcassets/icon/navi_back_gary.imageset/Contents.json
  61. BIN
      Girly/Assets.xcassets/icon/navi_back_gary.imageset/navi_back_gary@2x.png
  62. BIN
      Girly/Assets.xcassets/icon/navi_back_gary.imageset/navi_back_gary@3x.png
  63. 22 0
      Girly/Assets.xcassets/icon/navi_back_white.imageset/Contents.json
  64. BIN
      Girly/Assets.xcassets/icon/navi_back_white.imageset/navi_back_white@2x.png
  65. BIN
      Girly/Assets.xcassets/icon/navi_back_white.imageset/navi_back_white@3x.png
  66. 22 0
      Girly/Assets.xcassets/icon/reduceBrightness.imageset/Contents.json
  67. BIN
      Girly/Assets.xcassets/icon/reduceBrightness.imageset/reduceBrightness@2x.png
  68. BIN
      Girly/Assets.xcassets/icon/reduceBrightness.imageset/reduceBrightness@3x.png
  69. 22 0
      Girly/Assets.xcassets/icon/slider_thumb.imageset/Contents.json
  70. BIN
      Girly/Assets.xcassets/icon/slider_thumb.imageset/slider_thumb@2x.png
  71. BIN
      Girly/Assets.xcassets/icon/slider_thumb.imageset/slider_thumb@3x.png
  72. 22 0
      Girly/Assets.xcassets/icon/white_right_arrow.imageset/Contents.json
  73. BIN
      Girly/Assets.xcassets/icon/white_right_arrow.imageset/white_right_arrow@2x.png
  74. BIN
      Girly/Assets.xcassets/icon/white_right_arrow.imageset/white_right_arrow@3x.png
  75. BIN
      Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@2x.png
  76. BIN
      Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@3x.png
  77. BIN
      Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@2x.png
  78. BIN
      Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@3x.png
  79. 13 9
      Girly/Base.lproj/LaunchScreen.storyboard
  80. 124 1
      Girly/Business/Flash/TSFlashVC.swift
  81. 251 0
      Girly/Business/Flash/VC/TSDiscoLightVC.swift
  82. 205 0
      Girly/Business/Flash/VC/TSFlashLightVC.swift
  83. 279 0
      Girly/Business/Flash/VC/TSNightLightVC.swift
  84. 110 0
      Girly/Business/Flash/VC/TSWarningLightVC.swift
  85. 97 0
      Girly/Business/Flash/VC/View/TSFlashSetToolView.swift
  86. 119 0
      Girly/Business/Flash/VC/View/TSFlashSliderView.swift
  87. 81 0
      Girly/Business/Flash/VC/View/TSTimerView.swift
  88. 1 0
      Girly/Business/Light/TSLightVC.swift
  89. 6 0
      Girly/Business/Light/VC/TSFullScreenVC.swift
  90. 7 3
      Girly/Business/Light/VC/TSLightGradientVC.swift
  91. 1 1
      Girly/Business/Light/VC/TSLightShapeVC.swift
  92. 2 2
      Girly/Business/Light/VC/TSLightSolidColorVC.swift
  93. 3 4
      Girly/Business/Light/VC/View/TSColorPickerView.swift
  94. 4 0
      Girly/Business/Light/VC/View/TSLightGradientToolView.swift
  95. 147 3
      Girly/Business/Light/VC/View/TSLightShapeToolView.swift
  96. 4 6
      Girly/Business/Light/VC/View/TSLightShapeView.swift
  97. 2 2
      Girly/Business/Light/VC/View/TSLightSolidColorToolView.swift
  98. 1 1
      Girly/Business/Mirror/TSMirrorVC.swift
  99. 72 33
      Girly/Business/Mirror/View/TSMirrorCameraView.swift
  100. 78 0
      Girly/Business/Setting/TSSettingCell.swift

+ 132 - 16
Girly.xcodeproj/project.pbxproj

@@ -15,7 +15,6 @@
 		A8BA8D172D2D06B7006CB966 /* UIViewController+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D022D2D06B7006CB966 /* UIViewController+Ex.swift */; };
 		A8BA8D182D2D06B7006CB966 /* Date+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D062D2D06B7006CB966 /* Date+Ex.swift */; };
 		A8BA8D192D2D06B7006CB966 /* CGFloat+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D142D2D06B7006CB966 /* CGFloat+Ex.swift */; };
-		A8BA8D1A2D2D06B7006CB966 /* UICollectionView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D0A2D2D06B7006CB966 /* UICollectionView+Ex.swift */; };
 		A8BA8D1B2D2D06B7006CB966 /* UITableView+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D0C2D2D06B7006CB966 /* UITableView+Ex.swift */; };
 		A8BA8D1C2D2D06B7006CB966 /* UIImage+Ex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D082D2D06B7006CB966 /* UIImage+Ex.swift */; };
 		A8BA8D1D2D2D06B7006CB966 /* UIScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D152D2D06B7006CB966 /* UIScreen.swift */; };
@@ -72,8 +71,24 @@
 		A8BA8D832D2F7392006CB966 /* TSMirrorShapePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D822D2F7391006CB966 /* TSMirrorShapePickerView.swift */; };
 		A8BA8D872D2F7752006CB966 /* TSMirrorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D862D2F774F006CB966 /* TSMirrorModel.swift */; };
 		A8BA8D892D2F77BF006CB966 /* MirrorShape.json in Resources */ = {isa = PBXBuildFile; fileRef = A8BA8D882D2F77BF006CB966 /* MirrorShape.json */; };
-		A8BA8D8C2D2F9B40006CB966 /* CameraManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D8B2D2F9B40006CB966 /* CameraManager.swift */; };
 		A8BA8D8E2D2F9BBB006CB966 /* TSMirrorCameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D8D2D2F9BAE006CB966 /* TSMirrorCameraView.swift */; };
+		A8BA8D912D2FCBBD006CB966 /* TSSimpleTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D8F2D2FCBBD006CB966 /* TSSimpleTableView.swift */; };
+		A8BA8D942D2FCD37006CB966 /* TSBusinessWebVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D922D2FCD37006CB966 /* TSBusinessWebVC.swift */; };
+		A8BA8D972D2FE405006CB966 /* TSWarningLightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D962D2FE3F1006CB966 /* TSWarningLightVC.swift */; };
+		A8BA8D992D2FE427006CB966 /* TSNightLightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D982D2FE41E006CB966 /* TSNightLightVC.swift */; };
+		A8BA8D9B2D2FE446006CB966 /* TSDiscoLightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D9A2D2FE43D006CB966 /* TSDiscoLightVC.swift */; };
+		A8BA8D9D2D2FE45F006CB966 /* TSFlashLightVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D9C2D2FE456006CB966 /* TSFlashLightVC.swift */; };
+		A8BA8DA02D30B5CA006CB966 /* TSFlashSetToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8D9F2D30B5B3006CB966 /* TSFlashSetToolView.swift */; };
+		A8BA8DA22D30BA8A006CB966 /* TSFlashSliderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DA12D30BA79006CB966 /* TSFlashSliderView.swift */; };
+		A8BA8DA52D30C6B9006CB966 /* TSCustomTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DA42D30C6B8006CB966 /* TSCustomTimer.swift */; };
+		A8BA8DA82D30D290006CB966 /* TSAudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DA72D30D28F006CB966 /* TSAudioPlayer.swift */; };
+		A8BA8DAC2D30EE6F006CB966 /* AlarmSound.MP3 in Resources */ = {isa = PBXBuildFile; fileRef = A8BA8DAB2D30EE6F006CB966 /* AlarmSound.MP3 */; };
+		A8BA8DAF2D30F12B006CB966 /* TSFlashlightController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DAE2D30F12A006CB966 /* TSFlashlightController.swift */; };
+		A8BA8DB12D311C51006CB966 /* TSFlashlightTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB02D311C4D006CB966 /* TSFlashlightTool.swift */; };
+		A8BA8DB32D312E65006CB966 /* TimePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB22D312E64006CB966 /* TimePickerViewController.swift */; };
+		A8BA8DB52D31FF87006CB966 /* TSTimerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB42D31FF85006CB966 /* TSTimerView.swift */; };
+		A8BA8DB72D3203C3006CB966 /* TSSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DB62D3203BF006CB966 /* TSSettingCell.swift */; };
+		A8BA8DCA2D328228006CB966 /* CameraManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BA8DC92D328228006CB966 /* CameraManager.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
@@ -93,7 +108,6 @@
 		A8BA8D072D2D06B7006CB966 /* Dictionary+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+Ex.swift"; sourceTree = "<group>"; };
 		A8BA8D082D2D06B7006CB966 /* UIImage+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Ex.swift"; sourceTree = "<group>"; };
 		A8BA8D092D2D06B7006CB966 /* Array+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Ex.swift"; sourceTree = "<group>"; };
-		A8BA8D0A2D2D06B7006CB966 /* UICollectionView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Ex.swift"; sourceTree = "<group>"; };
 		A8BA8D0B2D2D06B7006CB966 /* UIDevice+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Extension.swift"; sourceTree = "<group>"; };
 		A8BA8D0C2D2D06B7006CB966 /* UITableView+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Ex.swift"; sourceTree = "<group>"; };
 		A8BA8D0D2D2D06B7006CB966 /* UIFont+Ex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Ex.swift"; sourceTree = "<group>"; };
@@ -145,8 +159,24 @@
 		A8BA8D822D2F7391006CB966 /* TSMirrorShapePickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSMirrorShapePickerView.swift; sourceTree = "<group>"; };
 		A8BA8D862D2F774F006CB966 /* TSMirrorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSMirrorModel.swift; sourceTree = "<group>"; };
 		A8BA8D882D2F77BF006CB966 /* MirrorShape.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = MirrorShape.json; sourceTree = "<group>"; };
-		A8BA8D8B2D2F9B40006CB966 /* CameraManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraManager.swift; sourceTree = "<group>"; };
 		A8BA8D8D2D2F9BAE006CB966 /* TSMirrorCameraView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSMirrorCameraView.swift; sourceTree = "<group>"; };
+		A8BA8D8F2D2FCBBD006CB966 /* TSSimpleTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSimpleTableView.swift; sourceTree = "<group>"; };
+		A8BA8D922D2FCD37006CB966 /* TSBusinessWebVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSBusinessWebVC.swift; sourceTree = "<group>"; };
+		A8BA8D962D2FE3F1006CB966 /* TSWarningLightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSWarningLightVC.swift; sourceTree = "<group>"; };
+		A8BA8D982D2FE41E006CB966 /* TSNightLightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSNightLightVC.swift; sourceTree = "<group>"; };
+		A8BA8D9A2D2FE43D006CB966 /* TSDiscoLightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSDiscoLightVC.swift; sourceTree = "<group>"; };
+		A8BA8D9C2D2FE456006CB966 /* TSFlashLightVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFlashLightVC.swift; sourceTree = "<group>"; };
+		A8BA8D9F2D30B5B3006CB966 /* TSFlashSetToolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFlashSetToolView.swift; sourceTree = "<group>"; };
+		A8BA8DA12D30BA79006CB966 /* TSFlashSliderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFlashSliderView.swift; sourceTree = "<group>"; };
+		A8BA8DA42D30C6B8006CB966 /* TSCustomTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSCustomTimer.swift; sourceTree = "<group>"; };
+		A8BA8DA72D30D28F006CB966 /* TSAudioPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAudioPlayer.swift; sourceTree = "<group>"; };
+		A8BA8DAB2D30EE6F006CB966 /* AlarmSound.MP3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = AlarmSound.MP3; sourceTree = "<group>"; };
+		A8BA8DAE2D30F12A006CB966 /* TSFlashlightController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFlashlightController.swift; sourceTree = "<group>"; };
+		A8BA8DB02D311C4D006CB966 /* TSFlashlightTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSFlashlightTool.swift; sourceTree = "<group>"; };
+		A8BA8DB22D312E64006CB966 /* TimePickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimePickerViewController.swift; sourceTree = "<group>"; };
+		A8BA8DB42D31FF85006CB966 /* TSTimerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTimerView.swift; sourceTree = "<group>"; };
+		A8BA8DB62D3203BF006CB966 /* TSSettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSettingCell.swift; sourceTree = "<group>"; };
+		A8BA8DC92D328228006CB966 /* CameraManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraManager.swift; sourceTree = "<group>"; };
 		BBACC86FF0E1F3F5E9AAF63F /* Pods_Girly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Girly.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -200,6 +230,7 @@
 		A8BA8CE92D2D061B006CB966 /* Business */ = {
 			isa = PBXGroup;
 			children = (
+				A8BA8D932D2FCD37006CB966 /* TSBusinessWebVC */,
 				A8BA8D002D2D066F006CB966 /* Setting */,
 				A8BA8CFF2D2D0664006CB966 /* Flash */,
 				A8BA8CFE2D2D0656006CB966 /* Mirror */,
@@ -245,6 +276,7 @@
 		A8BA8CFF2D2D0664006CB966 /* Flash */ = {
 			isa = PBXGroup;
 			children = (
+				A8BA8D952D2FE3EA006CB966 /* VC */,
 				A8BA8D412D2D1F63006CB966 /* TSFlashVC.swift */,
 			);
 			path = Flash;
@@ -254,6 +286,7 @@
 			isa = PBXGroup;
 			children = (
 				A8BA8D3F2D2D1F2A006CB966 /* TSSettingVC.swift */,
+				A8BA8DB62D3203BF006CB966 /* TSSettingCell.swift */,
 			);
 			path = Setting;
 			sourceTree = "<group>";
@@ -261,6 +294,10 @@
 		A8BA8D012D2D06A6006CB966 /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				A8BA8DAD2D30F112006CB966 /* TSFlashlightController */,
+				A8BA8DA62D30D283006CB966 /* TSAudioPlayer */,
+				A8BA8DA32D30C6B0006CB966 /* TSCustomTimer */,
+				A8BA8D902D2FCBBD006CB966 /* UITableView+TSItemModel */,
 				A8BA8D7C2D2E99A6006CB966 /* ViewTool */,
 				A8BA8D542D2E08C8006CB966 /* ThirdParty */,
 				A8BA8D362D2D06C8006CB966 /* BaseClass */,
@@ -281,7 +318,6 @@
 				A8BA8D072D2D06B7006CB966 /* Dictionary+Ex.swift */,
 				A8BA8D082D2D06B7006CB966 /* UIImage+Ex.swift */,
 				A8BA8D092D2D06B7006CB966 /* Array+Ex.swift */,
-				A8BA8D0A2D2D06B7006CB966 /* UICollectionView+Ex.swift */,
 				A8BA8D0B2D2D06B7006CB966 /* UIDevice+Extension.swift */,
 				A8BA8D0C2D2D06B7006CB966 /* UITableView+Ex.swift */,
 				A8BA8D0D2D2D06B7006CB966 /* UIFont+Ex.swift */,
@@ -324,6 +360,7 @@
 			isa = PBXGroup;
 			children = (
 				A8BA8D482D2D37EB006CB966 /* TSConfig.swift */,
+				A8BA8DAB2D30EE6F006CB966 /* AlarmSound.MP3 */,
 			);
 			path = DataManger;
 			sourceTree = "<group>";
@@ -357,7 +394,7 @@
 		A8BA8D542D2E08C8006CB966 /* ThirdParty */ = {
 			isa = PBXGroup;
 			children = (
-				A8BA8D8A2D2F9B35006CB966 /* CameraManager */,
+				A8BA8DC82D3281F7006CB966 /* CameraManager */,
 				A8BA8D5D2D2E0932006CB966 /* ColorSlider */,
 			);
 			path = ThirdParty;
@@ -399,6 +436,7 @@
 		A8BA8D7C2D2E99A6006CB966 /* ViewTool */ = {
 			isa = PBXGroup;
 			children = (
+				A8BA8DB22D312E64006CB966 /* TimePickerViewController.swift */,
 				A8BA8D7D2D2E99B8006CB966 /* TSViewTool.swift */,
 			);
 			path = ViewTool;
@@ -423,10 +461,73 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
-		A8BA8D8A2D2F9B35006CB966 /* CameraManager */ = {
+		A8BA8D902D2FCBBD006CB966 /* UITableView+TSItemModel */ = {
 			isa = PBXGroup;
 			children = (
-				A8BA8D8B2D2F9B40006CB966 /* CameraManager.swift */,
+				A8BA8D8F2D2FCBBD006CB966 /* TSSimpleTableView.swift */,
+			);
+			path = "UITableView+TSItemModel";
+			sourceTree = "<group>";
+		};
+		A8BA8D932D2FCD37006CB966 /* TSBusinessWebVC */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8D922D2FCD37006CB966 /* TSBusinessWebVC.swift */,
+			);
+			path = TSBusinessWebVC;
+			sourceTree = "<group>";
+		};
+		A8BA8D952D2FE3EA006CB966 /* VC */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8D9E2D30B58C006CB966 /* View */,
+				A8BA8D9C2D2FE456006CB966 /* TSFlashLightVC.swift */,
+				A8BA8D9A2D2FE43D006CB966 /* TSDiscoLightVC.swift */,
+				A8BA8D982D2FE41E006CB966 /* TSNightLightVC.swift */,
+				A8BA8D962D2FE3F1006CB966 /* TSWarningLightVC.swift */,
+			);
+			path = VC;
+			sourceTree = "<group>";
+		};
+		A8BA8D9E2D30B58C006CB966 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8DB42D31FF85006CB966 /* TSTimerView.swift */,
+				A8BA8DA12D30BA79006CB966 /* TSFlashSliderView.swift */,
+				A8BA8D9F2D30B5B3006CB966 /* TSFlashSetToolView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		A8BA8DA32D30C6B0006CB966 /* TSCustomTimer */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8DA42D30C6B8006CB966 /* TSCustomTimer.swift */,
+			);
+			path = TSCustomTimer;
+			sourceTree = "<group>";
+		};
+		A8BA8DA62D30D283006CB966 /* TSAudioPlayer */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8DA72D30D28F006CB966 /* TSAudioPlayer.swift */,
+			);
+			path = TSAudioPlayer;
+			sourceTree = "<group>";
+		};
+		A8BA8DAD2D30F112006CB966 /* TSFlashlightController */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8DB02D311C4D006CB966 /* TSFlashlightTool.swift */,
+				A8BA8DAE2D30F12A006CB966 /* TSFlashlightController.swift */,
+			);
+			path = TSFlashlightController;
+			sourceTree = "<group>";
+		};
+		A8BA8DC82D3281F7006CB966 /* CameraManager */ = {
+			isa = PBXGroup;
+			children = (
+				A8BA8DC92D328228006CB966 /* CameraManager.swift */,
 			);
 			path = CameraManager;
 			sourceTree = "<group>";
@@ -494,6 +595,7 @@
 			files = (
 				A8BA8D892D2F77BF006CB966 /* MirrorShape.json in Resources */,
 				A8BA8D732D2E4863006CB966 /* SolidColors.json in Resources */,
+				A8BA8DAC2D30EE6F006CB966 /* AlarmSound.MP3 in Resources */,
 				A8BA8CF42D2D061B006CB966 /* Assets.xcassets in Resources */,
 				A8BA8CF62D2D061B006CB966 /* LaunchScreen.storyboard in Resources */,
 				A8BA8D752D2E49FA006CB966 /* GradientColors.json in Resources */,
@@ -551,13 +653,16 @@
 			buildActionMask = 2147483647;
 			files = (
 				A8BA8D6C2D2E2F30006CB966 /* TSColorPickerView.swift in Sources */,
+				A8BA8DB32D312E65006CB966 /* TimePickerViewController.swift in Sources */,
 				A8BA8D172D2D06B7006CB966 /* UIViewController+Ex.swift in Sources */,
 				A8BA8D182D2D06B7006CB966 /* Date+Ex.swift in Sources */,
 				A8BA8D6A2D2E09E9006CB966 /* TSLightGradientToolView.swift in Sources */,
+				A8BA8DB12D311C51006CB966 /* TSFlashlightTool.swift in Sources */,
 				A8BA8D192D2D06B7006CB966 /* CGFloat+Ex.swift in Sources */,
 				A8BA8D2D2D2D06C1006CB966 /* GlobalImports.swift in Sources */,
-				A8BA8D1A2D2D06B7006CB966 /* UICollectionView+Ex.swift in Sources */,
+				A8BA8D9D2D2FE45F006CB966 /* TSFlashLightVC.swift in Sources */,
 				A8BA8D1B2D2D06B7006CB966 /* UITableView+Ex.swift in Sources */,
+				A8BA8D942D2FCD37006CB966 /* TSBusinessWebVC.swift in Sources */,
 				A8BA8D1C2D2D06B7006CB966 /* UIImage+Ex.swift in Sources */,
 				A8BA8D372D2D06C8006CB966 /* TSBaseNavigationC.swift in Sources */,
 				A8BA8D5E2D2E0932006CB966 /* PreviewView.swift in Sources */,
@@ -568,7 +673,11 @@
 				A8BA8D622D2E0932006CB966 /* GradientView.swift in Sources */,
 				A8BA8D632D2E0932006CB966 /* ColorSlider.swift in Sources */,
 				A8BA8D642D2E0932006CB966 /* HSBColor.swift in Sources */,
+				A8BA8DAF2D30F12B006CB966 /* TSFlashlightController.swift in Sources */,
+				A8BA8DB52D31FF87006CB966 /* TSTimerView.swift in Sources */,
 				A8BA8D382D2D06C8006CB966 /* TSBaseModel.swift in Sources */,
+				A8BA8DA22D30BA8A006CB966 /* TSFlashSliderView.swift in Sources */,
+				A8BA8D9B2D2FE446006CB966 /* TSDiscoLightVC.swift in Sources */,
 				A8BA8D832D2F7392006CB966 /* TSMirrorShapePickerView.swift in Sources */,
 				A8BA8D7E2D2E99B8006CB966 /* TSViewTool.swift in Sources */,
 				A8BA8D392D2D06C8006CB966 /* TSBaseNavigationBarView.swift in Sources */,
@@ -582,14 +691,21 @@
 				A8BA8D532D2D4598006CB966 /* TSLightColorPaletteView.swift in Sources */,
 				A8BA8D1D2D2D06B7006CB966 /* UIScreen.swift in Sources */,
 				A8BA8D1E2D2D06B7006CB966 /* UIDevice+Extension.swift in Sources */,
+				A8BA8D992D2FE427006CB966 /* TSNightLightVC.swift in Sources */,
 				A8BA8D502D2D3D56006CB966 /* TSLightShapeVC.swift in Sources */,
 				A8BA8D1F2D2D06B7006CB966 /* UserDefault+Ex.swift in Sources */,
+				A8BA8DA02D30B5CA006CB966 /* TSFlashSetToolView.swift in Sources */,
 				A8BA8D462D2D1F82006CB966 /* TSLightVC.swift in Sources */,
+				A8BA8DCA2D328228006CB966 /* CameraManager.swift in Sources */,
 				A8BA8D492D2D37EB006CB966 /* TSConfig.swift in Sources */,
 				A8BA8D202D2D06B7006CB966 /* AVAsset+Ex.swift in Sources */,
+				A8BA8D912D2FCBBD006CB966 /* TSSimpleTableView.swift in Sources */,
+				A8BA8DA82D30D290006CB966 /* TSAudioPlayer.swift in Sources */,
 				A8BA8D212D2D06B7006CB966 /* NSString+Ex.swift in Sources */,
 				A8BA8D222D2D06B7006CB966 /* Array+Ex.swift in Sources */,
 				A8BA8D442D2D1F77006CB966 /* TSMirrorVC.swift in Sources */,
+				A8BA8D972D2FE405006CB966 /* TSWarningLightVC.swift in Sources */,
+				A8BA8DB72D3203C3006CB966 /* TSSettingCell.swift in Sources */,
 				A8BA8D232D2D06B7006CB966 /* UILabel+Ex.swift in Sources */,
 				A8BA8D682D2E09B7006CB966 /* TSLightSolidColorToolView.swift in Sources */,
 				A8BA8D242D2D06B7006CB966 /* UIFont+Ex.swift in Sources */,
@@ -600,8 +716,8 @@
 				A8BA8D6F2D2E2FB7006CB966 /* TSLightModel.swift in Sources */,
 				A8BA8D4C2D2D3D16006CB966 /* TSLightSolidColorVC.swift in Sources */,
 				A8BA8D272D2D06B7006CB966 /* UIColor+Ex.swift in Sources */,
-				A8BA8D8C2D2F9B40006CB966 /* CameraManager.swift in Sources */,
 				A8BA8D422D2D1F6B006CB966 /* TSFlashVC.swift in Sources */,
+				A8BA8DA52D30C6B9006CB966 /* TSCustomTimer.swift in Sources */,
 				A8BA8D282D2D06B7006CB966 /* Int+Ex.swift in Sources */,
 				A8BA8D292D2D06B7006CB966 /* Dictionary+Ex.swift in Sources */,
 				A8BA8D2A2D2D06B7006CB966 /* UIImageView+Ex.swift in Sources */,
@@ -639,7 +755,7 @@
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = Girly/Info.plist;
-				INFOPLIST_KEY_NSCameraUsageDescription = "App will use your camera to take pictures";
+				INFOPLIST_KEY_NSCameraUsageDescription = "To use your camera as a mirror";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
@@ -649,8 +765,8 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
-				PRODUCT_BUNDLE_IDENTIFIER = com.tsyh.Girly;
+				MARKETING_VERSION = 1.0.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
 				SUPPORTS_MACCATALYST = NO;
@@ -674,7 +790,7 @@
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = Girly/Info.plist;
-				INFOPLIST_KEY_NSCameraUsageDescription = "App will use your camera to take pictures";
+				INFOPLIST_KEY_NSCameraUsageDescription = "To use your camera as a mirror";
 				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
 				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
 				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
@@ -684,8 +800,8 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
-				PRODUCT_BUNDLE_IDENTIFIER = com.tsyh.Girly;
+				MARKETING_VERSION = 1.0.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.girl.music.wallpaper;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
 				SUPPORTS_MACCATALYST = NO;

+ 30 - 10
Pods/Pods.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/MJRefresh.xcscheme → Girly.xcodeproj/xcshareddata/xcschemes/Girly.xcscheme

@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1600"
-   version = "1.3">
+   LastUpgradeVersion = "1620"
+   version = "1.7">
    <BuildAction
       parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
+      buildImplicitDependencies = "YES"
+      buildArchitectures = "Automatic">
       <BuildActionEntries>
          <BuildActionEntry
             buildForTesting = "YES"
@@ -14,10 +15,10 @@
             buildForAnalyzing = "YES">
             <BuildableReference
                BuildableIdentifier = "primary"
-               BlueprintIdentifier = "6868056D761E163D10FDAF8CF1C4D9B8"
-               BuildableName = "MJRefresh.framework"
-               BlueprintName = "MJRefresh"
-               ReferencedContainer = "container:Pods.xcodeproj">
+               BlueprintIdentifier = "A8BA8CCF2D2D0558006CB966"
+               BuildableName = "Girly.app"
+               BlueprintName = "Girly"
+               ReferencedContainer = "container:Girly.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
       </BuildActionEntries>
@@ -26,9 +27,8 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      shouldAutocreateTestPlan = "YES">
    </TestAction>
    <LaunchAction
       buildConfiguration = "Debug"
@@ -40,6 +40,16 @@
       debugDocumentVersioning = "YES"
       debugServiceExtension = "internal"
       allowLocationSimulation = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A8BA8CCF2D2D0558006CB966"
+            BuildableName = "Girly.app"
+            BlueprintName = "Girly"
+            ReferencedContainer = "container:Girly.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
    </LaunchAction>
    <ProfileAction
       buildConfiguration = "Release"
@@ -47,6 +57,16 @@
       savedToolIdentifier = ""
       useCustomWorkingDirectory = "NO"
       debugDocumentVersioning = "YES">
+      <BuildableProductRunnable
+         runnableDebuggingMode = "0">
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "A8BA8CCF2D2D0558006CB966"
+            BuildableName = "Girly.app"
+            BlueprintName = "Girly"
+            ReferencedContainer = "container:Girly.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
    </ProfileAction>
    <AnalyzeAction
       buildConfiguration = "Debug">

+ 9 - 1
Girly.xcodeproj/xcuserdata/100years.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,7 +7,15 @@
 		<key>Girly.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>17</integer>
+			<integer>13</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>A8BA8CCF2D2D0558006CB966</key>
+		<dict>
+			<key>primary</key>
+			<true/>
 		</dict>
 	</dict>
 </dict>

BIN
Girly/Assets.xcassets/App-Icon.imageset/App-Icon 1.png


+ 21 - 0
Girly/Assets.xcassets/App-Icon.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-1024.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png


BIN
Girly/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png


+ 6 - 0
Girly/Assets.xcassets/Flash/Contents.json

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

+ 22 - 0
Girly/Assets.xcassets/Flash/flashlight_light.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/flashlight_light.imageset/flashlight_light@2x.png


BIN
Girly/Assets.xcassets/Flash/flashlight_light.imageset/flashlight_light@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/flashlight_off.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/flashlight_off.imageset/flashlight_off@2x.png


BIN
Girly/Assets.xcassets/Flash/flashlight_off.imageset/flashlight_off@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/flashlight_on.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/flashlight_on.imageset/flashlight_on@2x.png


BIN
Girly/Assets.xcassets/Flash/flashlight_on.imageset/flashlight_on@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/launch_logo1.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/launch_logo1.imageset/launch_logo1@2x.png


BIN
Girly/Assets.xcassets/Flash/launch_logo1.imageset/launch_logo1@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_alarm.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@2x.png


BIN
Girly/Assets.xcassets/Flash/light_alarm.imageset/light_alarm@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_disco.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/light_disco.imageset/light_disco@2.png


BIN
Girly/Assets.xcassets/Flash/light_disco.imageset/light_disco@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_flash.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/light_flash.imageset/light_flash@2x.png


BIN
Girly/Assets.xcassets/Flash/light_flash.imageset/light_flash@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_night.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/light_night.imageset/light_night@2x.png


BIN
Girly/Assets.xcassets/Flash/light_night.imageset/light_night@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/light_warning.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@2x.png


BIN
Girly/Assets.xcassets/Flash/light_warning.imageset/light_warning@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/nav_title_flash.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/nav_title_flash.imageset/nav_title_flash@2x.png


BIN
Girly/Assets.xcassets/Flash/nav_title_flash.imageset/nav_title_flash@3x.png


+ 22 - 0
Girly/Assets.xcassets/Flash/nopermission.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Flash/nopermission.imageset/nopermission@2x.png


BIN
Girly/Assets.xcassets/Flash/nopermission.imageset/nopermission@3x.png


+ 6 - 0
Girly/Assets.xcassets/Setting/Contents.json

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

+ 22 - 0
Girly/Assets.xcassets/Setting/nav_title_setting.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/Setting/nav_title_setting.imageset/nav_title_setting@2x.png


BIN
Girly/Assets.xcassets/Setting/nav_title_setting.imageset/nav_title_setting@3x.png


+ 22 - 0
Girly/Assets.xcassets/icon/navi_back_gary.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/icon/navi_back_gary.imageset/navi_back_gary@2x.png


BIN
Girly/Assets.xcassets/icon/navi_back_gary.imageset/navi_back_gary@3x.png


+ 22 - 0
Girly/Assets.xcassets/icon/navi_back_white.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/icon/navi_back_white.imageset/navi_back_white@2x.png


BIN
Girly/Assets.xcassets/icon/navi_back_white.imageset/navi_back_white@3x.png


+ 22 - 0
Girly/Assets.xcassets/icon/reduceBrightness.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/icon/reduceBrightness.imageset/reduceBrightness@2x.png


BIN
Girly/Assets.xcassets/icon/reduceBrightness.imageset/reduceBrightness@3x.png


+ 22 - 0
Girly/Assets.xcassets/icon/slider_thumb.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/icon/slider_thumb.imageset/slider_thumb@2x.png


BIN
Girly/Assets.xcassets/icon/slider_thumb.imageset/slider_thumb@3x.png


+ 22 - 0
Girly/Assets.xcassets/icon/white_right_arrow.imageset/Contents.json

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

BIN
Girly/Assets.xcassets/icon/white_right_arrow.imageset/white_right_arrow@2x.png


BIN
Girly/Assets.xcassets/icon/white_right_arrow.imageset/white_right_arrow@3x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@2x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_select_light.imageset/tabbar_select_light@3x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@2x.png


BIN
Girly/Assets.xcassets/tabbar/tabbar_unSelect_light.imageset/tabbar_unSelect_light@3x.png


+ 13 - 9
Girly/Base.lproj/LaunchScreen.storyboard

@@ -16,18 +16,19 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Girly" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fPp-en-Iio">
-                                <rect key="frame" x="119" y="377.66666666666669" width="155" height="97"/>
-                                <fontDescription key="fontDescription" type="system" pointSize="81"/>
-                                <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
-                                <nil key="highlightedColor"/>
-                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_logo1" translatesAutoresizingMaskIntoConstraints="NO" id="QnY-ie-uPp">
+                                <rect key="frame" x="131.66666666666666" y="324" width="129.99999999999997" height="180"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="180" id="UT1-77-OCS"/>
+                                    <constraint firstAttribute="width" constant="130" id="phI-UG-3y1"/>
+                                </constraints>
+                            </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
-                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <color key="backgroundColor" red="0.066666666666666666" green="0.066666666666666666" blue="0.066666666666666666" alpha="1" colorSpace="calibratedRGB"/>
                         <constraints>
-                            <constraint firstItem="fPp-en-Iio" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="8jk-mD-S1N"/>
-                            <constraint firstItem="fPp-en-Iio" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="QUA-Wd-5Zb"/>
+                            <constraint firstItem="QnY-ie-uPp" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="ZeP-Fw-zsW"/>
+                            <constraint firstItem="QnY-ie-uPp" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" constant="265" id="cGH-Uo-Jq2"/>
                         </constraints>
                     </view>
                 </viewController>
@@ -36,4 +37,7 @@
             <point key="canvasLocation" x="53" y="375"/>
         </scene>
     </scenes>
+    <resources>
+        <image name="launch_logo1" width="130" height="180"/>
+    </resources>
 </document>

+ 124 - 1
Girly/Business/Flash/TSFlashVC.swift

@@ -6,7 +6,130 @@
 //
 class TSFlashVC: TSBaseVC{
     
+    lazy var navBarView: TSBaseNavContentBarView = {
+        let navBarView = TSBaseNavContentBarView()
+        let titleImageView = UIImageView.createImageView(imageName: "nav_title_flash",contentMode: .scaleToFill)
+        
+        navBarView.barView.addSubview(titleImageView)
+        titleImageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.left.equalTo(16)
+        }
+        return navBarView
+    }()
+    
+    lazy var simpleTableView:TSSimpleTableView = {
+        let simpleTableView = TSSimpleTableView()
+        simpleTableView.tableView.contentInset =  UIEdgeInsets( top: 0,left: 0,bottom: 0,right: 0)
+        simpleTableView.reuseClass = ["TSFlashCell"]
+        simpleTableView.dataArray = dataArray
+        return simpleTableView
+    }()
+    
+    lazy var dataArray:[TSBasicSectionModel] = {
+        let cellH:CGFloat = 164.0*kDesignScale
+        var dataArray = [TSBasicSectionModel]()
+        let sectionModel = TSBasicSectionModel()
+        dataArray.append(sectionModel)
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+            leftImageName: "light_warning",
+            height: cellH,
+            rectCorner:.allCorners,
+            tapBlock: {[weak self] itemModel, index, view  in
+                guard let self = self else { return }
+                kPushVC(target: self,modelVC:TSWarningLightVC())
+            }))
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+            leftImageName: "light_night",
+            height: cellH,
+            rectCorner:.allCorners,
+            tapBlock: {[weak self] itemModel, index, view  in
+                guard let self = self else { return }
+                kPushVC(target: self,modelVC:TSNightLightVC())
+            }))
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+            leftImageName: "light_disco",
+            height: cellH,
+            rectCorner:.allCorners,
+            tapBlock: {[weak self] itemModel, index, view  in
+                guard let self = self else { return }
+                kPushVC(target: self,modelVC:TSDiscoLightVC())
+            }))
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+            leftImageName: "light_flash",
+            height: cellH,
+            rectCorner:.allCorners,
+            tapBlock: {[weak self] itemModel, index, view  in
+                guard let self = self else { return }
+                kPushVC(target: self,modelVC:TSFlashLightVC())
+            }))
+        
+        
+        return dataArray
+        
+    }()
+    
     override func createView() {
-        view.backgroundColor = UIColor(red: CGFloat(arc4random()%255)/255, green: CGFloat(arc4random()%255)/255, blue: CGFloat(arc4random()%255)/255, alpha: 1)
+        edgesForExtendedLayout = [.top,.left,.right]
+        view.backgroundColor = "#050505".color
+        navBarContentView.addSubview(navBarView)
+        navBarView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        contentView.addSubview(simpleTableView.tableView)
+        simpleTableView.tableView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.top.equalTo(12)
+            make.bottom.equalTo(0)
+        }
+    }
+    
+    func createItemModel(leftImageName: String,
+                            height: CGFloat,
+                        rectCorner: UIRectCorner,
+                          tapBlock: @escaping ((TSBasicItemModel, Int, Any?) -> Void)) -> TSBasicItemModel {
+        let model = TSBasicItemModel()
+        model.leftImageName = leftImageName
+        model.height = height
+        model.rectCorner = rectCorner
+        model.tapBlock = tapBlock
+        return model
+    }
+}
+
+
+
+class TSFlashCell: TSSimpleTableViewCell {
+
+    override var itemModel: TSBasicItemModel{
+        didSet{
+            if let leftImageName  = itemModel.leftImageName {
+                bgImageView.image = UIImage(named: leftImageName)
+            }
+        }
+    }
+    
+    let bgImageView = UIImageView()
+    
+    override func creatUI() {
+    
+        bgContentView.snp.updateConstraints { make in
+            make.bottom.equalTo(-24)
+        }
+        bgImageView.contentMode = .scaleToFill
+        bgContentView.addSubview(bgImageView)
+        bgImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
     }
 }

+ 251 - 0
Girly/Business/Flash/VC/TSDiscoLightVC.swift

@@ -0,0 +1,251 @@
+//
+//  TSDiscoLightVC.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+
+
+private let defaultColor:UIColor = .white
+private let baseColor:UIColor = .black
+class TSDiscoLightVC: TSBaseVC {
+
+    private var isOpen = false
+    private var currentColor:UIColor = defaultColor
+    private var currentFrequency:CGFloat = 0.5
+    lazy var setToolView: TSDiscoSetToolView = {
+        let setToolView = TSDiscoSetToolView()
+        setToolView.changedValueComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            currentFrequency = value
+            if isEnd,isOpen{
+                startAlphaAnimation(duration: currentFrequency)
+            }
+        }
+        
+        setToolView.changedColorComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            currentColor = value
+            
+            if isOpen {
+                if isEnd{
+                    startAlphaAnimation(duration: currentFrequency)
+                }
+            }else{
+                self.view.backgroundColor = currentColor
+            }
+        }
+        
+        setToolView.clickDoneComplete = { [weak self]  in
+            guard let self = self else { return }
+            
+            isOpen = !isOpen
+            
+            if isOpen{
+                UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                    setToolView.isHidden = true
+                }
+                startAlphaAnimation(duration: currentFrequency)
+                UIDevice.allowScreenSleep()
+            }else {
+                stopAlphaAnimation()
+            }
+            self.setToolView.submitBtn.setTitle(self.isOpen ? "Close" : "Open", for: .normal)
+        }
+        
+        return setToolView
+    }()
+    
+
+    override func createView() {
+        addNormalNavBarView()
+        setTitleText("")
+        _ = setNavigationItem("", imageName: "navi_back_gary", direction: .left, action: #selector(navBarClickLeftAction))
+        
+        view.backgroundColor = currentColor
+        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(showToView)))
+        
+        
+        contentView.addSubview(setToolView)
+        setToolView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.height.equalTo(282.0)
+        }
+
+    }
+    
+    @objc func showToView() {
+        if setToolView.isHidden == true {
+            UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                self.setToolView.isHidden = false
+            }
+            
+            UIDevice.allowScreenSleep()
+        }
+    }
+    
+
+    /// 颜色循环动画
+    /// - Parameters:
+    ///   - minAlpha: 颜色
+    ///   - duration: 动画时长(单次透明度变化的时长,默认为 1 秒)
+    func startAlphaAnimation(duration: TimeInterval = 1.0) {
+        // 防止重复添加动画
+        stopAlphaAnimation()
+        
+        kDelayMainShort {
+            // 开始动画
+            UIView.animate(withDuration: duration, delay: 0, options: [.autoreverse, .repeat,.allowUserInteraction]) {
+                self.view.backgroundColor = baseColor
+            } completion: { _ in
+                self.view.backgroundColor = self.currentColor
+            }
+        }
+  
+    }
+    
+    /// 停止颜色循环动画
+    func stopAlphaAnimation() {
+        self.view.layer.removeAllAnimations()
+        self.view.backgroundColor = self.currentColor
+    }
+    
+    deinit {
+        UIDevice.allowScreenSleep()
+    }
+
+}
+
+
+class TSDiscoSetToolView: TSBaseView {
+    var changedColorComplete:((UIColor,Bool)->Void)?
+    var clickDoneComplete:(()->Void)?
+    var changedValueComplete:((CGFloat,Bool)->Void)?{
+        didSet{
+            flashSliderView.changedValueComplete = changedValueComplete
+        }
+    }
+
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    var isShow = true
+    
+    lazy var titleLabel1: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Flicker Frequency".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+    
+    lazy var titleLabel2: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Flash Color".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+    
+    lazy var colorSlider: ColorSlider = {
+        let colorSlider = kCommonColorSlider()
+        colorSlider.color = defaultColor
+        colorSlider.addTarget(self, action: #selector(changedColor(slider:)), for: .valueChanged)
+        colorSlider.addTarget(self, action: #selector(endColor(slider:)), for: .touchCancel)
+        return colorSlider
+    }()
+
+    lazy var submitBtn: UIButton = {
+        let submitBtn = createNormalSubmitBtn(title: "Open".localized) { [weak self]  in
+            guard let self = self else { return }
+            isShow = !isShow
+            clickDoneComplete?()
+        }
+        submitBtn.cornerRadius = 22.0;
+        return submitBtn
+    }()
+    
+    lazy var flashSliderView: TSFlashSliderView = {
+        let flashSliderView = TSFlashSliderView()
+        flashSliderView.setSliderValue(minimumValue: 0.1, maximumValue: 1.0, value: 0.5)
+        flashSliderView.setSliderImage(leftImage: UIImage(named: "low_frequency")!, rightImage: UIImage(named: "high_frequency")!)
+        return flashSliderView
+    }()
+    
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        
+        let cell1 = creatCell(subView: titleLabel1)
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(flashSliderView)
+        flashSliderView.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+
+        
+        let cell2 = creatCell(subView: titleLabel2)
+        bottomView.addSubview(cell2)
+        cell2.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(124)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(colorSlider)
+        colorSlider.snp.makeConstraints { make in
+            make.top.equalTo(cell2.snp.bottom)
+            make.trailing.equalTo(-30)
+            make.leading.equalTo(30)
+            make.height.equalTo(6)
+        }
+        
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(50)
+            make.trailing.equalTo(-51)
+            make.bottom.equalTo(-34)
+            make.height.equalTo(44)
+        }
+
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+            
+//            let x = self.colorSlider.gradientView.calculateSliderProgress(for: self.colorSlider.internalColor)
+//            self.colorSlider.previewView?.transition(to: .active)
+//            self.colorSlider.centerPreview(at: CGPoint(x: x * self.colorSlider.bounds.width, y: x * self.colorSlider.bounds.height))
+        }
+        
+    }
+    
+    func creatCell(subView:UIView) -> UIView{
+        let view = UIView()
+        view.addSubview(subView)
+        subView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(0)
+            make.centerY.equalToSuperview()
+        }
+        return view
+    }
+    
+    @objc func changedColor(slider: ColorSlider) {
+        changedColorComplete?(slider.color,false)
+    }
+    @objc func endColor(slider: ColorSlider) {
+        changedColorComplete?(slider.color,true)
+    }
+}

+ 205 - 0
Girly/Business/Flash/VC/TSFlashLightVC.swift

@@ -0,0 +1,205 @@
+//
+//  TSFlashLightVC.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+
+class TSFlashLightVC: TSBaseVC {
+    
+    private var isOpen = false
+    private var currentValue:CGFloat = 0.5
+    
+    lazy var lightImageView: UIImageView = {
+        let lightImageView = UIImageView.createImageView(imageName: "flashlight_light")
+        lightImageView.isHidden = true
+        return lightImageView
+    }()
+    
+    lazy var flashlightImageView: UIImageView = {
+        let flashlightImageView = UIImageView.createImageView(imageName: "flashlight_off")
+        return flashlightImageView
+    }()
+    
+    
+    lazy var flashlight: TSFlashlightTool = {
+        let flashlight = TSFlashlightTool()
+        flashlight.adjustBrightness(brightness: 0.5)
+        return flashlight
+    }()
+    
+
+    lazy var setToolView: TSFlashNightSetToolView = {
+        let setToolView = TSFlashNightSetToolView()
+        setToolView.changedValueComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            currentValue = value
+            if isOpen{
+                flashlight.adjustBrightness(brightness: Float(currentValue))
+            }
+        }
+        
+        setToolView.clickDoneComplete = { [weak self]  in
+            guard let self = self else { return }
+            isOpen = !isOpen
+            
+            if isOpen {
+                UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                    setToolView.isHidden = true
+                }
+            }
+            changeLight()
+        }
+        
+        return setToolView
+    }()
+    
+
+    override func createView() {
+        addNormalNavBarView()
+        
+        setPageTitle("")
+        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(showToView)))
+
+        view.addSubview(lightImageView)
+        lightImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(375.0)
+            make.height.equalTo(130.0)
+        }
+        
+        view.addSubview(flashlightImageView)
+        flashlightImageView.snp.makeConstraints { make in
+            make.top.equalTo(78)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(234.0)
+            make.height.equalTo(445.0)
+        }
+        
+        view.addSubview(setToolView)
+        setToolView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.height.equalTo(282.0)
+        }
+
+    }
+    
+    @objc func showToView() {
+        if setToolView.isHidden == true {
+            UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                self.setToolView.isHidden = false
+                self.setToolView.submitBtn.setTitle(self.isOpen ? "Close" : "Open", for: .normal)
+            }
+        }
+    }
+
+    
+    func changeLight() {
+        if isOpen {
+            self.lightImageView.isHidden = false
+            self.flashlightImageView.image = UIImage(named: "flashlight_on")
+            self.flashlight.turnOn(brightness: 0.5)
+        }else{
+            self.lightImageView.isHidden = true
+            self.flashlightImageView.image = UIImage(named: "flashlight_off")
+            self.flashlight.turnOff()
+        }
+    }
+    
+    deinit {
+        self.flashlight.turnOff()
+    }
+}
+
+
+class TSFlashNightSetToolView: TSBaseView {
+
+    var clickDoneComplete:(()->Void)?
+    var changedValueComplete:((CGFloat,Bool)->Void)?{
+        didSet{
+            flashSliderView.changedValueComplete = changedValueComplete
+        }
+    }
+
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    var isShow = true
+    
+    lazy var titleLabel1: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Flicker Frequency".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+
+    lazy var submitBtn: UIButton = {
+        let submitBtn = createNormalSubmitBtn(title: "Open".localized) { [weak self]  in
+            guard let self = self else { return }
+            isShow = !isShow
+            clickDoneComplete?()
+        }
+        submitBtn.cornerRadius = 22.0
+        return submitBtn
+    }()
+    
+    lazy var flashSliderView: TSFlashSliderView = {
+        let flashSliderView = TSFlashSliderView()
+        flashSliderView.setSliderValue(minimumValue: 0.0, maximumValue: 1.0, value: 0.5)
+        flashSliderView.setSliderImage(leftImage: UIImage(named: "reduceBrightness")!, rightImage: UIImage(named: "brightness")!)
+        return flashSliderView
+    }()
+    
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        
+        let cell1 = creatCell(subView: titleLabel1)
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(flashSliderView)
+        flashSliderView.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(50)
+            make.trailing.equalTo(-51)
+            make.bottom.equalTo(-34)
+            make.height.equalTo(44)
+        }
+
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        }
+        
+    }
+    
+    func creatCell(subView:UIView) -> UIView{
+        let view = UIView()
+        view.addSubview(subView)
+        subView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(0)
+            make.centerY.equalToSuperview()
+        }
+        return view
+    }
+}

+ 279 - 0
Girly/Business/Flash/VC/TSNightLightVC.swift

@@ -0,0 +1,279 @@
+//
+//  TSNightLightVC.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+
+class TSNightLightVC: TSBaseVC {
+    
+    private var isOpen = false
+    private var currentValue:CGFloat = 0.5
+    
+    lazy var shapeView: TSLightShapeView = {
+        let shapeView = TSLightShapeView()
+        shapeView.imageNamed = "bold_roundness_shape"
+        shapeView.color = UIColor.white.adjusted(brightness: currentValue)
+        return shapeView
+    }()
+    
+
+    lazy var setToolView: TSNightSetToolView = {
+        let setToolView = TSNightSetToolView()
+        setToolView.changedValueComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            currentValue = value
+            shapeView.color = UIColor.white.adjusted(brightness: currentValue)
+        }
+        
+        setToolView.clickDoneComplete = { [weak self]  in
+            guard let self = self else { return }
+            isOpen = !isOpen
+            
+            if isOpen {
+                UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                    setToolView.isHidden = true
+                }
+                UIDevice.keepScreenAwake()
+                setToolView.myTimer.start()
+                setToolView.submitBtn.setTitle("close".localized, for: .normal)
+            }else{
+                UIDevice.allowScreenSleep()
+                setToolView.myTimer.stop()
+                setToolView.submitBtn.setTitle("open".localized, for: .normal)
+            }
+        }
+        
+        return setToolView
+    }()
+    
+
+    override func createView() {
+        
+        view.insertSubview(shapeView, at: 0)
+        shapeView.snp.makeConstraints { make in
+            make.top.equalTo(10)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(k_ScreenWidth)
+            make.height.equalTo(k_ScreenWidth*1.5)
+        }
+        contentView.layoutIfNeeded()
+        self.shapeView.addContent()
+        
+        addNormalNavBarView()
+        setPageTitle("")
+        
+        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(showToView)))
+
+        contentView.addSubview(setToolView)
+        setToolView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.height.equalTo(282.0)
+        }
+    }
+    
+    @objc func showToView() {
+        if setToolView.isHidden == true {
+            UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                self.setToolView.isHidden = false
+                self.setToolView.submitBtn.setTitle(self.isOpen ? "Close" : "Open", for: .normal)
+            }
+            UIDevice.allowScreenSleep()
+        }
+    }
+    
+    
+    deinit {
+        UIDevice.allowScreenSleep()
+    }
+}
+
+
+class TSNightSetToolView: TSBaseView {
+
+    var clickDoneComplete:(()->Void)?
+    var changedValueComplete:((CGFloat,Bool)->Void)?{
+        didSet{
+            flashSliderView.changedValueComplete = changedValueComplete
+        }
+    }
+
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    var isShow = true
+    
+    
+    private var countdown:Int = 0
+    
+    lazy var titleLabel1: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Brightness".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+
+    lazy var flashSliderView: TSFlashSliderView = {
+        let flashSliderView = TSFlashSliderView()
+        flashSliderView.setSliderValue(minimumValue: 0.0, maximumValue: 1.0, value: 0.5)
+        flashSliderView.setSliderImage(leftImage: UIImage(named: "reduceBrightness")!, rightImage: UIImage(named: "brightness")!)
+        return flashSliderView
+    }()
+    
+    lazy var titleLabel2: UILabel = {
+        let titleLabel2 = UILabel.createLabel(text: "Night Light Countdown".localized,font: .font(size: 14,weight: .medium),textColor: UIColor.white)
+        return titleLabel2
+    }()
+    
+    
+    lazy var timeLabel: UILabel = {
+        let timeLabel = UILabel.createLabel(text: "00:00:00".localized,font: .font(size: 14,weight: .medium),textColor: UIColor.fromHex("#FFFFFF", alpha: 0.4))
+        return timeLabel
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = createNormalSubmitBtn(title: "Open".localized) { [weak self]  in
+            guard let self = self else { return }
+            isShow = !isShow
+            clickDoneComplete?()
+        }
+        submitBtn.cornerRadius = 22.0;
+        return submitBtn
+    }()
+    
+    lazy var myTimer: TSCustomTimer = {
+        let customTimer = TSCustomTimer(interval: 1.0,repeats: true) { [weak self]  in
+            guard let self = self else { return }
+            countdown -= 1
+            timeLabel.text = countdown.toHourMinuteSecondString()
+        }
+        return customTimer
+    }()
+    //时间选择器
+    lazy var timerView: TSTimerView = {
+        let timerView = TSTimerView()
+        timerView.isHidden = true
+        timerView.onTimeSelected = { [weak self] hour,minute in
+            guard let self = self else { return }
+            countdown = (hour*60+minute)*60
+            timeLabel.text = countdown.toHourMinuteSecondString()
+        }
+        return timerView
+    }()
+    
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        let cell1 = creatCell(subView: titleLabel1)
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(flashSliderView)
+        flashSliderView.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+        
+        
+        let cell2 = creatCell2()
+        bottomView.addSubview(cell2)
+        cell2.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(124)
+            make.height.equalTo(44)
+        }
+        
+
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(50)
+            make.trailing.equalTo(-51)
+            make.bottom.equalTo(-34)
+            make.height.equalTo(44)
+        }
+
+        
+        //时间选择器
+        self.addSubview(timerView)
+        timerView.snp.makeConstraints { make in
+            make.edges.equalTo(0)
+        }
+        
+
+        
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        }
+        
+    }
+    
+    func creatCell(subView:UIView) -> UIView{
+        let view = UIView()
+        view.addSubview(subView)
+        subView.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(0)
+            make.centerY.equalToSuperview()
+        }
+        return view
+    }
+    
+    func creatCell2() -> UIView{
+        let bgView = UIView()
+
+        bgView.addSubview(titleLabel2)
+        titleLabel2.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.width.equalTo(200)
+            make.centerY.equalToSuperview()
+        }
+        
+        
+        let timeView = UIView()
+        timeView.backgroundColor = .fromHex("#FFFFFF", alpha: 0.1)
+        timeView.cornerRadius = 14.0
+        timeView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickTime)))
+        timeView.addSubview(timeLabel)
+        timeLabel.snp.makeConstraints { make in
+            make.leading.equalTo(8)
+            make.trailing.equalTo(-8)
+            make.height.equalTo(28)
+            make.top.bottom.equalTo(0)
+        }
+        
+        bgView.addSubview(timeView)
+        timeView.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.centerY.equalToSuperview()
+        }
+        
+        return bgView
+    }
+    
+    @objc func clickTime(){
+        self.timerView.isHidden = false
+    }
+    
+    
+    deinit {
+        myTimer.stop()
+    }
+
+}
+
+
+

+ 110 - 0
Girly/Business/Flash/VC/TSWarningLightVC.swift

@@ -0,0 +1,110 @@
+//
+//  TSWarningLightVC.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+
+import MediaPlayer
+class TSWarningLightVC: TSBaseVC {
+    
+    lazy var warningImageView: UIImageView = {
+        return UIImageView.createImageView(imageName: "light_alarm")
+    }()
+    
+    private var isOpen = false
+    
+    let flashlightController = TSFlashlightController()
+    private lazy var volumeView: MPVolumeView = {
+        let view = MPVolumeView(frame: .zero)
+        view.isHidden = true // 隐藏音量控件
+        return view
+    }()
+    
+    lazy var setToolView: TSFlashSetToolView = {
+        let setToolView = TSFlashSetToolView()
+        
+        setToolView.changedValueComplete = { [weak self] value,isEnd in
+            guard let self = self else { return }
+            setVolume(Float(value))
+        }
+        
+        setToolView.clickDoneComplete = { [weak self]  in
+            guard let self = self else { return }
+            isOpen = !isOpen
+            if isOpen{
+                UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                    setToolView.isHidden = true
+                }
+                audioPlayer?.play()
+                warningImageView.startAlphaAnimation(minAlpha: 0.3,duration: 0.5)
+                flashlightController.startFlashing(frequency: 2.0)
+            }else {
+                audioPlayer?.pause()
+                warningImageView.stopAlphaAnimation()
+                flashlightController.stopFlashing()
+            }
+        }
+        
+        return setToolView
+    }()
+    
+    
+    lazy var audioPlayer: TSAudioPlayer? = {
+        let audioPlayer = TSAudioPlayer(url: Bundle.main.url(forResource: "AlarmSound", withExtension: "MP3")!)
+        audioPlayer?.setVolume(1.0)
+        audioPlayer?.setLoop(true)
+        return audioPlayer
+    }()
+    
+    override func createView() {
+        addNormalNavBarView()
+        setPageTitle("")
+        view.backgroundColor = "#161616".color
+        
+        
+        contentView.addSubview(volumeView)
+        contentView.addSubview(warningImageView)
+        warningImageView.snp.makeConstraints { make in
+            make.width.height.equalTo(250.0)
+            make.centerX.equalToSuperview()
+            make.top.equalTo(156.0)
+        }
+        
+        contentView.addSubview(setToolView)
+        setToolView.snp.makeConstraints { make in
+            make.leading.trailing.equalTo(0)
+            make.bottom.equalTo(0)
+            make.height.equalTo(282.0)
+        }
+
+        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(showToView)))
+        
+        kDelayMainShort {
+            self.setVolume(0.5)
+        }
+        
+    }
+    
+    @objc func showToView() {
+        if setToolView.isHidden == true {
+            UIView.animate(withDuration: 0.5, delay: 0, options: []) {
+                self.setToolView.isHidden = false
+                self.setToolView.submitBtn.setTitle(self.isOpen ? "Close" : "Open", for: .normal)
+            }
+        }
+    }
+    
+    /// 设置音量
+    /// - Parameter volume: 音量值 (0.0 ~ 1.0)
+    func setVolume(_ volume: Float) {
+        guard let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider else { return }
+        slider.value = volume // 调整音量
+    }
+    
+    deinit {
+        audioPlayer?.stop()
+        warningImageView.stopAlphaAnimation()
+        flashlightController.stopFlashing()
+    }
+}

+ 97 - 0
Girly/Business/Flash/VC/View/TSFlashSetToolView.swift

@@ -0,0 +1,97 @@
+//
+//  TSFlashSetToolView.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+
+class TSFlashSetToolView: TSBaseView {
+    
+    var clickDoneComplete:(()->Void)?
+    var changedValueComplete:((CGFloat,Bool)->Void)?{
+        didSet{
+            flashSliderView.changedValueComplete = changedValueComplete
+        }
+    }
+
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    var isShow = true
+    
+    lazy var titleLabel1: UILabel = {
+        let titleLabel1 = UILabel.createLabel(text: "Volume".localized,font: .font(size: 14,weight: .medium),textColor: .white)
+        return titleLabel1
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let submitBtn = createNormalSubmitBtn(title: "Open".localized) { [weak self]  in
+            guard let self = self else { return }
+            isShow = !isShow
+            clickDoneComplete?()
+        }
+        submitBtn.cornerRadius = 22.0;
+        return submitBtn
+    }()
+    
+    lazy var flashSliderView: TSFlashSliderView = {
+        let flashSliderView = TSFlashSliderView()
+        
+        return flashSliderView
+    }()
+    
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        
+        let cell1 = creatCell1()
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(20)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(flashSliderView)
+        flashSliderView.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.leading.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(48)
+        }
+
+        bottomView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.leading.equalTo(50)
+            make.trailing.equalTo(-51)
+            make.bottom.equalTo(-34)
+            make.height.equalTo(44)
+        }
+
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+        }
+        
+    }
+    
+    
+    func creatCell1() -> UIView{
+        let view = UIView()
+        view.addSubview(titleLabel1)
+        titleLabel1.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.trailing.equalTo(0)
+            make.centerY.equalToSuperview()
+        }
+        return view
+        
+    }
+}

+ 119 - 0
Girly/Business/Flash/VC/View/TSFlashSliderView.swift

@@ -0,0 +1,119 @@
+//
+//  TSFlashSliderView.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/9.
+//
+import MultiSlider
+class TSFlashSliderView: TSBaseView {
+    
+    var changedValueComplete:((CGFloat,Bool)->Void)?
+    var currentValue:CGFloat = 1.0
+    
+    lazy var bgView: UIView = {
+        let bgView = UIView()
+        bgView.cornerRadius = 24.0
+        return bgView
+    }()
+    
+    lazy var leftImageView: UIImageView = {
+        let leftImageView = UIImageView.createImageView(imageName: "soundOff")
+        return leftImageView
+    }()
+    
+    lazy var rightImageView: UIImageView = {
+        let rightImageView = UIImageView.createImageView(imageName: "volume")
+        return rightImageView
+    }()
+    
+    lazy var slider: MultiSlider = {
+        let slider = MultiSlider()
+        slider.value = [0.5]
+        slider.minimumValue = 0.0
+        slider.orientation = .horizontal
+        slider.tintColor = .clear
+        slider.thumbTintColor = .clear
+        slider.showsThumbImageShadow = false
+        slider.trackWidth = 44.0
+        slider.thumbImage = UIImage(named: "slider_thumb")
+        slider.addTarget(self, action: #selector(sliderChanged(slider:)), for: .valueChanged)
+        slider.addTarget(self, action: #selector(sliderCancel(slider:)), for: .touchUpInside)
+        return slider
+    }()
+    
+    
+    override func creatUI() {
+        
+        contentView.addSubview(bgView)
+        bgView.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(0)
+            make.bottom.equalTo(0)
+        }
+        
+     
+        bgView.addSubview(leftImageView)
+        bgView.addSubview(rightImageView)
+        bgView.addSubview(slider)
+
+        
+        leftImageView.snp.makeConstraints { make in
+            make.leading.equalTo(12)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(24)
+        }
+        
+        rightImageView.snp.makeConstraints { make in
+            make.trailing.equalTo(-12)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(24)
+        }
+        
+        slider.snp.makeConstraints { make in
+//            make.leading.equalTo(40)
+//            make.trailing.equalTo(-40)
+            
+            make.leading.equalTo(4)
+            make.trailing.equalTo(-4)
+            
+            make.centerY.equalToSuperview()
+            make.height.equalTo(44)
+        }
+        
+        kDelayMainShort {
+            self.bgView.addGradientBg(colors: [UIColor.fromHex("#FFFFFF", alpha: 0.2).cgColor,UIColor.fromHex("#FFFFFF", alpha: 0.8).cgColor],startPoint: CGPoint(x: 0, y: 1),endPoint: CGPoint(x: 1, y: 1))
+        }
+        
+    }
+    
+    
+    func setSliderValue(minimumValue:CGFloat,maximumValue:CGFloat,value:CGFloat) {
+        slider.minimumValue = minimumValue
+        slider.maximumValue = maximumValue
+        slider.value = [value]
+    }
+    
+    func setSliderImage(leftImage:UIImage,rightImage:UIImage) {
+        leftImageView.image = leftImage
+        rightImageView.image = rightImage
+    }
+    
+    @objc func sliderChanged(slider: MultiSlider) {
+        debugPrint("now thumbs are at \(slider.value)")
+        if let num = slider.value.first {
+            currentValue = num
+            changedValueComplete?(currentValue,false)
+        }
+    }
+    
+    @objc func sliderCancel(slider: MultiSlider) {
+        debugPrint("sliderCancel \(slider.value)")
+        if let num = slider.value.first {
+            currentValue = num
+            changedValueComplete?(currentValue,true)
+        }
+    }
+    
+    
+}

+ 81 - 0
Girly/Business/Flash/VC/View/TSTimerView.swift

@@ -0,0 +1,81 @@
+//
+//  TSTimerView.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/10.
+//
+
+class TSTimerView: TSBaseView {
+    
+    // 回调选中的时间
+    var onTimeSelected: ((Int, Int) -> Void)?
+    
+    private var hour = 0
+    private var minute = 0
+    
+    lazy var bottomView: UIView = {
+        let bottomView = UIView()
+        bottomView.backgroundColor = .cardBgColor
+        return bottomView
+    }()
+    
+    lazy var pickerVC: TimePickerViewController = {
+        let pickerVC = TimePickerViewController()
+        pickerVC.onTimeSelected = { [weak self] hour,minute in
+            guard let self = self else { return }
+            self.hour = hour
+            self.minute = minute
+        }
+        return pickerVC
+    }()
+    
+    lazy var closeBtn: UIButton = {
+        let closeBtn = UIButton.createButton(image: UIImage(named: "navi_back_white")) { [weak self]  in
+            guard let self = self else { return }
+            onTimeSelected?(hour,minute)
+            self.isHidden = true
+        }
+        return closeBtn
+    }()
+
+    override func creatUI() {
+        
+        contentView.addSubview(bottomView)
+        bottomView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        let cell1 = creatCell(subView: closeBtn)
+        bottomView.addSubview(cell1)
+        cell1.snp.makeConstraints { make in
+            make.leading.equalTo(0)
+            make.trailing.equalTo(0)
+            make.top.equalTo(0)
+            make.height.equalTo(44)
+        }
+        
+        bottomView.addSubview(pickerVC.view)
+        pickerVC.view.snp.makeConstraints { make in
+            make.top.equalTo(cell1.snp.bottom)
+            make.bottom.equalTo(-34)
+            make.leading.trailing.equalTo(0)
+        }
+
+        kDelayMainShort {
+            self.bottomView.cornersRound(radius: 20, corner: [.topLeft,.topRight])
+            self.pickerVC.setDefaultTime(hour: 1, minute: 30)
+        }
+        
+    }
+    
+    func creatCell(subView:UIView) -> UIView{
+        let view = UIView()
+        view.addSubview(subView)
+        subView.snp.makeConstraints { make in
+            make.leading.equalTo(6)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(44)
+        }
+        return view
+    }
+}

+ 1 - 0
Girly/Business/Light/TSLightVC.swift

@@ -20,6 +20,7 @@ class TSLightVC : TSBaseVC{
         dataSource.titleSelectedColor = .white
         return dataSource
     }()
+    
     //头 view
     lazy var segmentedView: JXSegmentedView = {
         let segmentedView = JXSegmentedView()

+ 6 - 0
Girly/Business/Light/VC/TSFullScreenVC.swift

@@ -68,12 +68,18 @@ class TSFullScreenVC: TSBaseVC {
             shapeView.color = color
             shapeView.imageNamed = shapeNamed
         }
+        
+        UIDevice.keepScreenAwake()
     }
     
     
     @objc func closePage() {
         self.dismiss(animated: true)
     }
+    
+    deinit {
+        UIDevice.allowScreenSleep()
+    }
 
 }
 

+ 7 - 3
Girly/Business/Light/VC/TSLightGradientVC.swift

@@ -9,7 +9,11 @@ import JXSegmentedView
 class TSLightGradientVC: TSBaseVC{
     
     lazy var currentColorString:String =  {
-        return "#E233FF-#FF6B00"
+        if let itemModel = kLightShared.gradientColors.first {
+            return itemModel.color
+        }else{
+            return "#D012F1-#4541FF"
+        }
     }(){
         didSet{
             updateColorView()
@@ -36,7 +40,7 @@ class TSLightGradientVC: TSBaseVC{
         let colorPaletteView = TSLightColorPaletteView()
         colorPaletteView.changedBrightnessComplete = { [weak self] floatNum in
             guard let self = self else { return }
-            UIScreen.main.brightness = floatNum
+            UIDevice.brightness(brightness: floatNum)
         }
         
         colorPaletteView.changedSaturationComplete = { [weak self] floatNum in
@@ -103,7 +107,7 @@ class TSLightGradientVC: TSBaseVC{
         }
         
         kDelayMainShort {
-            self.topView.addGradientBg(colors: [UIColor.red.cgColor,UIColor.blue.cgColor])
+            self.topView.addGradientBg(colors: self.currentColorString.cgColors(separator: "-"))
         }
         
         updateColorView()

+ 1 - 1
Girly/Business/Light/VC/TSLightShapeVC.swift

@@ -30,7 +30,7 @@ class TSLightShapeVC: TSBaseVC{
         let colorPaletteView = TSLightColorPaletteView()
         colorPaletteView.changedBrightnessComplete = { [weak self] floatNum in
             guard let self = self else { return }
-            UIScreen.main.brightness = floatNum
+            UIDevice.brightness(brightness: floatNum)
         }
         
         colorPaletteView.changedSaturationComplete = { [weak self] floatNum in

+ 2 - 2
Girly/Business/Light/VC/TSLightSolidColorVC.swift

@@ -8,7 +8,7 @@ import JXSegmentedView
 class TSLightSolidColorVC: TSBaseVC{
     
     lazy var currentColor:UIColor =  {
-        let color = "#FAC0D6".color
+        let color = TSConfig.ligntSolidDefaultColor
         return color
     }(){
         didSet{
@@ -36,7 +36,7 @@ class TSLightSolidColorVC: TSBaseVC{
         let colorPaletteView = TSLightColorPaletteView()
         colorPaletteView.changedBrightnessComplete = { [weak self] floatNum in
             guard let self = self else { return }
-            UIScreen.main.brightness = floatNum
+            UIDevice.brightness(brightness: floatNum)
         }
         
         colorPaletteView.changedSaturationComplete = { [weak self] floatNum in

+ 3 - 4
Girly/Business/Light/VC/View/TSColorPickerView.swift

@@ -37,19 +37,18 @@ class TSColorPickerView: TSBaseView {
         return collectionView
     }()
     
-    var currentIndexPath:IndexPath?
+    var currentIndexPath:IndexPath = IndexPath(item: 0, section: 0)
     
     override func creatUI() {
         addSubview(collectionView)
         collectionView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
+        
     }
     
     func unCheck(){
-        if let currentIndexPath = currentIndexPath {
-            collectionView.deselectItem(at: currentIndexPath, animated: true)
-        }
+        collectionView.deselectItem(at: currentIndexPath, animated: true)
     }
 }
 

+ 4 - 0
Girly/Business/Light/VC/View/TSLightGradientToolView.swift

@@ -31,6 +31,10 @@ class TSLightGradientToolView: TSBaseView {
         }
         
         colorPickerView.collectionView.reloadData()
+        
+        kDelayMainShort {
+            self.colorPickerView.collectionView.selectItem(at: IndexPath(item: 0, section: 0), animated: true, scrollPosition: .left)
+        }
     }
 }
 

+ 147 - 3
Girly/Business/Light/VC/View/TSLightShapeToolView.swift

@@ -8,7 +8,7 @@
 class TSLightShapeToolView: TSBaseView {
     
     lazy var colorSlider: ColorSlider = {
-        let colorSlider = ColorSlider(orientation: .horizontal, previewSide: .top)
+        let colorSlider = kCommonColorSlider()
         colorSlider.color = .white
         colorSlider.addTarget(self, action: #selector(changedColor(slider:)), for: .valueChanged)
         return colorSlider
@@ -18,8 +18,8 @@ class TSLightShapeToolView: TSBaseView {
     
     var changedModelComplete:((TSLightItemModel)->Void)?
     
-    lazy var colorPickerView: TSColorPickerView = {
-        let colorPickerView = TSColorPickerView()
+    lazy var colorPickerView: TSLightShapePickerView = {
+        let colorPickerView = TSLightShapePickerView()
         colorPickerView.dataArray = kLightShared.shapes
         colorPickerView.selectedColorComplete = { [weak self] colorModel in
             guard let self = self else { return }
@@ -53,3 +53,147 @@ class TSLightShapeToolView: TSBaseView {
     }
 }
 
+
+
+
+class TSLightShapePickerView: TSBaseView {
+    
+    var dataArray:[TSLightItemModel] = [TSLightItemModel](){
+        didSet{
+            collectionView.reloadData()
+        }
+    }
+    var selectedColorComplete:((TSLightItemModel)->Void)?
+    
+    lazy var layout: UICollectionViewFlowLayout = {
+        let layout = UICollectionViewFlowLayout()
+        layout.scrollDirection = .horizontal
+        layout.itemSize = CGSize(width: 40, height: 40)
+        layout.minimumInteritemSpacing = 0.0
+        layout.minimumLineSpacing = 16.0
+        return layout
+    }()
+    
+    lazy var collectionView: UICollectionView = {
+        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
+        collectionView.delegate = self
+        collectionView.dataSource = self
+        collectionView.showsVerticalScrollIndicator = false
+        collectionView.showsHorizontalScrollIndicator = false
+        collectionView.backgroundColor = .clear
+        collectionView.register(TSLightShapePickerCell.self, forCellWithReuseIdentifier: TSLightShapePickerCell.cellID)
+        if #available(iOS 11.0, *) {
+            collectionView.contentInsetAdjustmentBehavior = .never
+        }
+        return collectionView
+    }()
+    
+    var currentIndexPath:IndexPath = IndexPath(item: 0, section: 0)
+    
+    override func creatUI() {
+        addSubview(collectionView)
+        collectionView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        kDelayMainShort {
+            self.collectionView.selectItem(at: self.currentIndexPath, animated: false, scrollPosition: .left)
+        }
+    }
+    
+    func unCheck(){
+        collectionView.deselectItem(at: currentIndexPath, animated: true)
+    }
+}
+
+
+extension TSLightShapePickerView: UICollectionViewDataSource ,UICollectionViewDelegate {
+    
+    public func numberOfSections(in collectionView: UICollectionView) -> Int {
+        return 1
+    }
+    
+    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        return dataArray.count
+    }
+    
+    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        
+        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TSLightShapePickerCell.cellID, for: indexPath)
+        if let cell = cell as? TSLightShapePickerCell,let colorModel = dataArray.safeObj(At: indexPath.item){
+            cell.colorModel = colorModel
+        }
+        return cell
+    }
+
+    public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        if let colorModel = dataArray.safeObj(At: indexPath.item){
+            selectedColorComplete?(colorModel)
+            currentIndexPath = indexPath
+        }
+    }
+}
+
+
+class TSLightShapePickerCell: TSBaseCollectionCell {
+    
+    static let cellID = "TSLightShapePickerCell"
+
+    override var isSelected: Bool{
+        didSet{
+            colorView.borderColor = isSelected ? .themeColor : .clear
+        }
+    }
+    
+    var colorModel:TSLightItemModel = TSLightItemModel(){
+        didSet{
+            shapeImageView.image = UIImage(named: colorModel.image)
+        }
+    }
+    
+    
+    lazy var bgColorView: UIView = {
+        let bgColorView = UIView()
+        bgColorView.cornerRadius = self.bounds.size.width/2
+        bgColorView.backgroundColor = .fromHex("FFFFFF", alpha: 0.1)
+        return bgColorView
+    }()
+    
+    lazy var shapeImageView: UIImageView = {
+        let imageView = UIImageView.createImageView(imageName: "")
+        return imageView
+    }()
+
+    lazy var colorView: UIView = {
+        let colorView = UIView()
+        colorView.cornerRadius = self.bounds.size.width/2
+        colorView.borderColor = .clear
+        colorView.borderWidth = 2
+        return colorView
+    }()
+    
+    override func creatUI() {
+        
+        bgContentView.addSubview(bgColorView)
+        bgColorView.snp.makeConstraints { make in
+            make.width.height.equalTo(40.0)
+            make.center.equalToSuperview()
+        }
+        
+        bgContentView.addSubview(shapeImageView)
+        shapeImageView.snp.makeConstraints { make in
+            make.width.height.equalTo(20.0)
+            make.center.equalToSuperview()
+        }
+
+        bgContentView.addSubview(colorView)
+        colorView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        
+        
+
+        
+    }
+}

+ 4 - 6
Girly/Business/Light/VC/View/TSLightShapeView.swift

@@ -5,15 +5,13 @@
 //  Created by 100Years on 2025/1/8.
 //
 
-
-import GlowingEffectView
 class TSLightShapeView: TSBaseView {
 
     private var shwoWidth:CGFloat = k_ScreenWidth
-    
+    private var less:CGFloat = 5.0
     lazy var bgShapeView: UIView = {
         let shapeView = UIView()
-        shapeView.frame = CGRect(x: 0, y: 0, width: shwoWidth, height: shwoWidth)
+        shapeView.frame = CGRect(x: 0, y: 0, width: shwoWidth-less, height: shwoWidth-less)
         shapeView.backgroundColor = color
         return shapeView
     }()
@@ -63,8 +61,8 @@ class TSLightShapeView: TSBaseView {
         
         let bottom = 0
         bgShapeView.snp.makeConstraints { make in
-            make.leading.equalTo(0)
-            make.trailing.equalTo(0)
+            make.leading.equalTo(less)
+            make.trailing.equalTo(-less)
             make.top.equalTo(0)
             make.bottom.equalTo(bottom)
         }

+ 2 - 2
Girly/Business/Light/VC/View/TSLightSolidColorToolView.swift

@@ -9,8 +9,8 @@ import IGColorPicker
 class TSLightSolidColorToolView: TSBaseView {
     
     lazy var colorSlider: ColorSlider = {
-        let colorSlider = ColorSlider(orientation: .horizontal, previewSide: .top)
-        colorSlider.color = .white
+        let colorSlider = kCommonColorSlider()
+        colorSlider.color = TSConfig.ligntSolidDefaultColor
         colorSlider.addTarget(self, action: #selector(changedColor(slider:)), for: .valueChanged)
         return colorSlider
     }()

+ 1 - 1
Girly/Business/Mirror/TSMirrorVC.swift

@@ -36,7 +36,7 @@ class TSMirrorVC: TSBaseVC{
         
         toolView.changedBrightnessComplete = { [weak self] floatNum in
             guard let self = self else { return }
-            UIScreen.main.brightness = floatNum
+            UIDevice.brightness(brightness: floatNum)
         }
         
         toolView.selectedColorComplete = {[weak self] model in

+ 72 - 33
Girly/Business/Mirror/View/TSMirrorCameraView.swift

@@ -10,18 +10,18 @@ class TSMirrorCameraView: TSBaseView {
     private var shwoWidth:CGFloat = k_ScreenWidth - 32
     var imageNamed:String = "mirror_round" {
         didSet{
-            if let image = UIImage(named: imageNamed) {
+            if UIImage(named: imageNamed) != nil {
                 setShapeView(shapeView: cameraView)
             }
         }
     }
+
+    lazy var noPermissionView: TSMirrorCameraNoPermissionView = {
+        let noPermissionView = TSMirrorCameraNoPermissionView()
+        noPermissionView.isHidden = true
+        return noPermissionView
+    }()
     
-//    lazy var imageView: UIImageView = {
-//        let imageView = UIImageView()
-//        imageView.backgroundColor = .yellow
-//        imageView.contentMode = .scaleAspectFit
-//        return imageView
-//    }()
     
     lazy var cameraManager: CameraManager = {
         let cameraManager = CameraManager()
@@ -55,36 +55,26 @@ class TSMirrorCameraView: TSBaseView {
             make.bottom.equalTo(0)
         }
         
-//        contentView.addSubview(imageView)
-//        imageView.snp.makeConstraints { make in
-//            make.center.equalToSuperview()
-//            make.width.equalTo(shwoWidth)
-//            make.height.equalTo(shwoWidth)
-//        }
+        contentView.addSubview(noPermissionView)
+        noPermissionView.snp.makeConstraints { make in
+            make.top.equalTo(111)
+            make.leading.trailing.equalTo(0)
+        }
         
         self.layoutIfNeeded()
         cameraManager.askUserForCameraPermission { [weak self]  permissionGranted in
             guard let self = self else { return }
             
             if permissionGranted {
-            
+                noPermissionView.isHidden = true
+                self.addCameraToView()
                 kDelayMainShort {
                     self.setShapeView(shapeView: self.cameraView)
                 }
-        
-        self.addCameraToView()
-                
             } else {
-                if #available(iOS 10.0, *) {
-                    UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
-                } else {
-                    // Fallback on earlier versions
-                }
+                noPermissionView.isHidden = false
             }
         }
-        
-
-
     }
     
     func setShapeView(shapeView:UIView){
@@ -96,20 +86,69 @@ class TSMirrorCameraView: TSBaseView {
     
     fileprivate func addCameraToView() {
         cameraManager.addPreviewLayerToView(cameraView)
-        cameraManager.showErrorBlock = { [weak self] (erTitle: String, erMessage: String) -> Void in
-            debugPrint(erMessage)
-        }
-        
-    
+//        cameraManager.showErrorBlock = { [weak self] (erTitle: String, erMessage: String) -> Void in
+//            debugPrint(erMessage)
+//        }
     }
     
     
     func startCapture() {
-//        cameraManager.resumeCaptureSession()
-
+        cameraManager.resumeCaptureSession()
     }
     
     func endCapture() {
-//        cameraManager.stopCaptureSession()
+        cameraManager.stopCaptureSession()
+    }
+}
+
+
+
+class TSMirrorCameraNoPermissionView: TSBaseView {
+    
+    lazy var imageView: UIImageView = {
+        let imageView = UIImageView.createImageView(imageName: "nopermission")
+        return imageView
+    }()
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(text: "No camera permission. Can't look in the mirror. Open now.",font: .font(size: 14.0),textColor: .assist,numberOfLines: 0)
+        textLabel.setLineSpacing(4,alignment: .center)
+        return textLabel
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let btn = createNormalSubmitBtn(title: "Open Now") {
+            UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
+        }
+        btn.cornerRadius = 22
+        return btn
+    }()
+    
+    override func creatUI() {
+        contentView.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.top.equalTo(0)
+            make.width.equalTo(120)
+            make.height.equalTo(120)
+        }
+        
+        contentView.addSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.top.equalTo(imageView.snp.bottom).offset(14.0)
+            make.left.equalTo(74)
+            make.right.equalTo(-74)
+        }
+        
+        contentView.addSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.centerX.equalToSuperview()
+            make.top.equalTo(textLabel.snp.bottom).offset(38.0)
+            make.left.equalTo(50)
+            make.right.equalTo(-50)
+            make.height.equalTo(44.0)
+            make.bottom.equalToSuperview()
+        }
     }
 }

+ 78 - 0
Girly/Business/Setting/TSSettingCell.swift

@@ -0,0 +1,78 @@
+//
+//  TSSettingCell.swift
+//  Girly
+//
+//  Created by 100Years on 2025/1/10.
+//
+
+class TSSettingCell: TSSimpleTableViewCell {
+    
+    lazy var leftLab: UILabel = {
+        return UILabel.createLabel(font: .font(size: 16,weight: .bold),textColor: .white)
+    }()
+    
+    lazy var rightLab: UILabel = {
+        return UILabel.createLabel(font: .font(size: 16,weight: .bold),textColor: .fromHex("FFFFFF", alpha: 0.4))
+    }()
+    
+    lazy var rightImageView: UIImageView = {
+        return UIImageView.createRightArrow()
+    }()
+    
+    lazy var lineView: UIView = {
+        let lineView = UIView()
+        lineView.backgroundColor = UIColor.fromHex("#FFFFFF", alpha: 0.1)
+        return lineView
+    }()
+    override var itemModel:TSBasicItemModel{
+        didSet{
+            leftLab.text = itemModel.leftTitle
+            rightLab.text = itemModel.rightString
+            
+            if itemModel.rightIsHave {
+                rightImageView.isHidden = false
+                rightLab.isHidden = true
+            }else{
+                rightImageView.isHidden = true
+                rightLab.isHidden = false
+            }
+            
+            lineView.isHidden = !itemModel.bottomIsHave
+            self.bgContentView.frame = CGRect(x: 0, y: 0, width: k_ScreenWidth - 32, height: itemModel.height)
+            self.itemModel.setCornerView(self.bgContentView, corner: 20)
+        }
+    }
+    
+    override func creatUI() {
+        bgContentView.backgroundColor = UIColor.fromHex("FFFFFF", alpha: 0.1)
+        bgContentView.addSubview(leftLab)
+        bgContentView.addSubview(rightLab)
+        bgContentView.addSubview(rightImageView)
+        bgContentView.addSubview(lineView)
+        
+        leftLab.snp.makeConstraints { make in
+            make.leading.equalTo(16)
+            make.centerY.equalToSuperview()
+        }
+        
+        rightLab.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.centerY.equalToSuperview()
+        }
+        
+        rightImageView.snp.makeConstraints { make in
+            make.trailing.equalTo(-16)
+            make.centerY.equalToSuperview()
+            make.width.height.equalTo(24)
+        }
+        
+        lineView.snp.makeConstraints { make in
+            make.leading.trailing.bottom.equalTo(0)
+            make.height.equalTo(1)
+        }
+    }
+    
+    override func didEndDisplaying(indexPath: IndexPath) {
+        self.itemModel.setCornerView(self.bgContentView, corner: 20)
+    }
+}

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott