张颢曦 4 éve
szülő
commit
c5fc031a58
100 módosított fájl, 10083 hozzáadás és 0 törlés
  1. 71 0
      .gitignore
  2. 2535 0
      Jianbinglian.xcodeproj/project.pbxproj
  3. 7 0
      Jianbinglian.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  4. 8 0
      Jianbinglian.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  5. 10 0
      Jianbinglian.xcworkspace/contents.xcworkspacedata
  6. 8 0
      Jianbinglian.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  7. 17 0
      Jianbinglian/Base(基类)/BaseButton/MTBaseButton.h
  8. 29 0
      Jianbinglian/Base(基类)/BaseButton/MTBaseButton.m
  9. 16 0
      Jianbinglian/Base(基类)/BaseCollectionView/MTBaseCollectionView.h
  10. 20 0
      Jianbinglian/Base(基类)/BaseCollectionView/MTBaseCollectionView.m
  11. 16 0
      Jianbinglian/Base(基类)/BaseCollectionViewCell/MTBaseCollectionViewCell.h
  12. 12 0
      Jianbinglian/Base(基类)/BaseCollectionViewCell/MTBaseCollectionViewCell.m
  13. 30 0
      Jianbinglian/Base(基类)/BaseController/MTBaseViewController.h
  14. 176 0
      Jianbinglian/Base(基类)/BaseController/MTBaseViewController.m
  15. 23 0
      Jianbinglian/Base(基类)/BaseController/MTViewControllerProtocol.h
  16. 16 0
      Jianbinglian/Base(基类)/BaseImageView/MTBaseImageView.h
  17. 24 0
      Jianbinglian/Base(基类)/BaseImageView/MTBaseImageView.m
  18. 21 0
      Jianbinglian/Base(基类)/BaseLabel/MTBaseLabel.h
  19. 52 0
      Jianbinglian/Base(基类)/BaseLabel/MTBaseLabel.m
  20. 27 0
      Jianbinglian/Base(基类)/BaseModel/MTBaseModel.h
  21. 31 0
      Jianbinglian/Base(基类)/BaseModel/MTBaseModel.m
  22. 37 0
      Jianbinglian/Base(基类)/BaseNavigationController/CustomNaviBarView.h
  23. 312 0
      Jianbinglian/Base(基类)/BaseNavigationController/CustomNaviBarView.m
  24. 15 0
      Jianbinglian/Base(基类)/BaseNavigationController/CustomNavigationController.h
  25. 42 0
      Jianbinglian/Base(基类)/BaseNavigationController/CustomNavigationController.m
  26. 17 0
      Jianbinglian/Base(基类)/BaseRootController/MTRootController.h
  27. 66 0
      Jianbinglian/Base(基类)/BaseRootController/MTRootController.m
  28. 16 0
      Jianbinglian/Base(基类)/BaseTableView/MTBaseTableView.h
  29. 29 0
      Jianbinglian/Base(基类)/BaseTableView/MTBaseTableView.m
  30. 16 0
      Jianbinglian/Base(基类)/BaseTableViewCell/MTBaseTableViewCell.h
  31. 25 0
      Jianbinglian/Base(基类)/BaseTableViewCell/MTBaseTableViewCell.m
  32. 17 0
      Jianbinglian/Base(基类)/BaseTextField/MTBaseTextField.h
  33. 24 0
      Jianbinglian/Base(基类)/BaseTextField/MTBaseTextField.m
  34. 19 0
      Jianbinglian/Base(基类)/BaseView/MTBaseView.h
  35. 28 0
      Jianbinglian/Base(基类)/BaseView/MTBaseView.m
  36. 22 0
      Jianbinglian/Base(基类)/BaseViewModel/MTBaseViewModel.h
  37. 26 0
      Jianbinglian/Base(基类)/BaseViewModel/MTBaseViewModel.m
  38. 16 0
      Jianbinglian/Category(分类扩展)/NSLayoutConstraint+MT.h
  39. 33 0
      Jianbinglian/Category(分类扩展)/NSLayoutConstraint+MT.m
  40. 27 0
      Jianbinglian/Category(分类扩展)/NSString+MT.h
  41. 35 0
      Jianbinglian/Category(分类扩展)/NSString+MT.m
  42. 17 0
      Jianbinglian/Category(分类扩展)/UIButton+MT.h
  43. 26 0
      Jianbinglian/Category(分类扩展)/UIButton+MT.m
  44. 20 0
      Jianbinglian/Category(分类扩展)/UIColor+MT.h
  45. 68 0
      Jianbinglian/Category(分类扩展)/UIColor+MT.m
  46. 18 0
      Jianbinglian/Category(分类扩展)/UIImage+MT.h
  47. 32 0
      Jianbinglian/Category(分类扩展)/UIImage+MT.m
  48. 16 0
      Jianbinglian/Category(分类扩展)/UIImage+getSize.h
  49. 178 0
      Jianbinglian/Category(分类扩展)/UIImage+getSize.m
  50. 25 0
      Jianbinglian/Category(分类扩展)/UIImageView+MT.h
  51. 94 0
      Jianbinglian/Category(分类扩展)/UIImageView+MT.m
  52. 17 0
      Jianbinglian/Category(分类扩展)/UILabel+MT.h
  53. 26 0
      Jianbinglian/Category(分类扩展)/UILabel+MT.m
  54. 17 0
      Jianbinglian/Category(分类扩展)/UITextField+MT.h
  55. 25 0
      Jianbinglian/Category(分类扩展)/UITextField+MT.m
  56. 17 0
      Jianbinglian/Category(分类扩展)/UITextView+MT.h
  57. 26 0
      Jianbinglian/Category(分类扩展)/UITextView+MT.m
  58. 61 0
      Jianbinglian/Category(分类扩展)/UIView+MT.h
  59. 155 0
      Jianbinglian/Category(分类扩展)/UIView+MT.m
  60. 29 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVFoodPieModel.h
  61. 13 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVFoodPieModel.m
  62. 17 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieCenterView.h
  63. 69 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieCenterView.m
  64. 28 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieChart.h
  65. 465 0
      Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieChart.m
  66. 33 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScanner.h
  67. 83 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerMacros.h
  68. 57 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerPreView.h
  69. 450 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerPreView.m
  70. 57 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerViewController.h
  71. 378 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerViewController.m
  72. 42 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFQRCodeImageView.h
  73. 148 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFQRCodeImageView.m
  74. 58 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIButton+Corner.h
  75. 81 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIButton+Corner.m
  76. 34 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIImage+QRCode.h
  77. 52 0
      Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIImage+QRCode.m
  78. 36 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView+Categories.h
  79. 99 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView+Categories.m
  80. 276 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView.m
  81. 590 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView.xib
  82. 45 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewController.m
  83. 23 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewController.xib
  84. 47 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewMaker.m
  85. 15 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerWindow.h
  86. 100 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerWindow.m
  87. 240 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBCustomBannerView.m
  88. 12 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBEmptyWindow.h
  89. 16 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBEmptyWindow.m
  90. 16 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.h
  91. 63 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.m
  92. BIN
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.mp3
  93. 590 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBSystemBannerView.xib
  94. 62 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBBannerView.h
  95. 16 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBBannerViewController.h
  96. 48 0
      Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBCustomBannerView.h
  97. 62 0
      Jianbinglian/Lib(第三方库)/FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.h
  98. 280 0
      Jianbinglian/Lib(第三方库)/FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.m
  99. 244 0
      Jianbinglian/Lib(第三方库)/JYRouter/JYRouter.h
  100. 300 0
      Jianbinglian/Lib(第三方库)/JYRouter/JYRouter.m

+ 71 - 0
.gitignore

@@ -0,0 +1,71 @@
+
+# Created by https://www.gitignore.io/api/objective-c
+
+### Objective-C ###
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## Build generated
+build/
+DerivedData/
+
+## Various settings
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata/
+
+## Other
+*.moved-aside
+*.xcuserstate
+
+## Obj-C/Swift specific
+*.hmap
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+#
+# Pods/
+Pods
+Podfile.lock
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
+
+fastlane/report.xml
+fastlane/screenshots
+
+#Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
+
+### Objective-C Patch ###
+*.xcscmblueprint
+.DS_Store
+

+ 2535 - 0
Jianbinglian.xcodeproj/project.pbxproj

@@ -0,0 +1,2535 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 51;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		45C4DF2F22FD42300072EE2F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C4DF2E22FD42300072EE2F /* AppDelegate.m */; };
+		45C4DF3522FD42300072EE2F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45C4DF3322FD42300072EE2F /* Main.storyboard */; };
+		45C4DF3722FD42310072EE2F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 45C4DF3622FD42310072EE2F /* Assets.xcassets */; };
+		45C4DF3A22FD42310072EE2F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45C4DF3822FD42310072EE2F /* LaunchScreen.storyboard */; };
+		45C4DF3D22FD42310072EE2F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C4DF3C22FD42310072EE2F /* main.m */; };
+		45C4DF4722FD42320072EE2F /* JianbinglianTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C4DF4622FD42320072EE2F /* JianbinglianTests.m */; };
+		45C4DF5222FD42320072EE2F /* JianbinglianUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C4DF5122FD42320072EE2F /* JianbinglianUITests.m */; };
+		5C6F095755A4F298376DFFC4 /* Pods_JianbinglianTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48CAD46FAFF35F3578C3016B /* Pods_JianbinglianTests.framework */; };
+		8E6494CEAAD81ED909A7FCE3 /* Pods_JianbinglianUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08253954140C8723BFFEFA2C /* Pods_JianbinglianUITests.framework */; };
+		F4029E4523079AB800D85DD0 /* MTMyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4029E3923079AB800D85DD0 /* MTMyViewController.m */; };
+		F4029E4623079AB800D85DD0 /* MTMyViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4029E3B23079AB800D85DD0 /* MTMyViewModel.m */; };
+		F4029E4723079AB800D85DD0 /* MTMyModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4029E3E23079AB800D85DD0 /* MTMyModel.m */; };
+		F4029E4823079AB800D85DD0 /* MTMyHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4029E4323079AB800D85DD0 /* MTMyHeaderView.m */; };
+		F4029E502307ECA600D85DD0 /* UIImageView+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F4029E4F2307ECA600D85DD0 /* UIImageView+MT.m */; };
+		F4051E1C2306874200AD2B9B /* MTMD5Tool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E1B2306874200AD2B9B /* MTMD5Tool.m */; };
+		F4051E1F2306878C00AD2B9B /* MTStringTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E1E2306878C00AD2B9B /* MTStringTool.m */; };
+		F4051E22230687DE00AD2B9B /* MTTimeTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E21230687DE00AD2B9B /* MTTimeTool.m */; };
+		F4051E3F2306937200AD2B9B /* Routable.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E302306937200AD2B9B /* Routable.m */; };
+		F4051E422306937200AD2B9B /* JYRouter.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E392306937200AD2B9B /* JYRouter.m */; };
+		F4051E472306951D00AD2B9B /* UINavigationController+FDFullscreenPopGesture.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E462306951C00AD2B9B /* UINavigationController+FDFullscreenPopGesture.m */; };
+		F4051E5323069AC400AD2B9B /* WMPageController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E4A23069AC400AD2B9B /* WMPageController.m */; };
+		F4051E5423069AC400AD2B9B /* WMMenuItem.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E4E23069AC400AD2B9B /* WMMenuItem.m */; };
+		F4051E5523069AC400AD2B9B /* WMScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5023069AC400AD2B9B /* WMScrollView.m */; };
+		F4051E5623069AC400AD2B9B /* WMMenuView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5123069AC400AD2B9B /* WMMenuView.m */; };
+		F4051E5723069AC400AD2B9B /* WMProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5223069AC400AD2B9B /* WMProgressView.m */; };
+		F4051E5F23069CFC00AD2B9B /* UIView+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5923069CFC00AD2B9B /* UIView+MT.m */; };
+		F4051E6023069CFC00AD2B9B /* NSString+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5C23069CFC00AD2B9B /* NSString+MT.m */; };
+		F4051E6123069CFC00AD2B9B /* UIColor+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E5E23069CFC00AD2B9B /* UIColor+MT.m */; };
+		F4051E6723069E9700AD2B9B /* MTCacheTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E6323069E9700AD2B9B /* MTCacheTool.m */; };
+		F4051E6823069E9700AD2B9B /* MTHttpTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4051E6623069E9700AD2B9B /* MTHttpTool.m */; };
+		F414BCC8230541F300CA26D8 /* MTDevicesTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCB8230541F300CA26D8 /* MTDevicesTool.m */; };
+		F414BCC9230541F300CA26D8 /* MTInternationalTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCBB230541F300CA26D8 /* MTInternationalTool.m */; };
+		F414BCCA230541F300CA26D8 /* MTTipsTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCBE230541F300CA26D8 /* MTTipsTool.m */; };
+		F414BCCB230541F300CA26D8 /* MTTopImageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCC1230541F300CA26D8 /* MTTopImageButton.m */; };
+		F414BCCC230541F300CA26D8 /* MTRightImageButton.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCC2230541F300CA26D8 /* MTRightImageButton.m */; };
+		F414BCCD230541F300CA26D8 /* MTGifRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCC6230541F300CA26D8 /* MTGifRefreshHeader.m */; };
+		F414BCD523054E2000CA26D8 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCD223054E2000CA26D8 /* NSObject+YYModel.m */; };
+		F414BCD623054E2000CA26D8 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCD323054E2000CA26D8 /* YYClassInfo.m */; };
+		F414BCDC2305521200CA26D8 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F414BCDE2305521200CA26D8 /* Localizable.strings */; };
+		F414BD112305537F00CA26D8 /* MTBaseTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCE12305537E00CA26D8 /* MTBaseTableView.m */; };
+		F414BD122305537F00CA26D8 /* MTBaseCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCE52305537E00CA26D8 /* MTBaseCollectionView.m */; };
+		F414BD132305537F00CA26D8 /* MTBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCE82305537F00CA26D8 /* MTBaseViewController.m */; };
+		F414BD142305537F00CA26D8 /* CustomNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCEB2305537F00CA26D8 /* CustomNavigationController.m */; };
+		F414BD152305537F00CA26D8 /* CustomNaviBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCED2305537F00CA26D8 /* CustomNaviBarView.m */; };
+		F414BD162305537F00CA26D8 /* MTBaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCEF2305537F00CA26D8 /* MTBaseTableViewCell.m */; };
+		F414BD172305537F00CA26D8 /* MTBaseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCF22305537F00CA26D8 /* MTBaseButton.m */; };
+		F414BD182305537F00CA26D8 /* MTRootController.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCF62305537F00CA26D8 /* MTRootController.m */; };
+		F414BD192305537F00CA26D8 /* MTBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BCF82305537F00CA26D8 /* MTBaseView.m */; };
+		F414BD1C2305537F00CA26D8 /* MTBaseImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD002305537F00CA26D8 /* MTBaseImageView.m */; };
+		F414BD1D2305537F00CA26D8 /* MTBaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD042305537F00CA26D8 /* MTBaseModel.m */; };
+		F414BD1E2305537F00CA26D8 /* MTBaseCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD062305537F00CA26D8 /* MTBaseCollectionViewCell.m */; };
+		F414BD1F2305537F00CA26D8 /* MTBaseLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD092305537F00CA26D8 /* MTBaseLabel.m */; };
+		F414BD202305537F00CA26D8 /* MTBaseTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD0D2305537F00CA26D8 /* MTBaseTextField.m */; };
+		F414BD212305537F00CA26D8 /* MTBaseViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F414BD0F2305537F00CA26D8 /* MTBaseViewModel.m */; };
+		F42019702580CD6200BECDE1 /* MTBoardListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F42019672580CD6200BECDE1 /* MTBoardListViewController.m */; };
+		F42019712580CD6200BECDE1 /* MTBoardListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F420196A2580CD6200BECDE1 /* MTBoardListModel.m */; };
+		F42019722580CD6200BECDE1 /* MTBoardListViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F420196D2580CD6200BECDE1 /* MTBoardListViewModel.m */; };
+		F42019792580CD8500BECDE1 /* MTBoardListTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F42019772580CD8500BECDE1 /* MTBoardListTableViewCell.m */; };
+		F420197A2580CD8500BECDE1 /* MTBoardListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F42019782580CD8500BECDE1 /* MTBoardListTableViewCell.xib */; };
+		F42019802580CEFE00BECDE1 /* MTBoardDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F420197F2580CEFE00BECDE1 /* MTBoardDetailViewController.m */; };
+		F423D414230C450A008D0675 /* UIButton+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F423D40A230C4509008D0675 /* UIButton+MT.m */; };
+		F423D415230C450A008D0675 /* UILabel+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F423D40B230C450A008D0675 /* UILabel+MT.m */; };
+		F423D416230C450A008D0675 /* UITextField+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F423D410230C450A008D0675 /* UITextField+MT.m */; };
+		F423D417230C450A008D0675 /* UITextView+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F423D411230C450A008D0675 /* UITextView+MT.m */; };
+		F423D418230C450A008D0675 /* NSLayoutConstraint+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F423D413230C450A008D0675 /* NSLayoutConstraint+MT.m */; };
+		F44D3255230D1CEA00735FAD /* DVPieCenterView.m in Sources */ = {isa = PBXBuildFile; fileRef = F44D324F230D1CEA00735FAD /* DVPieCenterView.m */; };
+		F44D3256230D1CEA00735FAD /* DVFoodPieModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F44D3250230D1CEA00735FAD /* DVFoodPieModel.m */; };
+		F44D3257230D1CEA00735FAD /* DVPieChart.m in Sources */ = {isa = PBXBuildFile; fileRef = F44D3254230D1CEA00735FAD /* DVPieChart.m */; };
+		F451BFC525CC0655000EEE1C /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F451BFC425CC0654000EEE1C /* ExternalAccessory.framework */; };
+		F451BFC725CC0660000EEE1C /* Pods_Jianbinglian.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F451BFC625CC0660000EEE1C /* Pods_Jianbinglian.framework */; };
+		F478D7FC25ADA20E006B4E61 /* MTLoginViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D7DC25ADA20E006B4E61 /* MTLoginViewModel.m */; };
+		F478D7FD25ADA20E006B4E61 /* MTLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D7DF25ADA20E006B4E61 /* MTLoginViewController.m */; };
+		F478D7FE25ADA20E006B4E61 /* MTLoginModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D7E225ADA20E006B4E61 /* MTLoginModel.m */; };
+		F478D80025ADA20E006B4E61 /* MTLoginHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D7E625ADA20E006B4E61 /* MTLoginHeaderView.m */; };
+		F478D81B25ADA403006B4E61 /* MTRegistViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D80F25ADA403006B4E61 /* MTRegistViewModel.m */; };
+		F478D81C25ADA403006B4E61 /* MTRegistViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D81125ADA403006B4E61 /* MTRegistViewController.m */; };
+		F478D81D25ADA403006B4E61 /* MTRegistModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D81425ADA403006B4E61 /* MTRegistModel.m */; };
+		F478D81E25ADA403006B4E61 /* MTRegistHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D81725ADA403006B4E61 /* MTRegistHeaderView.m */; };
+		F478D83525ADA4C0006B4E61 /* MTForgetViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D82825ADA4C0006B4E61 /* MTForgetViewModel.m */; };
+		F478D83625ADA4C0006B4E61 /* MTForgetViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D82C25ADA4C0006B4E61 /* MTForgetViewController.m */; };
+		F478D83725ADA4C0006B4E61 /* MTForgetModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D82E25ADA4C0006B4E61 /* MTForgetModel.m */; };
+		F478D83925ADA4C0006B4E61 /* MTForgetHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D83325ADA4C0006B4E61 /* MTForgetHeaderView.m */; };
+		F478D84425ADA830006B4E61 /* MTLoginHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F478D84325ADA830006B4E61 /* MTLoginHeaderView.xib */; };
+		F478D84925ADA864006B4E61 /* MTRegistHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F478D84825ADA864006B4E61 /* MTRegistHeaderView.xib */; };
+		F478D84E25ADA8B3006B4E61 /* MTForgetHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F478D84D25ADA8B3006B4E61 /* MTForgetHeaderView.xib */; };
+		F478D85F25AEDF58006B4E61 /* MTBingViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D85425AEDF57006B4E61 /* MTBingViewModel.m */; };
+		F478D86025AEDF58006B4E61 /* MTBingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D85825AEDF57006B4E61 /* MTBingViewController.m */; };
+		F478D86125AEDF58006B4E61 /* MTBingHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D85B25AEDF57006B4E61 /* MTBingHeaderView.m */; };
+		F478D86225AEDF58006B4E61 /* MTBingModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D85D25AEDF58006B4E61 /* MTBingModel.m */; };
+		F478D86725AEDF97006B4E61 /* MTBingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F478D86625AEDF97006B4E61 /* MTBingHeaderView.xib */; };
+		F478D86E25B02D00006B4E61 /* MTXieyiViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D86D25B02D00006B4E61 /* MTXieyiViewController.m */; };
+		F478D87D25B06031006B4E61 /* UIImage+getSize.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D87C25B06030006B4E61 /* UIImage+getSize.m */; };
+		F478D8A225B43D37006B4E61 /* MTUserInforModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D8A025B43D37006B4E61 /* MTUserInforModel.m */; };
+		F478D8CD25B80747006B4E61 /* MTConfigModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D8CC25B80747006B4E61 /* MTConfigModel.m */; };
+		F478D8E625BC01DC006B4E61 /* MTPhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D8E525BC01DC006B4E61 /* MTPhotoView.m */; };
+		F478D8F025BC0345006B4E61 /* addImg.png in Resources */ = {isa = PBXBuildFile; fileRef = F478D8ED25BC0344006B4E61 /* addImg.png */; };
+		F478D8F125BC0345006B4E61 /* addImg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F478D8EE25BC0345006B4E61 /* addImg@2x.png */; };
+		F478D8F225BC0345006B4E61 /* addImg@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F478D8EF25BC0345006B4E61 /* addImg@3x.png */; };
+		F478D8F825BC0444006B4E61 /* MTPhotoConfigModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F478D8F725BC0444006B4E61 /* MTPhotoConfigModel.m */; };
+		F478D8FD25BC15CB006B4E61 /* imgDel.png in Resources */ = {isa = PBXBuildFile; fileRef = F478D8FC25BC15CB006B4E61 /* imgDel.png */; };
+		F479B0C62319639A00C58D9D /* MTUpLoadViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F479B0C52319639A00C58D9D /* MTUpLoadViewModel.m */; };
+		F491D4352351BCD300D34A4A /* MTCopyLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = F491D4342351BCD200D34A4A /* MTCopyLabel.m */; };
+		F497E534230FB73F00939809 /* MTWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F497E532230FB73F00939809 /* MTWebViewController.m */; };
+		F4E51C35258A004200135614 /* MTTimePickView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E51C34258A004200135614 /* MTTimePickView.m */; };
+		F4E51C3A258A005E00135614 /* MTTimePickView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E51C39258A005E00135614 /* MTTimePickView.xib */; };
+		F4E99CB325903B1F002850DD /* MTStartView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99CB025903B1E002850DD /* MTStartView.m */; };
+		F4E99CB425903B1F002850DD /* MTStartView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99CB125903B1E002850DD /* MTStartView.xib */; };
+		F4E99DF72595C611002850DD /* MTMyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99DF52595C611002850DD /* MTMyTableViewCell.m */; };
+		F4E99DF82595C611002850DD /* MTMyTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99DF62595C611002850DD /* MTMyTableViewCell.xib */; };
+		F4E99DFD2595C9BD002850DD /* MTMyHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99DFC2595C9BD002850DD /* MTMyHeaderView.xib */; };
+		F4E99ED9259AF338002850DD /* GJ_Me_WalletViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99EC4259AF338002850DD /* GJ_Me_WalletViewController.m */; };
+		F4E99EDA259AF338002850DD /* GJ_Me_Wallet_HeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99EC7259AF338002850DD /* GJ_Me_Wallet_HeaderView.xib */; };
+		F4E99EDB259AF338002850DD /* GJ_Me_Wallet_Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99EC9259AF338002850DD /* GJ_Me_Wallet_Cell.m */; };
+		F4E99EDC259AF338002850DD /* GJ_Me_Wallet_HeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99ECA259AF338002850DD /* GJ_Me_Wallet_HeaderView.m */; };
+		F4E99EDD259AF338002850DD /* GJ_Me_Wallet_Cell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99ECB259AF338002850DD /* GJ_Me_Wallet_Cell.xib */; };
+		F4E99EDE259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99ECD259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.m */; };
+		F4E99EDF259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99ECE259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.xib */; };
+		F4E99EE0259AF338002850DD /* GJ_Me_CashOut_WXViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99ED2259AF338002850DD /* GJ_Me_CashOut_WXViewController.xib */; };
+		F4E99EE1259AF338002850DD /* GJ_Me_CashOut_WXViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99ED4259AF338002850DD /* GJ_Me_CashOut_WXViewController.m */; };
+		F4E99EE2259AF338002850DD /* GJ_Me_CashOut_BankViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99ED7259AF338002850DD /* GJ_Me_CashOut_BankViewController.m */; };
+		F4E99EE3259AF338002850DD /* GJ_Me_CashOut_BankViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99ED8259AF338002850DD /* GJ_Me_CashOut_BankViewController.xib */; };
+		F4E99F7A259B2C92002850DD /* MTPayInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F6E259B2C92002850DD /* MTPayInViewController.m */; };
+		F4E99F7B259B2C93002850DD /* MTPayInModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F70259B2C92002850DD /* MTPayInModel.m */; };
+		F4E99F7C259B2C93002850DD /* MTPayInHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F74259B2C92002850DD /* MTPayInHeaderView.m */; };
+		F4E99F7D259B2C93002850DD /* MTPayInTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F76259B2C92002850DD /* MTPayInTableViewCell.m */; };
+		F4E99F7E259B2C93002850DD /* MTPayInViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F78259B2C92002850DD /* MTPayInViewModel.m */; };
+		F4E99F83259B2E10002850DD /* MTPayInHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99F82259B2E10002850DD /* MTPayInHeaderView.xib */; };
+		F4E99F97259D7EC0002850DD /* MTSettingViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F8D259D7EBF002850DD /* MTSettingViewModel.m */; };
+		F4E99F98259D7EC0002850DD /* MTSettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F90259D7EBF002850DD /* MTSettingViewController.m */; };
+		F4E99F99259D7EC0002850DD /* MTSettingModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F93259D7EBF002850DD /* MTSettingModel.m */; };
+		F4E99F9A259D7EC0002850DD /* MTSettingHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99F96259D7EC0002850DD /* MTSettingHeaderView.m */; };
+		F4E99F9F259D7EFD002850DD /* MTSettingHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99F9E259D7EFD002850DD /* MTSettingHeaderView.xib */; };
+		F4E99FAD259DA697002850DD /* FFMineRetrievePayPwdController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FA5259DA696002850DD /* FFMineRetrievePayPwdController.m */; };
+		F4E99FAF259DA697002850DD /* FFMinePayPasswordController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FAC259DA697002850DD /* FFMinePayPasswordController.m */; };
+		F4E99FC6259DB1B1002850DD /* MTInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FBB259DB1B1002850DD /* MTInfoModel.m */; };
+		F4E99FC7259DB1B1002850DD /* MTInfoHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FBF259DB1B1002850DD /* MTInfoHeaderView.m */; };
+		F4E99FC8259DB1B1002850DD /* MTInfoViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FC1259DB1B1002850DD /* MTInfoViewModel.m */; };
+		F4E99FC9259DB1B1002850DD /* MTInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4E99FC4259DB1B1002850DD /* MTInfoViewController.m */; };
+		F4E99FCE259DB1C6002850DD /* MTInfoHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4E99FCD259DB1C6002850DD /* MTInfoHeaderView.xib */; };
+		F4ED176124C03A17003D7B3F /* DYFCodeScannerPreView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED175824C03A17003D7B3F /* DYFCodeScannerPreView.m */; };
+		F4ED176224C03A17003D7B3F /* DYFCodeScannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED175A24C03A17003D7B3F /* DYFCodeScannerViewController.m */; };
+		F4ED176324C03A17003D7B3F /* DYFQRCodeImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED175C24C03A17003D7B3F /* DYFQRCodeImageView.m */; };
+		F4ED176424C03A17003D7B3F /* UIButton+Corner.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED175E24C03A17003D7B3F /* UIButton+Corner.m */; };
+		F4ED176524C03A17003D7B3F /* UIImage+QRCode.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED176024C03A17003D7B3F /* UIImage+QRCode.m */; };
+		F4ED176824C03ACB003D7B3F /* UIImage+MT.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED176724C03ACB003D7B3F /* UIImage+MT.m */; };
+		F4ED177B24C03BD9003D7B3F /* WXApiManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED176B24C03BD9003D7B3F /* WXApiManager.m */; };
+		F4ED177C24C03BD9003D7B3F /* MTImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED176E24C03BD9003D7B3F /* MTImageManager.m */; };
+		F4ED177E24C03BD9003D7B3F /* MTAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED177424C03BD9003D7B3F /* MTAssetManager.m */; };
+		F4ED177F24C03BD9003D7B3F /* MTApplePayTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED177724C03BD9003D7B3F /* MTApplePayTool.m */; };
+		F4ED178024C03BD9003D7B3F /* MTVideoDownTool.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED177A24C03BD9003D7B3F /* MTVideoDownTool.m */; };
+		F4ED179724C042D5003D7B3F /* EBBannerView+Categories.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178424C042D5003D7B3F /* EBBannerView+Categories.m */; };
+		F4ED179824C042D5003D7B3F /* EBBannerView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178524C042D5003D7B3F /* EBBannerView.m */; };
+		F4ED179924C042D5003D7B3F /* EBBannerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4ED178624C042D5003D7B3F /* EBBannerView.xib */; };
+		F4ED179A24C042D5003D7B3F /* EBBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178724C042D5003D7B3F /* EBBannerViewController.m */; };
+		F4ED179B24C042D5003D7B3F /* EBBannerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4ED178824C042D5003D7B3F /* EBBannerViewController.xib */; };
+		F4ED179C24C042D5003D7B3F /* EBBannerViewMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178924C042D5003D7B3F /* EBBannerViewMaker.m */; };
+		F4ED179D24C042D5003D7B3F /* EBBannerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178B24C042D5003D7B3F /* EBBannerWindow.m */; };
+		F4ED179E24C042D5003D7B3F /* EBCustomBannerView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178C24C042D5003D7B3F /* EBCustomBannerView.m */; };
+		F4ED179F24C042D5003D7B3F /* EBEmptyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED178E24C042D5003D7B3F /* EBEmptyWindow.m */; };
+		F4ED17A024C042D5003D7B3F /* EBMuteDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = F4ED179024C042D5003D7B3F /* EBMuteDetector.m */; };
+		F4ED17A124C042D5003D7B3F /* EBMuteDetector.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = F4ED179124C042D5003D7B3F /* EBMuteDetector.mp3 */; };
+		F4ED17A224C042D5003D7B3F /* EBSystemBannerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4ED179224C042D5003D7B3F /* EBSystemBannerView.xib */; };
+		F4F5BC76258B4FBC00372E4D /* CustomDatePickerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F5BC73258B4FBC00372E4D /* CustomDatePickerViewModel.m */; };
+		F4F5BC77258B4FBC00372E4D /* NSDate+Category.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F5BC74258B4FBC00372E4D /* NSDate+Category.m */; };
+		F4F5BCDA258C810600372E4D /* MTAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F5BCD7258C810600372E4D /* MTAlertView.m */; };
+		F4F5BCDB258C810600372E4D /* MTAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4F5BCD8258C810600372E4D /* MTAlertView.xib */; };
+		F4F5BD06258C91F700372E4D /* MTNoDataView.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F5BD05258C91F700372E4D /* MTNoDataView.m */; };
+		F4F5BD0E258C921800372E4D /* MTNoDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4F5BD0D258C921800372E4D /* MTNoDataView.xib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		45C4DF4322FD42320072EE2F /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 45C4DF2222FD422F0072EE2F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 45C4DF2922FD42300072EE2F;
+			remoteInfo = Jianbinglian;
+		};
+		45C4DF4E22FD42320072EE2F /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 45C4DF2222FD422F0072EE2F /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 45C4DF2922FD42300072EE2F;
+			remoteInfo = Jianbinglian;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		03C6E27E12294EBE8B7F48DC /* Pods-JianbinglianUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JianbinglianUITests.release.xcconfig"; path = "Target Support Files/Pods-JianbinglianUITests/Pods-JianbinglianUITests.release.xcconfig"; sourceTree = "<group>"; };
+		08253954140C8723BFFEFA2C /* Pods_JianbinglianUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JianbinglianUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		42B2BA49C2CD891CFA3AFA61 /* Pods-JianbinglianUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JianbinglianUITests.debug.xcconfig"; path = "Target Support Files/Pods-JianbinglianUITests/Pods-JianbinglianUITests.debug.xcconfig"; sourceTree = "<group>"; };
+		45C4DF2A22FD42300072EE2F /* Jianbinglian.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Jianbinglian.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		45C4DF2D22FD42300072EE2F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		45C4DF2E22FD42300072EE2F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		45C4DF3422FD42300072EE2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		45C4DF3622FD42310072EE2F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		45C4DF3922FD42310072EE2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		45C4DF3B22FD42310072EE2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		45C4DF3C22FD42310072EE2F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		45C4DF4222FD42320072EE2F /* JianbinglianTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JianbinglianTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		45C4DF4622FD42320072EE2F /* JianbinglianTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JianbinglianTests.m; sourceTree = "<group>"; };
+		45C4DF4822FD42320072EE2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		45C4DF4D22FD42320072EE2F /* JianbinglianUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JianbinglianUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		45C4DF5122FD42320072EE2F /* JianbinglianUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JianbinglianUITests.m; sourceTree = "<group>"; };
+		45C4DF5322FD42320072EE2F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		48CAD46FAFF35F3578C3016B /* Pods_JianbinglianTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JianbinglianTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		673D0FABDEC01E041559FB9A /* Pods-Jianbinglian.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jianbinglian.release.xcconfig"; path = "Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian.release.xcconfig"; sourceTree = "<group>"; };
+		7AC95B38A7A6EEA0F29C5F38 /* Pods-JianbinglianTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JianbinglianTests.debug.xcconfig"; path = "Target Support Files/Pods-JianbinglianTests/Pods-JianbinglianTests.debug.xcconfig"; sourceTree = "<group>"; };
+		8C2D09D5B94C209D63BA7C67 /* Pods-Jianbinglian.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jianbinglian.debug.xcconfig"; path = "Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian.debug.xcconfig"; sourceTree = "<group>"; };
+		C613242FEA4827FCB0291F7A /* Pods-JianbinglianTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JianbinglianTests.release.xcconfig"; path = "Target Support Files/Pods-JianbinglianTests/Pods-JianbinglianTests.release.xcconfig"; sourceTree = "<group>"; };
+		F4029E3823079AB800D85DD0 /* MTMyViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMyViewController.h; sourceTree = "<group>"; };
+		F4029E3923079AB800D85DD0 /* MTMyViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTMyViewController.m; sourceTree = "<group>"; };
+		F4029E3B23079AB800D85DD0 /* MTMyViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTMyViewModel.m; sourceTree = "<group>"; };
+		F4029E3C23079AB800D85DD0 /* MTMyViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMyViewModel.h; sourceTree = "<group>"; };
+		F4029E3E23079AB800D85DD0 /* MTMyModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTMyModel.m; sourceTree = "<group>"; };
+		F4029E3F23079AB800D85DD0 /* MTMyModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMyModel.h; sourceTree = "<group>"; };
+		F4029E4123079AB800D85DD0 /* MTMyHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTMyHeaderView.h; sourceTree = "<group>"; };
+		F4029E4323079AB800D85DD0 /* MTMyHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTMyHeaderView.m; sourceTree = "<group>"; };
+		F4029E4E2307ECA600D85DD0 /* UIImageView+MT.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImageView+MT.h"; sourceTree = "<group>"; };
+		F4029E4F2307ECA600D85DD0 /* UIImageView+MT.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+MT.m"; sourceTree = "<group>"; };
+		F4051E1A2306874200AD2B9B /* MTMD5Tool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTMD5Tool.h; sourceTree = "<group>"; };
+		F4051E1B2306874200AD2B9B /* MTMD5Tool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTMD5Tool.m; sourceTree = "<group>"; };
+		F4051E1D2306878C00AD2B9B /* MTStringTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTStringTool.h; sourceTree = "<group>"; };
+		F4051E1E2306878C00AD2B9B /* MTStringTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTStringTool.m; sourceTree = "<group>"; };
+		F4051E20230687DE00AD2B9B /* MTTimeTool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTTimeTool.h; sourceTree = "<group>"; };
+		F4051E21230687DE00AD2B9B /* MTTimeTool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTTimeTool.m; sourceTree = "<group>"; };
+		F4051E302306937200AD2B9B /* Routable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Routable.m; sourceTree = "<group>"; };
+		F4051E312306937200AD2B9B /* JYRouter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JYRouter.h; sourceTree = "<group>"; };
+		F4051E382306937200AD2B9B /* Routable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Routable.h; sourceTree = "<group>"; };
+		F4051E392306937200AD2B9B /* JYRouter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JYRouter.m; sourceTree = "<group>"; };
+		F4051E452306951C00AD2B9B /* UINavigationController+FDFullscreenPopGesture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+FDFullscreenPopGesture.h"; sourceTree = "<group>"; };
+		F4051E462306951C00AD2B9B /* UINavigationController+FDFullscreenPopGesture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+FDFullscreenPopGesture.m"; sourceTree = "<group>"; };
+		F4051E4923069AC400AD2B9B /* WMScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMScrollView.h; sourceTree = "<group>"; };
+		F4051E4A23069AC400AD2B9B /* WMPageController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMPageController.m; sourceTree = "<group>"; };
+		F4051E4B23069AC400AD2B9B /* WMMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMMenuItem.h; sourceTree = "<group>"; };
+		F4051E4C23069AC400AD2B9B /* WMMenuView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMMenuView.h; sourceTree = "<group>"; };
+		F4051E4D23069AC400AD2B9B /* WMProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMProgressView.h; sourceTree = "<group>"; };
+		F4051E4E23069AC400AD2B9B /* WMMenuItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMMenuItem.m; sourceTree = "<group>"; };
+		F4051E4F23069AC400AD2B9B /* WMPageController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMPageController.h; sourceTree = "<group>"; };
+		F4051E5023069AC400AD2B9B /* WMScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMScrollView.m; sourceTree = "<group>"; };
+		F4051E5123069AC400AD2B9B /* WMMenuView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMMenuView.m; sourceTree = "<group>"; };
+		F4051E5223069AC400AD2B9B /* WMProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMProgressView.m; sourceTree = "<group>"; };
+		F4051E5923069CFC00AD2B9B /* UIView+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+MT.m"; sourceTree = "<group>"; };
+		F4051E5A23069CFC00AD2B9B /* NSString+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MT.h"; sourceTree = "<group>"; };
+		F4051E5B23069CFC00AD2B9B /* UIColor+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+MT.h"; sourceTree = "<group>"; };
+		F4051E5C23069CFC00AD2B9B /* NSString+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MT.m"; sourceTree = "<group>"; };
+		F4051E5D23069CFC00AD2B9B /* UIView+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+MT.h"; sourceTree = "<group>"; };
+		F4051E5E23069CFC00AD2B9B /* UIColor+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+MT.m"; sourceTree = "<group>"; };
+		F4051E6323069E9700AD2B9B /* MTCacheTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTCacheTool.m; sourceTree = "<group>"; };
+		F4051E6423069E9700AD2B9B /* MTHttpTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTHttpTool.h; sourceTree = "<group>"; };
+		F4051E6523069E9700AD2B9B /* MTCacheTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTCacheTool.h; sourceTree = "<group>"; };
+		F4051E6623069E9700AD2B9B /* MTHttpTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTHttpTool.m; sourceTree = "<group>"; };
+		F414BCA323053D1F00CA26D8 /* PrefixHeader.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrefixHeader.pch; sourceTree = "<group>"; };
+		F414BCA723053EB500CA26D8 /* UtilsMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilsMacro.h; sourceTree = "<group>"; };
+		F414BCA823053EB500CA26D8 /* VendorMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VendorMacro.h; sourceTree = "<group>"; };
+		F414BCA923053EB500CA26D8 /* ApiMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApiMacro.h; sourceTree = "<group>"; };
+		F414BCAA23053EB500CA26D8 /* NotificationMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationMacro.h; sourceTree = "<group>"; };
+		F414BCB8230541F300CA26D8 /* MTDevicesTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTDevicesTool.m; sourceTree = "<group>"; };
+		F414BCB9230541F300CA26D8 /* MTDevicesTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTDevicesTool.h; sourceTree = "<group>"; };
+		F414BCBB230541F300CA26D8 /* MTInternationalTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTInternationalTool.m; sourceTree = "<group>"; };
+		F414BCBC230541F300CA26D8 /* MTInternationalTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTInternationalTool.h; sourceTree = "<group>"; };
+		F414BCBE230541F300CA26D8 /* MTTipsTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTTipsTool.m; sourceTree = "<group>"; };
+		F414BCBF230541F300CA26D8 /* MTTipsTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTTipsTool.h; sourceTree = "<group>"; };
+		F414BCC1230541F300CA26D8 /* MTTopImageButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTTopImageButton.m; sourceTree = "<group>"; };
+		F414BCC2230541F300CA26D8 /* MTRightImageButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRightImageButton.m; sourceTree = "<group>"; };
+		F414BCC3230541F300CA26D8 /* MTTopImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTTopImageButton.h; sourceTree = "<group>"; };
+		F414BCC4230541F300CA26D8 /* MTRightImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRightImageButton.h; sourceTree = "<group>"; };
+		F414BCC6230541F300CA26D8 /* MTGifRefreshHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTGifRefreshHeader.m; sourceTree = "<group>"; };
+		F414BCC7230541F300CA26D8 /* MTGifRefreshHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTGifRefreshHeader.h; sourceTree = "<group>"; };
+		F414BCD023054E2000CA26D8 /* YYClassInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYClassInfo.h; sourceTree = "<group>"; };
+		F414BCD123054E2000CA26D8 /* YYModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YYModel.h; sourceTree = "<group>"; };
+		F414BCD223054E2000CA26D8 /* NSObject+YYModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+YYModel.m"; sourceTree = "<group>"; };
+		F414BCD323054E2000CA26D8 /* YYClassInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YYClassInfo.m; sourceTree = "<group>"; };
+		F414BCD423054E2000CA26D8 /* NSObject+YYModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+YYModel.h"; sourceTree = "<group>"; };
+		F414BCD8230551CD00CA26D8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
+		F414BCD9230551CE00CA26D8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
+		F414BCDD2305521200CA26D8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
+		F414BCDF2305521700CA26D8 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
+		F414BCE12305537E00CA26D8 /* MTBaseTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseTableView.m; sourceTree = "<group>"; };
+		F414BCE22305537E00CA26D8 /* MTBaseTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseTableView.h; sourceTree = "<group>"; };
+		F414BCE42305537E00CA26D8 /* MTBaseCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseCollectionView.h; sourceTree = "<group>"; };
+		F414BCE52305537E00CA26D8 /* MTBaseCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseCollectionView.m; sourceTree = "<group>"; };
+		F414BCE72305537F00CA26D8 /* CustomNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomNavigationController.h; sourceTree = "<group>"; };
+		F414BCE82305537F00CA26D8 /* MTBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseViewController.m; sourceTree = "<group>"; };
+		F414BCE92305537F00CA26D8 /* MTViewControllerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTViewControllerProtocol.h; sourceTree = "<group>"; };
+		F414BCEA2305537F00CA26D8 /* CustomNaviBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomNaviBarView.h; sourceTree = "<group>"; };
+		F414BCEB2305537F00CA26D8 /* CustomNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomNavigationController.m; sourceTree = "<group>"; };
+		F414BCEC2305537F00CA26D8 /* MTBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseViewController.h; sourceTree = "<group>"; };
+		F414BCED2305537F00CA26D8 /* CustomNaviBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomNaviBarView.m; sourceTree = "<group>"; };
+		F414BCEF2305537F00CA26D8 /* MTBaseTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseTableViewCell.m; sourceTree = "<group>"; };
+		F414BCF02305537F00CA26D8 /* MTBaseTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseTableViewCell.h; sourceTree = "<group>"; };
+		F414BCF22305537F00CA26D8 /* MTBaseButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseButton.m; sourceTree = "<group>"; };
+		F414BCF32305537F00CA26D8 /* MTBaseButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseButton.h; sourceTree = "<group>"; };
+		F414BCF52305537F00CA26D8 /* MTRootController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRootController.h; sourceTree = "<group>"; };
+		F414BCF62305537F00CA26D8 /* MTRootController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRootController.m; sourceTree = "<group>"; };
+		F414BCF82305537F00CA26D8 /* MTBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseView.m; sourceTree = "<group>"; };
+		F414BCF92305537F00CA26D8 /* MTBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseView.h; sourceTree = "<group>"; };
+		F414BD002305537F00CA26D8 /* MTBaseImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseImageView.m; sourceTree = "<group>"; };
+		F414BD012305537F00CA26D8 /* MTBaseImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseImageView.h; sourceTree = "<group>"; };
+		F414BD032305537F00CA26D8 /* MTBaseModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseModel.h; sourceTree = "<group>"; };
+		F414BD042305537F00CA26D8 /* MTBaseModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseModel.m; sourceTree = "<group>"; };
+		F414BD062305537F00CA26D8 /* MTBaseCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseCollectionViewCell.m; sourceTree = "<group>"; };
+		F414BD072305537F00CA26D8 /* MTBaseCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseCollectionViewCell.h; sourceTree = "<group>"; };
+		F414BD092305537F00CA26D8 /* MTBaseLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseLabel.m; sourceTree = "<group>"; };
+		F414BD0A2305537F00CA26D8 /* MTBaseLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseLabel.h; sourceTree = "<group>"; };
+		F414BD0C2305537F00CA26D8 /* MTBaseTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseTextField.h; sourceTree = "<group>"; };
+		F414BD0D2305537F00CA26D8 /* MTBaseTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseTextField.m; sourceTree = "<group>"; };
+		F414BD0F2305537F00CA26D8 /* MTBaseViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBaseViewModel.m; sourceTree = "<group>"; };
+		F414BD102305537F00CA26D8 /* MTBaseViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBaseViewModel.h; sourceTree = "<group>"; };
+		F42019672580CD6200BECDE1 /* MTBoardListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBoardListViewController.m; sourceTree = "<group>"; };
+		F42019682580CD6200BECDE1 /* MTBoardListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBoardListViewController.h; sourceTree = "<group>"; };
+		F420196A2580CD6200BECDE1 /* MTBoardListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBoardListModel.m; sourceTree = "<group>"; };
+		F420196B2580CD6200BECDE1 /* MTBoardListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBoardListModel.h; sourceTree = "<group>"; };
+		F420196D2580CD6200BECDE1 /* MTBoardListViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBoardListViewModel.m; sourceTree = "<group>"; };
+		F420196E2580CD6200BECDE1 /* MTBoardListViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBoardListViewModel.h; sourceTree = "<group>"; };
+		F42019762580CD8500BECDE1 /* MTBoardListTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTBoardListTableViewCell.h; sourceTree = "<group>"; };
+		F42019772580CD8500BECDE1 /* MTBoardListTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTBoardListTableViewCell.m; sourceTree = "<group>"; };
+		F42019782580CD8500BECDE1 /* MTBoardListTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTBoardListTableViewCell.xib; sourceTree = "<group>"; };
+		F420197E2580CEFE00BECDE1 /* MTBoardDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBoardDetailViewController.h; sourceTree = "<group>"; };
+		F420197F2580CEFE00BECDE1 /* MTBoardDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBoardDetailViewController.m; sourceTree = "<group>"; };
+		F423D40A230C4509008D0675 /* UIButton+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+MT.m"; sourceTree = "<group>"; };
+		F423D40B230C450A008D0675 /* UILabel+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+MT.m"; sourceTree = "<group>"; };
+		F423D40C230C450A008D0675 /* UIButton+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+MT.h"; sourceTree = "<group>"; };
+		F423D40D230C450A008D0675 /* UITextField+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+MT.h"; sourceTree = "<group>"; };
+		F423D40E230C450A008D0675 /* NSLayoutConstraint+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+MT.h"; sourceTree = "<group>"; };
+		F423D40F230C450A008D0675 /* UITextView+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextView+MT.h"; sourceTree = "<group>"; };
+		F423D410230C450A008D0675 /* UITextField+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+MT.m"; sourceTree = "<group>"; };
+		F423D411230C450A008D0675 /* UITextView+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+MT.m"; sourceTree = "<group>"; };
+		F423D412230C450A008D0675 /* UILabel+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+MT.h"; sourceTree = "<group>"; };
+		F423D413230C450A008D0675 /* NSLayoutConstraint+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+MT.m"; sourceTree = "<group>"; };
+		F44D324F230D1CEA00735FAD /* DVPieCenterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DVPieCenterView.m; sourceTree = "<group>"; };
+		F44D3250230D1CEA00735FAD /* DVFoodPieModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DVFoodPieModel.m; sourceTree = "<group>"; };
+		F44D3251230D1CEA00735FAD /* DVPieChart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVPieChart.h; sourceTree = "<group>"; };
+		F44D3252230D1CEA00735FAD /* DVPieCenterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVPieCenterView.h; sourceTree = "<group>"; };
+		F44D3253230D1CEA00735FAD /* DVFoodPieModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVFoodPieModel.h; sourceTree = "<group>"; };
+		F44D3254230D1CEA00735FAD /* DVPieChart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DVPieChart.m; sourceTree = "<group>"; };
+		F451BFC425CC0654000EEE1C /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; };
+		F451BFC625CC0660000EEE1C /* Pods_Jianbinglian.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_Jianbinglian.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		F478D7DB25ADA20E006B4E61 /* MTLoginViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTLoginViewModel.h; sourceTree = "<group>"; };
+		F478D7DC25ADA20E006B4E61 /* MTLoginViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTLoginViewModel.m; sourceTree = "<group>"; };
+		F478D7DE25ADA20E006B4E61 /* MTLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTLoginViewController.h; sourceTree = "<group>"; };
+		F478D7DF25ADA20E006B4E61 /* MTLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTLoginViewController.m; sourceTree = "<group>"; };
+		F478D7E125ADA20E006B4E61 /* MTLoginModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTLoginModel.h; sourceTree = "<group>"; };
+		F478D7E225ADA20E006B4E61 /* MTLoginModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTLoginModel.m; sourceTree = "<group>"; };
+		F478D7E425ADA20E006B4E61 /* MTLoginHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTLoginHeaderView.h; sourceTree = "<group>"; };
+		F478D7E625ADA20E006B4E61 /* MTLoginHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTLoginHeaderView.m; sourceTree = "<group>"; };
+		F478D80E25ADA403006B4E61 /* MTRegistViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRegistViewModel.h; sourceTree = "<group>"; };
+		F478D80F25ADA403006B4E61 /* MTRegistViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRegistViewModel.m; sourceTree = "<group>"; };
+		F478D81125ADA403006B4E61 /* MTRegistViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRegistViewController.m; sourceTree = "<group>"; };
+		F478D81225ADA403006B4E61 /* MTRegistViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRegistViewController.h; sourceTree = "<group>"; };
+		F478D81425ADA403006B4E61 /* MTRegistModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRegistModel.m; sourceTree = "<group>"; };
+		F478D81525ADA403006B4E61 /* MTRegistModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRegistModel.h; sourceTree = "<group>"; };
+		F478D81725ADA403006B4E61 /* MTRegistHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRegistHeaderView.m; sourceTree = "<group>"; };
+		F478D81A25ADA403006B4E61 /* MTRegistHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRegistHeaderView.h; sourceTree = "<group>"; };
+		F478D82825ADA4C0006B4E61 /* MTForgetViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTForgetViewModel.m; sourceTree = "<group>"; };
+		F478D82925ADA4C0006B4E61 /* MTForgetViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTForgetViewModel.h; sourceTree = "<group>"; };
+		F478D82B25ADA4C0006B4E61 /* MTForgetViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTForgetViewController.h; sourceTree = "<group>"; };
+		F478D82C25ADA4C0006B4E61 /* MTForgetViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTForgetViewController.m; sourceTree = "<group>"; };
+		F478D82E25ADA4C0006B4E61 /* MTForgetModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTForgetModel.m; sourceTree = "<group>"; };
+		F478D82F25ADA4C0006B4E61 /* MTForgetModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTForgetModel.h; sourceTree = "<group>"; };
+		F478D83125ADA4C0006B4E61 /* MTForgetHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTForgetHeaderView.h; sourceTree = "<group>"; };
+		F478D83325ADA4C0006B4E61 /* MTForgetHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTForgetHeaderView.m; sourceTree = "<group>"; };
+		F478D84325ADA830006B4E61 /* MTLoginHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTLoginHeaderView.xib; sourceTree = "<group>"; };
+		F478D84825ADA864006B4E61 /* MTRegistHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTRegistHeaderView.xib; sourceTree = "<group>"; };
+		F478D84D25ADA8B3006B4E61 /* MTForgetHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTForgetHeaderView.xib; sourceTree = "<group>"; };
+		F478D85425AEDF57006B4E61 /* MTBingViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBingViewModel.m; sourceTree = "<group>"; };
+		F478D85525AEDF57006B4E61 /* MTBingViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBingViewModel.h; sourceTree = "<group>"; };
+		F478D85725AEDF57006B4E61 /* MTBingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBingViewController.h; sourceTree = "<group>"; };
+		F478D85825AEDF57006B4E61 /* MTBingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBingViewController.m; sourceTree = "<group>"; };
+		F478D85A25AEDF57006B4E61 /* MTBingHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBingHeaderView.h; sourceTree = "<group>"; };
+		F478D85B25AEDF57006B4E61 /* MTBingHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBingHeaderView.m; sourceTree = "<group>"; };
+		F478D85D25AEDF58006B4E61 /* MTBingModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTBingModel.m; sourceTree = "<group>"; };
+		F478D85E25AEDF58006B4E61 /* MTBingModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTBingModel.h; sourceTree = "<group>"; };
+		F478D86625AEDF97006B4E61 /* MTBingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTBingHeaderView.xib; sourceTree = "<group>"; };
+		F478D86C25B02D00006B4E61 /* MTXieyiViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTXieyiViewController.h; sourceTree = "<group>"; };
+		F478D86D25B02D00006B4E61 /* MTXieyiViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTXieyiViewController.m; sourceTree = "<group>"; };
+		F478D87B25B06030006B4E61 /* UIImage+getSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+getSize.h"; sourceTree = "<group>"; };
+		F478D87C25B06030006B4E61 /* UIImage+getSize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+getSize.m"; sourceTree = "<group>"; };
+		F478D8A025B43D37006B4E61 /* MTUserInforModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTUserInforModel.m; sourceTree = "<group>"; };
+		F478D8A125B43D37006B4E61 /* MTUserInforModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTUserInforModel.h; sourceTree = "<group>"; };
+		F478D8CB25B80747006B4E61 /* MTConfigModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTConfigModel.h; sourceTree = "<group>"; };
+		F478D8CC25B80747006B4E61 /* MTConfigModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTConfigModel.m; sourceTree = "<group>"; };
+		F478D8E425BC01DC006B4E61 /* MTPhotoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTPhotoView.h; sourceTree = "<group>"; };
+		F478D8E525BC01DC006B4E61 /* MTPhotoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTPhotoView.m; sourceTree = "<group>"; };
+		F478D8ED25BC0344006B4E61 /* addImg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = addImg.png; sourceTree = "<group>"; };
+		F478D8EE25BC0345006B4E61 /* addImg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "addImg@2x.png"; sourceTree = "<group>"; };
+		F478D8EF25BC0345006B4E61 /* addImg@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "addImg@3x.png"; sourceTree = "<group>"; };
+		F478D8F625BC0444006B4E61 /* MTPhotoConfigModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTPhotoConfigModel.h; sourceTree = "<group>"; };
+		F478D8F725BC0444006B4E61 /* MTPhotoConfigModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTPhotoConfigModel.m; sourceTree = "<group>"; };
+		F478D8FC25BC15CB006B4E61 /* imgDel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = imgDel.png; sourceTree = "<group>"; };
+		F479B0C42319639A00C58D9D /* MTUpLoadViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTUpLoadViewModel.h; sourceTree = "<group>"; };
+		F479B0C52319639A00C58D9D /* MTUpLoadViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTUpLoadViewModel.m; sourceTree = "<group>"; };
+		F491D4332351BCD200D34A4A /* MTCopyLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTCopyLabel.h; sourceTree = "<group>"; };
+		F491D4342351BCD200D34A4A /* MTCopyLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTCopyLabel.m; sourceTree = "<group>"; };
+		F497E532230FB73F00939809 /* MTWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTWebViewController.m; sourceTree = "<group>"; };
+		F497E533230FB73F00939809 /* MTWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTWebViewController.h; sourceTree = "<group>"; };
+		F4E51C33258A004200135614 /* MTTimePickView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTTimePickView.h; sourceTree = "<group>"; };
+		F4E51C34258A004200135614 /* MTTimePickView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTTimePickView.m; sourceTree = "<group>"; };
+		F4E51C39258A005E00135614 /* MTTimePickView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTTimePickView.xib; sourceTree = "<group>"; };
+		F4E99CB025903B1E002850DD /* MTStartView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTStartView.m; sourceTree = "<group>"; };
+		F4E99CB125903B1E002850DD /* MTStartView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MTStartView.xib; sourceTree = "<group>"; };
+		F4E99CB225903B1F002850DD /* MTStartView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTStartView.h; sourceTree = "<group>"; };
+		F4E99DF42595C611002850DD /* MTMyTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTMyTableViewCell.h; sourceTree = "<group>"; };
+		F4E99DF52595C611002850DD /* MTMyTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTMyTableViewCell.m; sourceTree = "<group>"; };
+		F4E99DF62595C611002850DD /* MTMyTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTMyTableViewCell.xib; sourceTree = "<group>"; };
+		F4E99DFC2595C9BD002850DD /* MTMyHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTMyHeaderView.xib; sourceTree = "<group>"; };
+		F4E99EC4259AF338002850DD /* GJ_Me_WalletViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_WalletViewController.m; sourceTree = "<group>"; };
+		F4E99EC6259AF338002850DD /* GJ_Me_Wallet_Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_Wallet_Cell.h; sourceTree = "<group>"; };
+		F4E99EC7259AF338002850DD /* GJ_Me_Wallet_HeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GJ_Me_Wallet_HeaderView.xib; sourceTree = "<group>"; };
+		F4E99EC8259AF338002850DD /* GJ_Me_Wallet_HeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_Wallet_HeaderView.h; sourceTree = "<group>"; };
+		F4E99EC9259AF338002850DD /* GJ_Me_Wallet_Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_Wallet_Cell.m; sourceTree = "<group>"; };
+		F4E99ECA259AF338002850DD /* GJ_Me_Wallet_HeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_Wallet_HeaderView.m; sourceTree = "<group>"; };
+		F4E99ECB259AF338002850DD /* GJ_Me_Wallet_Cell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GJ_Me_Wallet_Cell.xib; sourceTree = "<group>"; };
+		F4E99ECD259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_CashOut_ZFBViewController.m; sourceTree = "<group>"; };
+		F4E99ECE259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GJ_Me_CashOut_ZFBViewController.xib; sourceTree = "<group>"; };
+		F4E99ECF259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_CashOut_ZFBViewController.h; sourceTree = "<group>"; };
+		F4E99ED0259AF338002850DD /* GJ_Me_WalletViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_WalletViewController.h; sourceTree = "<group>"; };
+		F4E99ED2259AF338002850DD /* GJ_Me_CashOut_WXViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GJ_Me_CashOut_WXViewController.xib; sourceTree = "<group>"; };
+		F4E99ED3259AF338002850DD /* GJ_Me_CashOut_WXViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_CashOut_WXViewController.h; sourceTree = "<group>"; };
+		F4E99ED4259AF338002850DD /* GJ_Me_CashOut_WXViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_CashOut_WXViewController.m; sourceTree = "<group>"; };
+		F4E99ED6259AF338002850DD /* GJ_Me_CashOut_BankViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GJ_Me_CashOut_BankViewController.h; sourceTree = "<group>"; };
+		F4E99ED7259AF338002850DD /* GJ_Me_CashOut_BankViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GJ_Me_CashOut_BankViewController.m; sourceTree = "<group>"; };
+		F4E99ED8259AF338002850DD /* GJ_Me_CashOut_BankViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GJ_Me_CashOut_BankViewController.xib; sourceTree = "<group>"; };
+		F4E99F6D259B2C92002850DD /* MTPayInViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTPayInViewController.h; sourceTree = "<group>"; };
+		F4E99F6E259B2C92002850DD /* MTPayInViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTPayInViewController.m; sourceTree = "<group>"; };
+		F4E99F70259B2C92002850DD /* MTPayInModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTPayInModel.m; sourceTree = "<group>"; };
+		F4E99F71259B2C92002850DD /* MTPayInModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTPayInModel.h; sourceTree = "<group>"; };
+		F4E99F73259B2C92002850DD /* MTPayInTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTPayInTableViewCell.h; sourceTree = "<group>"; };
+		F4E99F74259B2C92002850DD /* MTPayInHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTPayInHeaderView.m; sourceTree = "<group>"; };
+		F4E99F75259B2C92002850DD /* MTPayInHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTPayInHeaderView.h; sourceTree = "<group>"; };
+		F4E99F76259B2C92002850DD /* MTPayInTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTPayInTableViewCell.m; sourceTree = "<group>"; };
+		F4E99F78259B2C92002850DD /* MTPayInViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTPayInViewModel.m; sourceTree = "<group>"; };
+		F4E99F79259B2C92002850DD /* MTPayInViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTPayInViewModel.h; sourceTree = "<group>"; };
+		F4E99F82259B2E10002850DD /* MTPayInHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTPayInHeaderView.xib; sourceTree = "<group>"; };
+		F4E99F8C259D7EBF002850DD /* MTSettingViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTSettingViewModel.h; sourceTree = "<group>"; };
+		F4E99F8D259D7EBF002850DD /* MTSettingViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTSettingViewModel.m; sourceTree = "<group>"; };
+		F4E99F8F259D7EBF002850DD /* MTSettingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTSettingViewController.h; sourceTree = "<group>"; };
+		F4E99F90259D7EBF002850DD /* MTSettingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTSettingViewController.m; sourceTree = "<group>"; };
+		F4E99F92259D7EBF002850DD /* MTSettingModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTSettingModel.h; sourceTree = "<group>"; };
+		F4E99F93259D7EBF002850DD /* MTSettingModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTSettingModel.m; sourceTree = "<group>"; };
+		F4E99F95259D7EC0002850DD /* MTSettingHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTSettingHeaderView.h; sourceTree = "<group>"; };
+		F4E99F96259D7EC0002850DD /* MTSettingHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTSettingHeaderView.m; sourceTree = "<group>"; };
+		F4E99F9E259D7EFD002850DD /* MTSettingHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTSettingHeaderView.xib; sourceTree = "<group>"; };
+		F4E99FA5259DA696002850DD /* FFMineRetrievePayPwdController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FFMineRetrievePayPwdController.m; sourceTree = "<group>"; };
+		F4E99FA6259DA697002850DD /* FFMineRetrievePayPwdController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFMineRetrievePayPwdController.h; sourceTree = "<group>"; };
+		F4E99FAB259DA697002850DD /* FFMinePayPasswordController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFMinePayPasswordController.h; sourceTree = "<group>"; };
+		F4E99FAC259DA697002850DD /* FFMinePayPasswordController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FFMinePayPasswordController.m; sourceTree = "<group>"; };
+		F4E99FBB259DB1B1002850DD /* MTInfoModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTInfoModel.m; sourceTree = "<group>"; };
+		F4E99FBC259DB1B1002850DD /* MTInfoModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTInfoModel.h; sourceTree = "<group>"; };
+		F4E99FBE259DB1B1002850DD /* MTInfoHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTInfoHeaderView.h; sourceTree = "<group>"; };
+		F4E99FBF259DB1B1002850DD /* MTInfoHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTInfoHeaderView.m; sourceTree = "<group>"; };
+		F4E99FC1259DB1B1002850DD /* MTInfoViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTInfoViewModel.m; sourceTree = "<group>"; };
+		F4E99FC2259DB1B1002850DD /* MTInfoViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTInfoViewModel.h; sourceTree = "<group>"; };
+		F4E99FC4259DB1B1002850DD /* MTInfoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTInfoViewController.m; sourceTree = "<group>"; };
+		F4E99FC5259DB1B1002850DD /* MTInfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTInfoViewController.h; sourceTree = "<group>"; };
+		F4E99FCD259DB1C6002850DD /* MTInfoHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTInfoHeaderView.xib; sourceTree = "<group>"; };
+		F4ED175524C03A17003D7B3F /* DYFCodeScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYFCodeScanner.h; sourceTree = "<group>"; };
+		F4ED175624C03A17003D7B3F /* DYFCodeScannerMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYFCodeScannerMacros.h; sourceTree = "<group>"; };
+		F4ED175724C03A17003D7B3F /* DYFCodeScannerPreView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYFCodeScannerPreView.h; sourceTree = "<group>"; };
+		F4ED175824C03A17003D7B3F /* DYFCodeScannerPreView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYFCodeScannerPreView.m; sourceTree = "<group>"; };
+		F4ED175924C03A17003D7B3F /* DYFCodeScannerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYFCodeScannerViewController.h; sourceTree = "<group>"; };
+		F4ED175A24C03A17003D7B3F /* DYFCodeScannerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYFCodeScannerViewController.m; sourceTree = "<group>"; };
+		F4ED175B24C03A17003D7B3F /* DYFQRCodeImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DYFQRCodeImageView.h; sourceTree = "<group>"; };
+		F4ED175C24C03A17003D7B3F /* DYFQRCodeImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DYFQRCodeImageView.m; sourceTree = "<group>"; };
+		F4ED175D24C03A17003D7B3F /* UIButton+Corner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+Corner.h"; sourceTree = "<group>"; };
+		F4ED175E24C03A17003D7B3F /* UIButton+Corner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+Corner.m"; sourceTree = "<group>"; };
+		F4ED175F24C03A17003D7B3F /* UIImage+QRCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+QRCode.h"; sourceTree = "<group>"; };
+		F4ED176024C03A17003D7B3F /* UIImage+QRCode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+QRCode.m"; sourceTree = "<group>"; };
+		F4ED176624C03ACB003D7B3F /* UIImage+MT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+MT.h"; sourceTree = "<group>"; };
+		F4ED176724C03ACB003D7B3F /* UIImage+MT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+MT.m"; sourceTree = "<group>"; };
+		F4ED176A24C03BD9003D7B3F /* WXApiManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApiManager.h; sourceTree = "<group>"; };
+		F4ED176B24C03BD9003D7B3F /* WXApiManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXApiManager.m; sourceTree = "<group>"; };
+		F4ED176D24C03BD9003D7B3F /* MTImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTImageManager.h; sourceTree = "<group>"; };
+		F4ED176E24C03BD9003D7B3F /* MTImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTImageManager.m; sourceTree = "<group>"; };
+		F4ED177324C03BD9003D7B3F /* MTAssetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTAssetManager.h; sourceTree = "<group>"; };
+		F4ED177424C03BD9003D7B3F /* MTAssetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTAssetManager.m; sourceTree = "<group>"; };
+		F4ED177624C03BD9003D7B3F /* MTApplePayTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTApplePayTool.h; sourceTree = "<group>"; };
+		F4ED177724C03BD9003D7B3F /* MTApplePayTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTApplePayTool.m; sourceTree = "<group>"; };
+		F4ED177924C03BD9003D7B3F /* MTVideoDownTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTVideoDownTool.h; sourceTree = "<group>"; };
+		F4ED177A24C03BD9003D7B3F /* MTVideoDownTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTVideoDownTool.m; sourceTree = "<group>"; };
+		F4ED178324C042D5003D7B3F /* EBBannerView+Categories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "EBBannerView+Categories.h"; sourceTree = "<group>"; };
+		F4ED178424C042D5003D7B3F /* EBBannerView+Categories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "EBBannerView+Categories.m"; sourceTree = "<group>"; };
+		F4ED178524C042D5003D7B3F /* EBBannerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBBannerView.m; sourceTree = "<group>"; };
+		F4ED178624C042D5003D7B3F /* EBBannerView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EBBannerView.xib; sourceTree = "<group>"; };
+		F4ED178724C042D5003D7B3F /* EBBannerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBBannerViewController.m; sourceTree = "<group>"; };
+		F4ED178824C042D5003D7B3F /* EBBannerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EBBannerViewController.xib; sourceTree = "<group>"; };
+		F4ED178924C042D5003D7B3F /* EBBannerViewMaker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBBannerViewMaker.m; sourceTree = "<group>"; };
+		F4ED178A24C042D5003D7B3F /* EBBannerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBBannerWindow.h; sourceTree = "<group>"; };
+		F4ED178B24C042D5003D7B3F /* EBBannerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBBannerWindow.m; sourceTree = "<group>"; };
+		F4ED178C24C042D5003D7B3F /* EBCustomBannerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBCustomBannerView.m; sourceTree = "<group>"; };
+		F4ED178D24C042D5003D7B3F /* EBEmptyWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBEmptyWindow.h; sourceTree = "<group>"; };
+		F4ED178E24C042D5003D7B3F /* EBEmptyWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBEmptyWindow.m; sourceTree = "<group>"; };
+		F4ED178F24C042D5003D7B3F /* EBMuteDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBMuteDetector.h; sourceTree = "<group>"; };
+		F4ED179024C042D5003D7B3F /* EBMuteDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EBMuteDetector.m; sourceTree = "<group>"; };
+		F4ED179124C042D5003D7B3F /* EBMuteDetector.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = EBMuteDetector.mp3; sourceTree = "<group>"; };
+		F4ED179224C042D5003D7B3F /* EBSystemBannerView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EBSystemBannerView.xib; sourceTree = "<group>"; };
+		F4ED179324C042D5003D7B3F /* EBBannerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBBannerView.h; sourceTree = "<group>"; };
+		F4ED179424C042D5003D7B3F /* EBBannerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBBannerViewController.h; sourceTree = "<group>"; };
+		F4ED179524C042D5003D7B3F /* EBCustomBannerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EBCustomBannerView.h; sourceTree = "<group>"; };
+		F4F5BC72258B4FBC00372E4D /* NSDate+Category.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Category.h"; sourceTree = "<group>"; };
+		F4F5BC73258B4FBC00372E4D /* CustomDatePickerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomDatePickerViewModel.m; sourceTree = "<group>"; };
+		F4F5BC74258B4FBC00372E4D /* NSDate+Category.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Category.m"; sourceTree = "<group>"; };
+		F4F5BC75258B4FBC00372E4D /* CustomDatePickerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomDatePickerViewModel.h; sourceTree = "<group>"; };
+		F4F5BCD7258C810600372E4D /* MTAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTAlertView.m; sourceTree = "<group>"; };
+		F4F5BCD8258C810600372E4D /* MTAlertView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MTAlertView.xib; sourceTree = "<group>"; };
+		F4F5BCD9258C810600372E4D /* MTAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTAlertView.h; sourceTree = "<group>"; };
+		F4F5BD04258C91F700372E4D /* MTNoDataView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTNoDataView.h; sourceTree = "<group>"; };
+		F4F5BD05258C91F700372E4D /* MTNoDataView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTNoDataView.m; sourceTree = "<group>"; };
+		F4F5BD0D258C921800372E4D /* MTNoDataView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MTNoDataView.xib; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		45C4DF2722FD42300072EE2F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				F451BFC725CC0660000EEE1C /* Pods_Jianbinglian.framework in Frameworks */,
+				F451BFC525CC0655000EEE1C /* ExternalAccessory.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF3F22FD42320072EE2F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				5C6F095755A4F298376DFFC4 /* Pods_JianbinglianTests.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF4A22FD42320072EE2F /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				8E6494CEAAD81ED909A7FCE3 /* Pods_JianbinglianUITests.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		45C4DF2122FD422F0072EE2F = {
+			isa = PBXGroup;
+			children = (
+				45C4DF2C22FD42300072EE2F /* Jianbinglian */,
+				45C4DF4522FD42320072EE2F /* JianbinglianTests */,
+				45C4DF5022FD42320072EE2F /* JianbinglianUITests */,
+				45C4DF2B22FD42300072EE2F /* Products */,
+				5D1B287FB8D59AEE281D7037 /* Pods */,
+				EB527EC4116F16B1FC472C2A /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		45C4DF2B22FD42300072EE2F /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				45C4DF2A22FD42300072EE2F /* Jianbinglian.app */,
+				45C4DF4222FD42320072EE2F /* JianbinglianTests.xctest */,
+				45C4DF4D22FD42320072EE2F /* JianbinglianUITests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		45C4DF2C22FD42300072EE2F /* Jianbinglian */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCA623053EB500CA26D8 /* Macros(宏) */,
+				F414BCCE23054E0700CA26D8 /* Lib(第三方库) */,
+				F414BCD72305507500CA26D8 /* Base(基类) */,
+				F4051E5823069CFC00AD2B9B /* Category(分类扩展) */,
+				F414BCB6230541F300CA26D8 /* Tools(工具类) */,
+				F414BD2523055D7400CA26D8 /* Main(主类) */,
+				F4051E43230693E100AD2B9B /* Other */,
+			);
+			path = Jianbinglian;
+			sourceTree = "<group>";
+		};
+		45C4DF4522FD42320072EE2F /* JianbinglianTests */ = {
+			isa = PBXGroup;
+			children = (
+				45C4DF4622FD42320072EE2F /* JianbinglianTests.m */,
+				45C4DF4822FD42320072EE2F /* Info.plist */,
+			);
+			path = JianbinglianTests;
+			sourceTree = "<group>";
+		};
+		45C4DF5022FD42320072EE2F /* JianbinglianUITests */ = {
+			isa = PBXGroup;
+			children = (
+				45C4DF5122FD42320072EE2F /* JianbinglianUITests.m */,
+				45C4DF5322FD42320072EE2F /* Info.plist */,
+			);
+			path = JianbinglianUITests;
+			sourceTree = "<group>";
+		};
+		5D1B287FB8D59AEE281D7037 /* Pods */ = {
+			isa = PBXGroup;
+			children = (
+				8C2D09D5B94C209D63BA7C67 /* Pods-Jianbinglian.debug.xcconfig */,
+				673D0FABDEC01E041559FB9A /* Pods-Jianbinglian.release.xcconfig */,
+				7AC95B38A7A6EEA0F29C5F38 /* Pods-JianbinglianTests.debug.xcconfig */,
+				C613242FEA4827FCB0291F7A /* Pods-JianbinglianTests.release.xcconfig */,
+				42B2BA49C2CD891CFA3AFA61 /* Pods-JianbinglianUITests.debug.xcconfig */,
+				03C6E27E12294EBE8B7F48DC /* Pods-JianbinglianUITests.release.xcconfig */,
+			);
+			path = Pods;
+			sourceTree = "<group>";
+		};
+		EB527EC4116F16B1FC472C2A /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				F451BFC625CC0660000EEE1C /* Pods_Jianbinglian.framework */,
+				F451BFC425CC0654000EEE1C /* ExternalAccessory.framework */,
+				48CAD46FAFF35F3578C3016B /* Pods_JianbinglianTests.framework */,
+				08253954140C8723BFFEFA2C /* Pods_JianbinglianUITests.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		F4029E102307931100D85DD0 /* BaseNavigationController */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCEA2305537F00CA26D8 /* CustomNaviBarView.h */,
+				F414BCED2305537F00CA26D8 /* CustomNaviBarView.m */,
+				F414BCE72305537F00CA26D8 /* CustomNavigationController.h */,
+				F414BCEB2305537F00CA26D8 /* CustomNavigationController.m */,
+			);
+			path = BaseNavigationController;
+			sourceTree = "<group>";
+		};
+		F4029E3723079AB800D85DD0 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E3823079AB800D85DD0 /* MTMyViewController.h */,
+				F4029E3923079AB800D85DD0 /* MTMyViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F4029E3A23079AB800D85DD0 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E3C23079AB800D85DD0 /* MTMyViewModel.h */,
+				F4029E3B23079AB800D85DD0 /* MTMyViewModel.m */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F4029E3D23079AB800D85DD0 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E3F23079AB800D85DD0 /* MTMyModel.h */,
+				F4029E3E23079AB800D85DD0 /* MTMyModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F4029E4023079AB800D85DD0 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E4123079AB800D85DD0 /* MTMyHeaderView.h */,
+				F4029E4323079AB800D85DD0 /* MTMyHeaderView.m */,
+				F4E99DFC2595C9BD002850DD /* MTMyHeaderView.xib */,
+				F4E99DF42595C611002850DD /* MTMyTableViewCell.h */,
+				F4E99DF52595C611002850DD /* MTMyTableViewCell.m */,
+				F4E99DF62595C611002850DD /* MTMyTableViewCell.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F4029E4A23079D1500D85DD0 /* My */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E3723079AB800D85DD0 /* Controller */,
+				F4029E3D23079AB800D85DD0 /* Model */,
+				F4029E4023079AB800D85DD0 /* View */,
+				F4029E3A23079AB800D85DD0 /* ViewModel */,
+			);
+			path = My;
+			sourceTree = "<group>";
+		};
+		F4051E17230686F000AD2B9B /* MD5Tool */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E1A2306874200AD2B9B /* MTMD5Tool.h */,
+				F4051E1B2306874200AD2B9B /* MTMD5Tool.m */,
+			);
+			path = MD5Tool;
+			sourceTree = "<group>";
+		};
+		F4051E18230686FC00AD2B9B /* StringTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E1D2306878C00AD2B9B /* MTStringTool.h */,
+				F4051E1E2306878C00AD2B9B /* MTStringTool.m */,
+			);
+			path = StringTool;
+			sourceTree = "<group>";
+		};
+		F4051E192306870500AD2B9B /* TimeTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E20230687DE00AD2B9B /* MTTimeTool.h */,
+				F4051E21230687DE00AD2B9B /* MTTimeTool.m */,
+			);
+			path = TimeTool;
+			sourceTree = "<group>";
+		};
+		F4051E2F2306937200AD2B9B /* JYRouter */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E312306937200AD2B9B /* JYRouter.h */,
+				F4051E392306937200AD2B9B /* JYRouter.m */,
+				F4051E382306937200AD2B9B /* Routable.h */,
+				F4051E302306937200AD2B9B /* Routable.m */,
+			);
+			path = JYRouter;
+			sourceTree = "<group>";
+		};
+		F4051E43230693E100AD2B9B /* Other */ = {
+			isa = PBXGroup;
+			children = (
+				45C4DF2D22FD42300072EE2F /* AppDelegate.h */,
+				45C4DF2E22FD42300072EE2F /* AppDelegate.m */,
+				45C4DF3322FD42300072EE2F /* Main.storyboard */,
+				45C4DF3622FD42310072EE2F /* Assets.xcassets */,
+				45C4DF3822FD42310072EE2F /* LaunchScreen.storyboard */,
+				45C4DF3B22FD42310072EE2F /* Info.plist */,
+				45C4DF3C22FD42310072EE2F /* main.m */,
+				F414BCA323053D1F00CA26D8 /* PrefixHeader.pch */,
+				F414BCDE2305521200CA26D8 /* Localizable.strings */,
+			);
+			path = Other;
+			sourceTree = "<group>";
+		};
+		F4051E442306951C00AD2B9B /* FDFullscreenPopGesture */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E452306951C00AD2B9B /* UINavigationController+FDFullscreenPopGesture.h */,
+				F4051E462306951C00AD2B9B /* UINavigationController+FDFullscreenPopGesture.m */,
+			);
+			path = FDFullscreenPopGesture;
+			sourceTree = "<group>";
+		};
+		F4051E4823069AC400AD2B9B /* WMPageController */ = {
+			isa = PBXGroup;
+			children = (
+				F4051E4B23069AC400AD2B9B /* WMMenuItem.h */,
+				F4051E4E23069AC400AD2B9B /* WMMenuItem.m */,
+				F4051E4C23069AC400AD2B9B /* WMMenuView.h */,
+				F4051E5123069AC400AD2B9B /* WMMenuView.m */,
+				F4051E4F23069AC400AD2B9B /* WMPageController.h */,
+				F4051E4A23069AC400AD2B9B /* WMPageController.m */,
+				F4051E4D23069AC400AD2B9B /* WMProgressView.h */,
+				F4051E5223069AC400AD2B9B /* WMProgressView.m */,
+				F4051E4923069AC400AD2B9B /* WMScrollView.h */,
+				F4051E5023069AC400AD2B9B /* WMScrollView.m */,
+			);
+			path = WMPageController;
+			sourceTree = "<group>";
+		};
+		F4051E5823069CFC00AD2B9B /* Category(分类扩展) */ = {
+			isa = PBXGroup;
+			children = (
+				F478D87B25B06030006B4E61 /* UIImage+getSize.h */,
+				F478D87C25B06030006B4E61 /* UIImage+getSize.m */,
+				F4051E5A23069CFC00AD2B9B /* NSString+MT.h */,
+				F4051E5C23069CFC00AD2B9B /* NSString+MT.m */,
+				F4051E5B23069CFC00AD2B9B /* UIColor+MT.h */,
+				F4051E5E23069CFC00AD2B9B /* UIColor+MT.m */,
+				F4051E5D23069CFC00AD2B9B /* UIView+MT.h */,
+				F4051E5923069CFC00AD2B9B /* UIView+MT.m */,
+				F4029E4E2307ECA600D85DD0 /* UIImageView+MT.h */,
+				F4029E4F2307ECA600D85DD0 /* UIImageView+MT.m */,
+				F423D40E230C450A008D0675 /* NSLayoutConstraint+MT.h */,
+				F423D413230C450A008D0675 /* NSLayoutConstraint+MT.m */,
+				F423D40C230C450A008D0675 /* UIButton+MT.h */,
+				F423D40A230C4509008D0675 /* UIButton+MT.m */,
+				F423D412230C450A008D0675 /* UILabel+MT.h */,
+				F423D40B230C450A008D0675 /* UILabel+MT.m */,
+				F423D40D230C450A008D0675 /* UITextField+MT.h */,
+				F423D410230C450A008D0675 /* UITextField+MT.m */,
+				F423D40F230C450A008D0675 /* UITextView+MT.h */,
+				F423D411230C450A008D0675 /* UITextView+MT.m */,
+				F4ED176624C03ACB003D7B3F /* UIImage+MT.h */,
+				F4ED176724C03ACB003D7B3F /* UIImage+MT.m */,
+			);
+			path = "Category(分类扩展)";
+			sourceTree = "<group>";
+		};
+		F4051E6223069E9700AD2B9B /* NetworkTool */ = {
+			isa = PBXGroup;
+			children = (
+				F479B0C42319639A00C58D9D /* MTUpLoadViewModel.h */,
+				F479B0C52319639A00C58D9D /* MTUpLoadViewModel.m */,
+				F4051E6523069E9700AD2B9B /* MTCacheTool.h */,
+				F4051E6323069E9700AD2B9B /* MTCacheTool.m */,
+				F4051E6423069E9700AD2B9B /* MTHttpTool.h */,
+				F4051E6623069E9700AD2B9B /* MTHttpTool.m */,
+			);
+			path = NetworkTool;
+			sourceTree = "<group>";
+		};
+		F414BCA623053EB500CA26D8 /* Macros(宏) */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCA723053EB500CA26D8 /* UtilsMacro.h */,
+				F414BCA823053EB500CA26D8 /* VendorMacro.h */,
+				F414BCA923053EB500CA26D8 /* ApiMacro.h */,
+				F414BCAA23053EB500CA26D8 /* NotificationMacro.h */,
+			);
+			path = "Macros(宏)";
+			sourceTree = "<group>";
+		};
+		F414BCB6230541F300CA26D8 /* Tools(工具类) */ = {
+			isa = PBXGroup;
+			children = (
+				F478D8E325BC01BE006B4E61 /* PhotoView */,
+				F4E99CAF25903AE6002850DD /* StarView */,
+				F4F5BD03258C91E100372E4D /* NoDataView */,
+				F4F5BCD6258C810600372E4D /* AlertView */,
+				F4F5BC71258B4F9100372E4D /* SelectDayHourTool */,
+				F4ED177524C03BD9003D7B3F /* ApplePayTool */,
+				F4ED176C24C03BD9003D7B3F /* ImageTool */,
+				F4ED177824C03BD9003D7B3F /* VideoDownTool */,
+				F4ED177224C03BD9003D7B3F /* VideoTool */,
+				F4ED176924C03BD9003D7B3F /* WXApiTool */,
+				F497E531230FB6FA00939809 /* WebviewTool */,
+				F4051E192306870500AD2B9B /* TimeTool */,
+				F4051E6223069E9700AD2B9B /* NetworkTool */,
+				F4051E18230686FC00AD2B9B /* StringTool */,
+				F4051E17230686F000AD2B9B /* MD5Tool */,
+				F414BCB7230541F300CA26D8 /* DeviceTool */,
+				F414BCBA230541F300CA26D8 /* LocationTool */,
+				F414BCC5230541F300CA26D8 /* RefushTool */,
+				F414BCBD230541F300CA26D8 /* TipTool */,
+				F414BCC0230541F300CA26D8 /* UITool */,
+			);
+			path = "Tools(工具类)";
+			sourceTree = "<group>";
+		};
+		F414BCB7230541F300CA26D8 /* DeviceTool */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCB9230541F300CA26D8 /* MTDevicesTool.h */,
+				F414BCB8230541F300CA26D8 /* MTDevicesTool.m */,
+			);
+			path = DeviceTool;
+			sourceTree = "<group>";
+		};
+		F414BCBA230541F300CA26D8 /* LocationTool */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCBC230541F300CA26D8 /* MTInternationalTool.h */,
+				F414BCBB230541F300CA26D8 /* MTInternationalTool.m */,
+			);
+			path = LocationTool;
+			sourceTree = "<group>";
+		};
+		F414BCBD230541F300CA26D8 /* TipTool */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCBF230541F300CA26D8 /* MTTipsTool.h */,
+				F414BCBE230541F300CA26D8 /* MTTipsTool.m */,
+			);
+			path = TipTool;
+			sourceTree = "<group>";
+		};
+		F414BCC0230541F300CA26D8 /* UITool */ = {
+			isa = PBXGroup;
+			children = (
+				F491D4332351BCD200D34A4A /* MTCopyLabel.h */,
+				F491D4342351BCD200D34A4A /* MTCopyLabel.m */,
+				F414BCC4230541F300CA26D8 /* MTRightImageButton.h */,
+				F414BCC2230541F300CA26D8 /* MTRightImageButton.m */,
+				F414BCC3230541F300CA26D8 /* MTTopImageButton.h */,
+				F414BCC1230541F300CA26D8 /* MTTopImageButton.m */,
+			);
+			path = UITool;
+			sourceTree = "<group>";
+		};
+		F414BCC5230541F300CA26D8 /* RefushTool */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCC7230541F300CA26D8 /* MTGifRefreshHeader.h */,
+				F414BCC6230541F300CA26D8 /* MTGifRefreshHeader.m */,
+			);
+			path = RefushTool;
+			sourceTree = "<group>";
+		};
+		F414BCCE23054E0700CA26D8 /* Lib(第三方库) */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED178124C042D5003D7B3F /* EBBannerView(前台通知栏) */,
+				F4ED175424C03A17003D7B3F /* DYCodeScanner(二维码) */,
+				F44D324E230D1CEA00735FAD /* DVDishPieHeader(饼状图) */,
+				F4051E4823069AC400AD2B9B /* WMPageController */,
+				F4051E442306951C00AD2B9B /* FDFullscreenPopGesture */,
+				F4051E2F2306937200AD2B9B /* JYRouter */,
+				F414BCCF23054E2000CA26D8 /* YYModel */,
+			);
+			path = "Lib(第三方库)";
+			sourceTree = "<group>";
+		};
+		F414BCCF23054E2000CA26D8 /* YYModel */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCD423054E2000CA26D8 /* NSObject+YYModel.h */,
+				F414BCD223054E2000CA26D8 /* NSObject+YYModel.m */,
+				F414BCD023054E2000CA26D8 /* YYClassInfo.h */,
+				F414BCD323054E2000CA26D8 /* YYClassInfo.m */,
+				F414BCD123054E2000CA26D8 /* YYModel.h */,
+			);
+			path = YYModel;
+			sourceTree = "<group>";
+		};
+		F414BCD72305507500CA26D8 /* Base(基类) */ = {
+			isa = PBXGroup;
+			children = (
+				F4029E102307931100D85DD0 /* BaseNavigationController */,
+				F414BCF42305537F00CA26D8 /* BaseRootController */,
+				F414BCE62305537F00CA26D8 /* BaseController */,
+				F414BCF72305537F00CA26D8 /* BaseView */,
+				F414BD0E2305537F00CA26D8 /* BaseViewModel */,
+				F414BD022305537F00CA26D8 /* BaseModel */,
+				F414BCF12305537F00CA26D8 /* BaseButton */,
+				F414BCE32305537E00CA26D8 /* BaseCollectionView */,
+				F414BD052305537F00CA26D8 /* BaseCollectionViewCell */,
+				F414BD0B2305537F00CA26D8 /* BaseTextField */,
+				F414BCEE2305537F00CA26D8 /* BaseTableViewCell */,
+				F414BCE02305537E00CA26D8 /* BaseTableView */,
+				F414BD082305537F00CA26D8 /* BaseLabel */,
+				F414BCFF2305537F00CA26D8 /* BaseImageView */,
+			);
+			path = "Base(基类)";
+			sourceTree = "<group>";
+		};
+		F414BCE02305537E00CA26D8 /* BaseTableView */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCE22305537E00CA26D8 /* MTBaseTableView.h */,
+				F414BCE12305537E00CA26D8 /* MTBaseTableView.m */,
+			);
+			path = BaseTableView;
+			sourceTree = "<group>";
+		};
+		F414BCE32305537E00CA26D8 /* BaseCollectionView */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCE42305537E00CA26D8 /* MTBaseCollectionView.h */,
+				F414BCE52305537E00CA26D8 /* MTBaseCollectionView.m */,
+			);
+			path = BaseCollectionView;
+			sourceTree = "<group>";
+		};
+		F414BCE62305537F00CA26D8 /* BaseController */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCEC2305537F00CA26D8 /* MTBaseViewController.h */,
+				F414BCE82305537F00CA26D8 /* MTBaseViewController.m */,
+				F414BCE92305537F00CA26D8 /* MTViewControllerProtocol.h */,
+			);
+			path = BaseController;
+			sourceTree = "<group>";
+		};
+		F414BCEE2305537F00CA26D8 /* BaseTableViewCell */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCF02305537F00CA26D8 /* MTBaseTableViewCell.h */,
+				F414BCEF2305537F00CA26D8 /* MTBaseTableViewCell.m */,
+			);
+			path = BaseTableViewCell;
+			sourceTree = "<group>";
+		};
+		F414BCF12305537F00CA26D8 /* BaseButton */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCF32305537F00CA26D8 /* MTBaseButton.h */,
+				F414BCF22305537F00CA26D8 /* MTBaseButton.m */,
+			);
+			path = BaseButton;
+			sourceTree = "<group>";
+		};
+		F414BCF42305537F00CA26D8 /* BaseRootController */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCF52305537F00CA26D8 /* MTRootController.h */,
+				F414BCF62305537F00CA26D8 /* MTRootController.m */,
+			);
+			path = BaseRootController;
+			sourceTree = "<group>";
+		};
+		F414BCF72305537F00CA26D8 /* BaseView */ = {
+			isa = PBXGroup;
+			children = (
+				F414BCF92305537F00CA26D8 /* MTBaseView.h */,
+				F414BCF82305537F00CA26D8 /* MTBaseView.m */,
+			);
+			path = BaseView;
+			sourceTree = "<group>";
+		};
+		F414BCFF2305537F00CA26D8 /* BaseImageView */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD012305537F00CA26D8 /* MTBaseImageView.h */,
+				F414BD002305537F00CA26D8 /* MTBaseImageView.m */,
+			);
+			path = BaseImageView;
+			sourceTree = "<group>";
+		};
+		F414BD022305537F00CA26D8 /* BaseModel */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD032305537F00CA26D8 /* MTBaseModel.h */,
+				F414BD042305537F00CA26D8 /* MTBaseModel.m */,
+			);
+			path = BaseModel;
+			sourceTree = "<group>";
+		};
+		F414BD052305537F00CA26D8 /* BaseCollectionViewCell */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD072305537F00CA26D8 /* MTBaseCollectionViewCell.h */,
+				F414BD062305537F00CA26D8 /* MTBaseCollectionViewCell.m */,
+			);
+			path = BaseCollectionViewCell;
+			sourceTree = "<group>";
+		};
+		F414BD082305537F00CA26D8 /* BaseLabel */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD0A2305537F00CA26D8 /* MTBaseLabel.h */,
+				F414BD092305537F00CA26D8 /* MTBaseLabel.m */,
+			);
+			path = BaseLabel;
+			sourceTree = "<group>";
+		};
+		F414BD0B2305537F00CA26D8 /* BaseTextField */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD0C2305537F00CA26D8 /* MTBaseTextField.h */,
+				F414BD0D2305537F00CA26D8 /* MTBaseTextField.m */,
+			);
+			path = BaseTextField;
+			sourceTree = "<group>";
+		};
+		F414BD0E2305537F00CA26D8 /* BaseViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F414BD102305537F00CA26D8 /* MTBaseViewModel.h */,
+				F414BD0F2305537F00CA26D8 /* MTBaseViewModel.m */,
+			);
+			path = BaseViewModel;
+			sourceTree = "<group>";
+		};
+		F414BD2523055D7400CA26D8 /* Main(主类) */ = {
+			isa = PBXGroup;
+			children = (
+				F478D8CB25B80747006B4E61 /* MTConfigModel.h */,
+				F478D8CC25B80747006B4E61 /* MTConfigModel.m */,
+				F478D8A125B43D37006B4E61 /* MTUserInforModel.h */,
+				F478D8A025B43D37006B4E61 /* MTUserInforModel.m */,
+				F414BD2623055D8300CA26D8 /* Login */,
+				F414BD2723055D8900CA26D8 /* Message */,
+				F4D833BE25DF571300534C29 /* Contacts */,
+				F4D833BF25DF575500534C29 /* Work */,
+				F414BD2823055DB100CA26D8 /* My */,
+			);
+			path = "Main(主类)";
+			sourceTree = "<group>";
+		};
+		F414BD2623055D8300CA26D8 /* Login */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85225AEDF13006B4E61 /* 绑定手机号 */,
+				F478D82625ADA4C0006B4E61 /* 找回密码 */,
+				F478D80C25ADA403006B4E61 /* 注册 */,
+				F478D7D925ADA20E006B4E61 /* 登陆 */,
+			);
+			path = Login;
+			sourceTree = "<group>";
+		};
+		F414BD2723055D8900CA26D8 /* Message */ = {
+			isa = PBXGroup;
+			children = (
+				F45F6E9225DF6566002E8AE5 /* MsgHome */,
+				F42019652580CCEB00BECDE1 /* Board */,
+			);
+			path = Message;
+			sourceTree = "<group>";
+		};
+		F414BD2823055DB100CA26D8 /* My */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FB9259DB0E1002850DD /* 个人信息 */,
+				F4E99F8A259D7E64002850DD /* 设置 */,
+				F4E99EC3259AF338002850DD /* 我的钱包 */,
+				F4029E4A23079D1500D85DD0 /* My */,
+			);
+			path = My;
+			sourceTree = "<group>";
+		};
+		F42019652580CCEB00BECDE1 /* Board */ = {
+			isa = PBXGroup;
+			children = (
+				F42019662580CD6200BECDE1 /* Controller */,
+				F42019692580CD6200BECDE1 /* Model */,
+				F420196F2580CD6200BECDE1 /* View */,
+				F420196C2580CD6200BECDE1 /* ViewModel */,
+			);
+			path = Board;
+			sourceTree = "<group>";
+		};
+		F42019662580CD6200BECDE1 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F42019672580CD6200BECDE1 /* MTBoardListViewController.m */,
+				F42019682580CD6200BECDE1 /* MTBoardListViewController.h */,
+				F420197E2580CEFE00BECDE1 /* MTBoardDetailViewController.h */,
+				F420197F2580CEFE00BECDE1 /* MTBoardDetailViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F42019692580CD6200BECDE1 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F420196A2580CD6200BECDE1 /* MTBoardListModel.m */,
+				F420196B2580CD6200BECDE1 /* MTBoardListModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F420196C2580CD6200BECDE1 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F420196D2580CD6200BECDE1 /* MTBoardListViewModel.m */,
+				F420196E2580CD6200BECDE1 /* MTBoardListViewModel.h */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F420196F2580CD6200BECDE1 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F42019762580CD8500BECDE1 /* MTBoardListTableViewCell.h */,
+				F42019772580CD8500BECDE1 /* MTBoardListTableViewCell.m */,
+				F42019782580CD8500BECDE1 /* MTBoardListTableViewCell.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F44D324E230D1CEA00735FAD /* DVDishPieHeader(饼状图) */ = {
+			isa = PBXGroup;
+			children = (
+				F44D324F230D1CEA00735FAD /* DVPieCenterView.m */,
+				F44D3250230D1CEA00735FAD /* DVFoodPieModel.m */,
+				F44D3251230D1CEA00735FAD /* DVPieChart.h */,
+				F44D3252230D1CEA00735FAD /* DVPieCenterView.h */,
+				F44D3253230D1CEA00735FAD /* DVFoodPieModel.h */,
+				F44D3254230D1CEA00735FAD /* DVPieChart.m */,
+			);
+			path = "DVDishPieHeader(饼状图)";
+			sourceTree = "<group>";
+		};
+		F45F6E9225DF6566002E8AE5 /* MsgHome */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = MsgHome;
+			sourceTree = "<group>";
+		};
+		F478D7D925ADA20E006B4E61 /* 登陆 */ = {
+			isa = PBXGroup;
+			children = (
+				F478D7DA25ADA20E006B4E61 /* ViewModel */,
+				F478D7DD25ADA20E006B4E61 /* Controller */,
+				F478D7E025ADA20E006B4E61 /* Model */,
+				F478D7E325ADA20E006B4E61 /* View */,
+			);
+			path = "登陆";
+			sourceTree = "<group>";
+		};
+		F478D7DA25ADA20E006B4E61 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F478D7DB25ADA20E006B4E61 /* MTLoginViewModel.h */,
+				F478D7DC25ADA20E006B4E61 /* MTLoginViewModel.m */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F478D7DD25ADA20E006B4E61 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F478D7DE25ADA20E006B4E61 /* MTLoginViewController.h */,
+				F478D7DF25ADA20E006B4E61 /* MTLoginViewController.m */,
+				F478D86C25B02D00006B4E61 /* MTXieyiViewController.h */,
+				F478D86D25B02D00006B4E61 /* MTXieyiViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F478D7E025ADA20E006B4E61 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F478D7E125ADA20E006B4E61 /* MTLoginModel.h */,
+				F478D7E225ADA20E006B4E61 /* MTLoginModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F478D7E325ADA20E006B4E61 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F478D7E425ADA20E006B4E61 /* MTLoginHeaderView.h */,
+				F478D7E625ADA20E006B4E61 /* MTLoginHeaderView.m */,
+				F478D84325ADA830006B4E61 /* MTLoginHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F478D80C25ADA403006B4E61 /* 注册 */ = {
+			isa = PBXGroup;
+			children = (
+				F478D80D25ADA403006B4E61 /* ViewModel */,
+				F478D81025ADA403006B4E61 /* Controller */,
+				F478D81325ADA403006B4E61 /* Model */,
+				F478D81625ADA403006B4E61 /* View */,
+			);
+			path = "注册";
+			sourceTree = "<group>";
+		};
+		F478D80D25ADA403006B4E61 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F478D80E25ADA403006B4E61 /* MTRegistViewModel.h */,
+				F478D80F25ADA403006B4E61 /* MTRegistViewModel.m */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F478D81025ADA403006B4E61 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F478D81125ADA403006B4E61 /* MTRegistViewController.m */,
+				F478D81225ADA403006B4E61 /* MTRegistViewController.h */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F478D81325ADA403006B4E61 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F478D81425ADA403006B4E61 /* MTRegistModel.m */,
+				F478D81525ADA403006B4E61 /* MTRegistModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F478D81625ADA403006B4E61 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F478D81725ADA403006B4E61 /* MTRegistHeaderView.m */,
+				F478D81A25ADA403006B4E61 /* MTRegistHeaderView.h */,
+				F478D84825ADA864006B4E61 /* MTRegistHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F478D82625ADA4C0006B4E61 /* 找回密码 */ = {
+			isa = PBXGroup;
+			children = (
+				F478D82725ADA4C0006B4E61 /* ViewModel */,
+				F478D82A25ADA4C0006B4E61 /* Controller */,
+				F478D82D25ADA4C0006B4E61 /* Model */,
+				F478D83025ADA4C0006B4E61 /* View */,
+			);
+			path = "找回密码";
+			sourceTree = "<group>";
+		};
+		F478D82725ADA4C0006B4E61 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F478D82825ADA4C0006B4E61 /* MTForgetViewModel.m */,
+				F478D82925ADA4C0006B4E61 /* MTForgetViewModel.h */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F478D82A25ADA4C0006B4E61 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F478D82B25ADA4C0006B4E61 /* MTForgetViewController.h */,
+				F478D82C25ADA4C0006B4E61 /* MTForgetViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F478D82D25ADA4C0006B4E61 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F478D82E25ADA4C0006B4E61 /* MTForgetModel.m */,
+				F478D82F25ADA4C0006B4E61 /* MTForgetModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F478D83025ADA4C0006B4E61 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F478D83125ADA4C0006B4E61 /* MTForgetHeaderView.h */,
+				F478D83325ADA4C0006B4E61 /* MTForgetHeaderView.m */,
+				F478D84D25ADA8B3006B4E61 /* MTForgetHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F478D85225AEDF13006B4E61 /* 绑定手机号 */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85625AEDF57006B4E61 /* Controller */,
+				F478D85C25AEDF58006B4E61 /* Model */,
+				F478D85925AEDF57006B4E61 /* View */,
+				F478D85325AEDF57006B4E61 /* ViewModel */,
+			);
+			path = "绑定手机号";
+			sourceTree = "<group>";
+		};
+		F478D85325AEDF57006B4E61 /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85425AEDF57006B4E61 /* MTBingViewModel.m */,
+				F478D85525AEDF57006B4E61 /* MTBingViewModel.h */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F478D85625AEDF57006B4E61 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85725AEDF57006B4E61 /* MTBingViewController.h */,
+				F478D85825AEDF57006B4E61 /* MTBingViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F478D85925AEDF57006B4E61 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85A25AEDF57006B4E61 /* MTBingHeaderView.h */,
+				F478D85B25AEDF57006B4E61 /* MTBingHeaderView.m */,
+				F478D86625AEDF97006B4E61 /* MTBingHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F478D85C25AEDF58006B4E61 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F478D85D25AEDF58006B4E61 /* MTBingModel.m */,
+				F478D85E25AEDF58006B4E61 /* MTBingModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F478D8E325BC01BE006B4E61 /* PhotoView */ = {
+			isa = PBXGroup;
+			children = (
+				F478D8E425BC01DC006B4E61 /* MTPhotoView.h */,
+				F478D8E525BC01DC006B4E61 /* MTPhotoView.m */,
+				F478D8ED25BC0344006B4E61 /* addImg.png */,
+				F478D8FC25BC15CB006B4E61 /* imgDel.png */,
+				F478D8EE25BC0345006B4E61 /* addImg@2x.png */,
+				F478D8EF25BC0345006B4E61 /* addImg@3x.png */,
+				F478D8F625BC0444006B4E61 /* MTPhotoConfigModel.h */,
+				F478D8F725BC0444006B4E61 /* MTPhotoConfigModel.m */,
+			);
+			path = PhotoView;
+			sourceTree = "<group>";
+		};
+		F497E531230FB6FA00939809 /* WebviewTool */ = {
+			isa = PBXGroup;
+			children = (
+				F497E533230FB73F00939809 /* MTWebViewController.h */,
+				F497E532230FB73F00939809 /* MTWebViewController.m */,
+			);
+			path = WebviewTool;
+			sourceTree = "<group>";
+		};
+		F4D833BE25DF571300534C29 /* Contacts */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Contacts;
+			sourceTree = "<group>";
+		};
+		F4D833BF25DF575500534C29 /* Work */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Work;
+			sourceTree = "<group>";
+		};
+		F4E99CAF25903AE6002850DD /* StarView */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99CB225903B1F002850DD /* MTStartView.h */,
+				F4E99CB025903B1E002850DD /* MTStartView.m */,
+				F4E99CB125903B1E002850DD /* MTStartView.xib */,
+			);
+			path = StarView;
+			sourceTree = "<group>";
+		};
+		F4E99EC3259AF338002850DD /* 我的钱包 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F6B259B2B18002850DD /* 充值 */,
+				F4E99ED1259AF338002850DD /* 微信提现 */,
+				F4E99ED5259AF338002850DD /* 银行卡提现 */,
+				F4E99ECC259AF338002850DD /* 支付宝提现 */,
+				F4E99ED0259AF338002850DD /* GJ_Me_WalletViewController.h */,
+				F4E99EC4259AF338002850DD /* GJ_Me_WalletViewController.m */,
+				F4E99EC5259AF338002850DD /* SubViews */,
+			);
+			path = "我的钱包";
+			sourceTree = "<group>";
+		};
+		F4E99EC5259AF338002850DD /* SubViews */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99EC6259AF338002850DD /* GJ_Me_Wallet_Cell.h */,
+				F4E99EC9259AF338002850DD /* GJ_Me_Wallet_Cell.m */,
+				F4E99ECB259AF338002850DD /* GJ_Me_Wallet_Cell.xib */,
+				F4E99EC8259AF338002850DD /* GJ_Me_Wallet_HeaderView.h */,
+				F4E99ECA259AF338002850DD /* GJ_Me_Wallet_HeaderView.m */,
+				F4E99EC7259AF338002850DD /* GJ_Me_Wallet_HeaderView.xib */,
+			);
+			path = SubViews;
+			sourceTree = "<group>";
+		};
+		F4E99ECC259AF338002850DD /* 支付宝提现 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99ECF259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.h */,
+				F4E99ECD259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.m */,
+				F4E99ECE259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.xib */,
+			);
+			path = "支付宝提现";
+			sourceTree = "<group>";
+		};
+		F4E99ED1259AF338002850DD /* 微信提现 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99ED3259AF338002850DD /* GJ_Me_CashOut_WXViewController.h */,
+				F4E99ED4259AF338002850DD /* GJ_Me_CashOut_WXViewController.m */,
+				F4E99ED2259AF338002850DD /* GJ_Me_CashOut_WXViewController.xib */,
+			);
+			path = "微信提现";
+			sourceTree = "<group>";
+		};
+		F4E99ED5259AF338002850DD /* 银行卡提现 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99ED6259AF338002850DD /* GJ_Me_CashOut_BankViewController.h */,
+				F4E99ED7259AF338002850DD /* GJ_Me_CashOut_BankViewController.m */,
+				F4E99ED8259AF338002850DD /* GJ_Me_CashOut_BankViewController.xib */,
+			);
+			path = "银行卡提现";
+			sourceTree = "<group>";
+		};
+		F4E99F6B259B2B18002850DD /* 充值 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F6C259B2C92002850DD /* Controller */,
+				F4E99F6F259B2C92002850DD /* Model */,
+				F4E99F72259B2C92002850DD /* View */,
+				F4E99F77259B2C92002850DD /* ViewModel */,
+			);
+			path = "充值";
+			sourceTree = "<group>";
+		};
+		F4E99F6C259B2C92002850DD /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F6D259B2C92002850DD /* MTPayInViewController.h */,
+				F4E99F6E259B2C92002850DD /* MTPayInViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F4E99F6F259B2C92002850DD /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F70259B2C92002850DD /* MTPayInModel.m */,
+				F4E99F71259B2C92002850DD /* MTPayInModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F4E99F72259B2C92002850DD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F75259B2C92002850DD /* MTPayInHeaderView.h */,
+				F4E99F74259B2C92002850DD /* MTPayInHeaderView.m */,
+				F4E99F82259B2E10002850DD /* MTPayInHeaderView.xib */,
+				F4E99F73259B2C92002850DD /* MTPayInTableViewCell.h */,
+				F4E99F76259B2C92002850DD /* MTPayInTableViewCell.m */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F4E99F77259B2C92002850DD /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F78259B2C92002850DD /* MTPayInViewModel.m */,
+				F4E99F79259B2C92002850DD /* MTPayInViewModel.h */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F4E99F8A259D7E64002850DD /* 设置 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FA3259DA696002850DD /* 密码 */,
+				F4E99F8E259D7EBF002850DD /* Controller */,
+				F4E99F91259D7EBF002850DD /* Model */,
+				F4E99F94259D7EC0002850DD /* View */,
+				F4E99F8B259D7EBF002850DD /* ViewModel */,
+			);
+			path = "设置";
+			sourceTree = "<group>";
+		};
+		F4E99F8B259D7EBF002850DD /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F8C259D7EBF002850DD /* MTSettingViewModel.h */,
+				F4E99F8D259D7EBF002850DD /* MTSettingViewModel.m */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F4E99F8E259D7EBF002850DD /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F8F259D7EBF002850DD /* MTSettingViewController.h */,
+				F4E99F90259D7EBF002850DD /* MTSettingViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F4E99F91259D7EBF002850DD /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F92259D7EBF002850DD /* MTSettingModel.h */,
+				F4E99F93259D7EBF002850DD /* MTSettingModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F4E99F94259D7EC0002850DD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99F95259D7EC0002850DD /* MTSettingHeaderView.h */,
+				F4E99F96259D7EC0002850DD /* MTSettingHeaderView.m */,
+				F4E99F9E259D7EFD002850DD /* MTSettingHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F4E99FA3259DA696002850DD /* 密码 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FA4259DA696002850DD /* 修改 */,
+				F4E99FAA259DA697002850DD /* 首次 */,
+			);
+			path = "密码";
+			sourceTree = "<group>";
+		};
+		F4E99FA4259DA696002850DD /* 修改 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FA5259DA696002850DD /* FFMineRetrievePayPwdController.m */,
+				F4E99FA6259DA697002850DD /* FFMineRetrievePayPwdController.h */,
+			);
+			path = "修改";
+			sourceTree = "<group>";
+		};
+		F4E99FAA259DA697002850DD /* 首次 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FAB259DA697002850DD /* FFMinePayPasswordController.h */,
+				F4E99FAC259DA697002850DD /* FFMinePayPasswordController.m */,
+			);
+			path = "首次";
+			sourceTree = "<group>";
+		};
+		F4E99FB9259DB0E1002850DD /* 个人信息 */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FC3259DB1B1002850DD /* Controller */,
+				F4E99FBA259DB1B1002850DD /* Model */,
+				F4E99FBD259DB1B1002850DD /* View */,
+				F4E99FC0259DB1B1002850DD /* ViewModel */,
+			);
+			path = "个人信息";
+			sourceTree = "<group>";
+		};
+		F4E99FBA259DB1B1002850DD /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FBB259DB1B1002850DD /* MTInfoModel.m */,
+				F4E99FBC259DB1B1002850DD /* MTInfoModel.h */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		F4E99FBD259DB1B1002850DD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FBE259DB1B1002850DD /* MTInfoHeaderView.h */,
+				F4E99FBF259DB1B1002850DD /* MTInfoHeaderView.m */,
+				F4E99FCD259DB1C6002850DD /* MTInfoHeaderView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		F4E99FC0259DB1B1002850DD /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FC1259DB1B1002850DD /* MTInfoViewModel.m */,
+				F4E99FC2259DB1B1002850DD /* MTInfoViewModel.h */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		F4E99FC3259DB1B1002850DD /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				F4E99FC4259DB1B1002850DD /* MTInfoViewController.m */,
+				F4E99FC5259DB1B1002850DD /* MTInfoViewController.h */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		F4ED175424C03A17003D7B3F /* DYCodeScanner(二维码) */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED175524C03A17003D7B3F /* DYFCodeScanner.h */,
+				F4ED175624C03A17003D7B3F /* DYFCodeScannerMacros.h */,
+				F4ED175724C03A17003D7B3F /* DYFCodeScannerPreView.h */,
+				F4ED175824C03A17003D7B3F /* DYFCodeScannerPreView.m */,
+				F4ED175924C03A17003D7B3F /* DYFCodeScannerViewController.h */,
+				F4ED175A24C03A17003D7B3F /* DYFCodeScannerViewController.m */,
+				F4ED175B24C03A17003D7B3F /* DYFQRCodeImageView.h */,
+				F4ED175C24C03A17003D7B3F /* DYFQRCodeImageView.m */,
+				F4ED175D24C03A17003D7B3F /* UIButton+Corner.h */,
+				F4ED175E24C03A17003D7B3F /* UIButton+Corner.m */,
+				F4ED175F24C03A17003D7B3F /* UIImage+QRCode.h */,
+				F4ED176024C03A17003D7B3F /* UIImage+QRCode.m */,
+			);
+			path = "DYCodeScanner(二维码)";
+			sourceTree = "<group>";
+		};
+		F4ED176924C03BD9003D7B3F /* WXApiTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED176A24C03BD9003D7B3F /* WXApiManager.h */,
+				F4ED176B24C03BD9003D7B3F /* WXApiManager.m */,
+			);
+			path = WXApiTool;
+			sourceTree = "<group>";
+		};
+		F4ED176C24C03BD9003D7B3F /* ImageTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED176D24C03BD9003D7B3F /* MTImageManager.h */,
+				F4ED176E24C03BD9003D7B3F /* MTImageManager.m */,
+			);
+			path = ImageTool;
+			sourceTree = "<group>";
+		};
+		F4ED177224C03BD9003D7B3F /* VideoTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED177324C03BD9003D7B3F /* MTAssetManager.h */,
+				F4ED177424C03BD9003D7B3F /* MTAssetManager.m */,
+			);
+			path = VideoTool;
+			sourceTree = "<group>";
+		};
+		F4ED177524C03BD9003D7B3F /* ApplePayTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED177624C03BD9003D7B3F /* MTApplePayTool.h */,
+				F4ED177724C03BD9003D7B3F /* MTApplePayTool.m */,
+			);
+			path = ApplePayTool;
+			sourceTree = "<group>";
+		};
+		F4ED177824C03BD9003D7B3F /* VideoDownTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED177924C03BD9003D7B3F /* MTVideoDownTool.h */,
+				F4ED177A24C03BD9003D7B3F /* MTVideoDownTool.m */,
+			);
+			path = VideoDownTool;
+			sourceTree = "<group>";
+		};
+		F4ED178124C042D5003D7B3F /* EBBannerView(前台通知栏) */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED178224C042D5003D7B3F /* Classes */,
+				F4ED179324C042D5003D7B3F /* EBBannerView.h */,
+				F4ED179424C042D5003D7B3F /* EBBannerViewController.h */,
+				F4ED179524C042D5003D7B3F /* EBCustomBannerView.h */,
+				F4ED179624C042D5003D7B3F /* SwiftClasses */,
+			);
+			path = "EBBannerView(前台通知栏)";
+			sourceTree = "<group>";
+		};
+		F4ED178224C042D5003D7B3F /* Classes */ = {
+			isa = PBXGroup;
+			children = (
+				F4ED178324C042D5003D7B3F /* EBBannerView+Categories.h */,
+				F4ED178424C042D5003D7B3F /* EBBannerView+Categories.m */,
+				F4ED178524C042D5003D7B3F /* EBBannerView.m */,
+				F4ED178624C042D5003D7B3F /* EBBannerView.xib */,
+				F4ED178724C042D5003D7B3F /* EBBannerViewController.m */,
+				F4ED178824C042D5003D7B3F /* EBBannerViewController.xib */,
+				F4ED178924C042D5003D7B3F /* EBBannerViewMaker.m */,
+				F4ED178A24C042D5003D7B3F /* EBBannerWindow.h */,
+				F4ED178B24C042D5003D7B3F /* EBBannerWindow.m */,
+				F4ED178C24C042D5003D7B3F /* EBCustomBannerView.m */,
+				F4ED178D24C042D5003D7B3F /* EBEmptyWindow.h */,
+				F4ED178E24C042D5003D7B3F /* EBEmptyWindow.m */,
+				F4ED178F24C042D5003D7B3F /* EBMuteDetector.h */,
+				F4ED179024C042D5003D7B3F /* EBMuteDetector.m */,
+				F4ED179124C042D5003D7B3F /* EBMuteDetector.mp3 */,
+				F4ED179224C042D5003D7B3F /* EBSystemBannerView.xib */,
+			);
+			path = Classes;
+			sourceTree = "<group>";
+		};
+		F4ED179624C042D5003D7B3F /* SwiftClasses */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = SwiftClasses;
+			sourceTree = "<group>";
+		};
+		F4F5BC71258B4F9100372E4D /* SelectDayHourTool */ = {
+			isa = PBXGroup;
+			children = (
+				F4E51C33258A004200135614 /* MTTimePickView.h */,
+				F4E51C34258A004200135614 /* MTTimePickView.m */,
+				F4E51C39258A005E00135614 /* MTTimePickView.xib */,
+				F4F5BC75258B4FBC00372E4D /* CustomDatePickerViewModel.h */,
+				F4F5BC73258B4FBC00372E4D /* CustomDatePickerViewModel.m */,
+				F4F5BC72258B4FBC00372E4D /* NSDate+Category.h */,
+				F4F5BC74258B4FBC00372E4D /* NSDate+Category.m */,
+			);
+			path = SelectDayHourTool;
+			sourceTree = "<group>";
+		};
+		F4F5BCD6258C810600372E4D /* AlertView */ = {
+			isa = PBXGroup;
+			children = (
+				F4F5BCD7258C810600372E4D /* MTAlertView.m */,
+				F4F5BCD8258C810600372E4D /* MTAlertView.xib */,
+				F4F5BCD9258C810600372E4D /* MTAlertView.h */,
+			);
+			path = AlertView;
+			sourceTree = "<group>";
+		};
+		F4F5BD03258C91E100372E4D /* NoDataView */ = {
+			isa = PBXGroup;
+			children = (
+				F4F5BD04258C91F700372E4D /* MTNoDataView.h */,
+				F4F5BD05258C91F700372E4D /* MTNoDataView.m */,
+				F4F5BD0D258C921800372E4D /* MTNoDataView.xib */,
+			);
+			path = NoDataView;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		45C4DF2922FD42300072EE2F /* Jianbinglian */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 45C4DF5622FD42320072EE2F /* Build configuration list for PBXNativeTarget "Jianbinglian" */;
+			buildPhases = (
+				1A746AF75FE788BD5A2608B1 /* [CP] Check Pods Manifest.lock */,
+				45C4DF2622FD42300072EE2F /* Sources */,
+				45C4DF2722FD42300072EE2F /* Frameworks */,
+				45C4DF2822FD42300072EE2F /* Resources */,
+				06AD7EF272ECA02BD24A6FC9 /* [CP] Embed Pods Frameworks */,
+				817D35CF50B1272F949DA1FE /* [CP] Copy Pods Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Jianbinglian;
+			productName = Jianbinglian;
+			productReference = 45C4DF2A22FD42300072EE2F /* Jianbinglian.app */;
+			productType = "com.apple.product-type.application";
+		};
+		45C4DF4122FD42320072EE2F /* JianbinglianTests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 45C4DF5922FD42320072EE2F /* Build configuration list for PBXNativeTarget "JianbinglianTests" */;
+			buildPhases = (
+				F0F31CF4443C619D16423103 /* [CP] Check Pods Manifest.lock */,
+				45C4DF3E22FD42320072EE2F /* Sources */,
+				45C4DF3F22FD42320072EE2F /* Frameworks */,
+				45C4DF4022FD42320072EE2F /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				45C4DF4422FD42320072EE2F /* PBXTargetDependency */,
+			);
+			name = JianbinglianTests;
+			productName = JianbinglianTests;
+			productReference = 45C4DF4222FD42320072EE2F /* JianbinglianTests.xctest */;
+			productType = "com.apple.product-type.bundle.unit-test";
+		};
+		45C4DF4C22FD42320072EE2F /* JianbinglianUITests */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 45C4DF5C22FD42320072EE2F /* Build configuration list for PBXNativeTarget "JianbinglianUITests" */;
+			buildPhases = (
+				DE7094A5006F5F25DD609EA2 /* [CP] Check Pods Manifest.lock */,
+				45C4DF4922FD42320072EE2F /* Sources */,
+				45C4DF4A22FD42320072EE2F /* Frameworks */,
+				45C4DF4B22FD42320072EE2F /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				45C4DF4F22FD42320072EE2F /* PBXTargetDependency */,
+			);
+			name = JianbinglianUITests;
+			productName = JianbinglianUITests;
+			productReference = 45C4DF4D22FD42320072EE2F /* JianbinglianUITests.xctest */;
+			productType = "com.apple.product-type.bundle.ui-testing";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		45C4DF2222FD422F0072EE2F /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1030;
+				ORGANIZATIONNAME = Simon;
+				TargetAttributes = {
+					45C4DF2922FD42300072EE2F = {
+						CreatedOnToolsVersion = 10.3;
+					};
+					45C4DF4122FD42320072EE2F = {
+						CreatedOnToolsVersion = 10.3;
+						TestTargetID = 45C4DF2922FD42300072EE2F;
+					};
+					45C4DF4C22FD42320072EE2F = {
+						CreatedOnToolsVersion = 10.3;
+						TestTargetID = 45C4DF2922FD42300072EE2F;
+					};
+				};
+			};
+			buildConfigurationList = 45C4DF2522FD422F0072EE2F /* Build configuration list for PBXProject "Jianbinglian" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+				"zh-Hans",
+			);
+			mainGroup = 45C4DF2122FD422F0072EE2F;
+			productRefGroup = 45C4DF2B22FD42300072EE2F /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				45C4DF2922FD42300072EE2F /* Jianbinglian */,
+				45C4DF4122FD42320072EE2F /* JianbinglianTests */,
+				45C4DF4C22FD42320072EE2F /* JianbinglianUITests */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		45C4DF2822FD42300072EE2F /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				F4ED17A124C042D5003D7B3F /* EBMuteDetector.mp3 in Resources */,
+				F4E99F83259B2E10002850DD /* MTPayInHeaderView.xib in Resources */,
+				F4ED179924C042D5003D7B3F /* EBBannerView.xib in Resources */,
+				F478D8F225BC0345006B4E61 /* addImg@3x.png in Resources */,
+				F4E99FCE259DB1C6002850DD /* MTInfoHeaderView.xib in Resources */,
+				45C4DF3A22FD42310072EE2F /* LaunchScreen.storyboard in Resources */,
+				F4E99DFD2595C9BD002850DD /* MTMyHeaderView.xib in Resources */,
+				F4E99DF82595C611002850DD /* MTMyTableViewCell.xib in Resources */,
+				F478D84925ADA864006B4E61 /* MTRegistHeaderView.xib in Resources */,
+				F478D86725AEDF97006B4E61 /* MTBingHeaderView.xib in Resources */,
+				F414BCDC2305521200CA26D8 /* Localizable.strings in Resources */,
+				F4ED17A224C042D5003D7B3F /* EBSystemBannerView.xib in Resources */,
+				F4E99F9F259D7EFD002850DD /* MTSettingHeaderView.xib in Resources */,
+				F4E51C3A258A005E00135614 /* MTTimePickView.xib in Resources */,
+				F4F5BCDB258C810600372E4D /* MTAlertView.xib in Resources */,
+				F478D84425ADA830006B4E61 /* MTLoginHeaderView.xib in Resources */,
+				F420197A2580CD8500BECDE1 /* MTBoardListTableViewCell.xib in Resources */,
+				F4F5BD0E258C921800372E4D /* MTNoDataView.xib in Resources */,
+				F4E99EDF259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.xib in Resources */,
+				F478D8F125BC0345006B4E61 /* addImg@2x.png in Resources */,
+				F4E99EE0259AF338002850DD /* GJ_Me_CashOut_WXViewController.xib in Resources */,
+				F4ED179B24C042D5003D7B3F /* EBBannerViewController.xib in Resources */,
+				F4E99EDD259AF338002850DD /* GJ_Me_Wallet_Cell.xib in Resources */,
+				F478D8FD25BC15CB006B4E61 /* imgDel.png in Resources */,
+				F4E99EDA259AF338002850DD /* GJ_Me_Wallet_HeaderView.xib in Resources */,
+				F4E99EE3259AF338002850DD /* GJ_Me_CashOut_BankViewController.xib in Resources */,
+				F4E99CB425903B1F002850DD /* MTStartView.xib in Resources */,
+				45C4DF3722FD42310072EE2F /* Assets.xcassets in Resources */,
+				F478D8F025BC0345006B4E61 /* addImg.png in Resources */,
+				45C4DF3522FD42300072EE2F /* Main.storyboard in Resources */,
+				F478D84E25ADA8B3006B4E61 /* MTForgetHeaderView.xib in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF4022FD42320072EE2F /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF4B22FD42320072EE2F /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		06AD7EF272ECA02BD24A6FC9 /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		1A746AF75FE788BD5A2608B1 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-Jianbinglian-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		817D35CF50B1272F949DA1FE /* [CP] Copy Pods Resources */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-resources-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			name = "[CP] Copy Pods Resources";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-resources-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jianbinglian/Pods-Jianbinglian-resources.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
+		DE7094A5006F5F25DD609EA2 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-JianbinglianUITests-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+		F0F31CF4443C619D16423103 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-JianbinglianTests-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		45C4DF2622FD42300072EE2F /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				F4E99FAD259DA697002850DD /* FFMineRetrievePayPwdController.m in Sources */,
+				F4ED179D24C042D5003D7B3F /* EBBannerWindow.m in Sources */,
+				F44D3256230D1CEA00735FAD /* DVFoodPieModel.m in Sources */,
+				F414BD1F2305537F00CA26D8 /* MTBaseLabel.m in Sources */,
+				F478D83625ADA4C0006B4E61 /* MTForgetViewController.m in Sources */,
+				F478D7FE25ADA20E006B4E61 /* MTLoginModel.m in Sources */,
+				F478D81C25ADA403006B4E61 /* MTRegistViewController.m in Sources */,
+				F478D86E25B02D00006B4E61 /* MTXieyiViewController.m in Sources */,
+				F4E99F7C259B2C93002850DD /* MTPayInHeaderView.m in Sources */,
+				F4E99F9A259D7EC0002850DD /* MTSettingHeaderView.m in Sources */,
+				F478D7FD25ADA20E006B4E61 /* MTLoginViewController.m in Sources */,
+				F491D4352351BCD300D34A4A /* MTCopyLabel.m in Sources */,
+				F478D8A225B43D37006B4E61 /* MTUserInforModel.m in Sources */,
+				F4ED177F24C03BD9003D7B3F /* MTApplePayTool.m in Sources */,
+				F4051E5623069AC400AD2B9B /* WMMenuView.m in Sources */,
+				F4F5BD06258C91F700372E4D /* MTNoDataView.m in Sources */,
+				F42019792580CD8500BECDE1 /* MTBoardListTableViewCell.m in Sources */,
+				F4051E22230687DE00AD2B9B /* MTTimeTool.m in Sources */,
+				F423D418230C450A008D0675 /* NSLayoutConstraint+MT.m in Sources */,
+				F423D414230C450A008D0675 /* UIButton+MT.m in Sources */,
+				F414BCD523054E2000CA26D8 /* NSObject+YYModel.m in Sources */,
+				F414BD172305537F00CA26D8 /* MTBaseButton.m in Sources */,
+				F42019712580CD6200BECDE1 /* MTBoardListModel.m in Sources */,
+				F414BD152305537F00CA26D8 /* CustomNaviBarView.m in Sources */,
+				F4051E6823069E9700AD2B9B /* MTHttpTool.m in Sources */,
+				F4051E5423069AC400AD2B9B /* WMMenuItem.m in Sources */,
+				F414BCCC230541F300CA26D8 /* MTRightImageButton.m in Sources */,
+				F4051E6723069E9700AD2B9B /* MTCacheTool.m in Sources */,
+				F4051E3F2306937200AD2B9B /* Routable.m in Sources */,
+				F42019722580CD6200BECDE1 /* MTBoardListViewModel.m in Sources */,
+				F479B0C62319639A00C58D9D /* MTUpLoadViewModel.m in Sources */,
+				F4E99EDB259AF338002850DD /* GJ_Me_Wallet_Cell.m in Sources */,
+				F414BD1E2305537F00CA26D8 /* MTBaseCollectionViewCell.m in Sources */,
+				F4029E4823079AB800D85DD0 /* MTMyHeaderView.m in Sources */,
+				F414BD202305537F00CA26D8 /* MTBaseTextField.m in Sources */,
+				F478D8E625BC01DC006B4E61 /* MTPhotoView.m in Sources */,
+				F478D80025ADA20E006B4E61 /* MTLoginHeaderView.m in Sources */,
+				F4ED179E24C042D5003D7B3F /* EBCustomBannerView.m in Sources */,
+				F44D3257230D1CEA00735FAD /* DVPieChart.m in Sources */,
+				F414BD122305537F00CA26D8 /* MTBaseCollectionView.m in Sources */,
+				F423D417230C450A008D0675 /* UITextView+MT.m in Sources */,
+				F478D81B25ADA403006B4E61 /* MTRegistViewModel.m in Sources */,
+				F4051E5723069AC400AD2B9B /* WMProgressView.m in Sources */,
+				F478D8F825BC0444006B4E61 /* MTPhotoConfigModel.m in Sources */,
+				F4E99EE2259AF338002850DD /* GJ_Me_CashOut_BankViewController.m in Sources */,
+				F478D8CD25B80747006B4E61 /* MTConfigModel.m in Sources */,
+				F4ED176324C03A17003D7B3F /* DYFQRCodeImageView.m in Sources */,
+				F478D86125AEDF58006B4E61 /* MTBingHeaderView.m in Sources */,
+				F414BD142305537F00CA26D8 /* CustomNavigationController.m in Sources */,
+				F4051E6023069CFC00AD2B9B /* NSString+MT.m in Sources */,
+				F44D3255230D1CEA00735FAD /* DVPieCenterView.m in Sources */,
+				F4029E4623079AB800D85DD0 /* MTMyViewModel.m in Sources */,
+				F4051E422306937200AD2B9B /* JYRouter.m in Sources */,
+				F4ED176824C03ACB003D7B3F /* UIImage+MT.m in Sources */,
+				F4051E5323069AC400AD2B9B /* WMPageController.m in Sources */,
+				F4E99F97259D7EC0002850DD /* MTSettingViewModel.m in Sources */,
+				F4E99CB325903B1F002850DD /* MTStartView.m in Sources */,
+				F4E99F99259D7EC0002850DD /* MTSettingModel.m in Sources */,
+				F4E99FC7259DB1B1002850DD /* MTInfoHeaderView.m in Sources */,
+				F4ED178024C03BD9003D7B3F /* MTVideoDownTool.m in Sources */,
+				F4051E6123069CFC00AD2B9B /* UIColor+MT.m in Sources */,
+				F4051E5F23069CFC00AD2B9B /* UIView+MT.m in Sources */,
+				F4E99FC9259DB1B1002850DD /* MTInfoViewController.m in Sources */,
+				F478D87D25B06031006B4E61 /* UIImage+getSize.m in Sources */,
+				45C4DF3D22FD42310072EE2F /* main.m in Sources */,
+				F478D7FC25ADA20E006B4E61 /* MTLoginViewModel.m in Sources */,
+				F4ED176424C03A17003D7B3F /* UIButton+Corner.m in Sources */,
+				F414BD182305537F00CA26D8 /* MTRootController.m in Sources */,
+				F414BCD623054E2000CA26D8 /* YYClassInfo.m in Sources */,
+				F4E99ED9259AF338002850DD /* GJ_Me_WalletViewController.m in Sources */,
+				F414BD212305537F00CA26D8 /* MTBaseViewModel.m in Sources */,
+				F4E99EDC259AF338002850DD /* GJ_Me_Wallet_HeaderView.m in Sources */,
+				F4ED179A24C042D5003D7B3F /* EBBannerViewController.m in Sources */,
+				F4ED179824C042D5003D7B3F /* EBBannerView.m in Sources */,
+				F414BD162305537F00CA26D8 /* MTBaseTableViewCell.m in Sources */,
+				F4ED179F24C042D5003D7B3F /* EBEmptyWindow.m in Sources */,
+				F4E99EE1259AF338002850DD /* GJ_Me_CashOut_WXViewController.m in Sources */,
+				F478D83925ADA4C0006B4E61 /* MTForgetHeaderView.m in Sources */,
+				F4E99EDE259AF338002850DD /* GJ_Me_CashOut_ZFBViewController.m in Sources */,
+				F4ED17A024C042D5003D7B3F /* EBMuteDetector.m in Sources */,
+				F478D81D25ADA403006B4E61 /* MTRegistModel.m in Sources */,
+				F4E99DF72595C611002850DD /* MTMyTableViewCell.m in Sources */,
+				F414BCC8230541F300CA26D8 /* MTDevicesTool.m in Sources */,
+				F414BD112305537F00CA26D8 /* MTBaseTableView.m in Sources */,
+				F4E99FC8259DB1B1002850DD /* MTInfoViewModel.m in Sources */,
+				F414BD192305537F00CA26D8 /* MTBaseView.m in Sources */,
+				F4029E4723079AB800D85DD0 /* MTMyModel.m in Sources */,
+				F497E534230FB73F00939809 /* MTWebViewController.m in Sources */,
+				F4F5BC76258B4FBC00372E4D /* CustomDatePickerViewModel.m in Sources */,
+				F414BD1D2305537F00CA26D8 /* MTBaseModel.m in Sources */,
+				F423D415230C450A008D0675 /* UILabel+MT.m in Sources */,
+				F4ED177E24C03BD9003D7B3F /* MTAssetManager.m in Sources */,
+				F4F5BCDA258C810600372E4D /* MTAlertView.m in Sources */,
+				F478D83725ADA4C0006B4E61 /* MTForgetModel.m in Sources */,
+				F4ED177C24C03BD9003D7B3F /* MTImageManager.m in Sources */,
+				F4E99FAF259DA697002850DD /* FFMinePayPasswordController.m in Sources */,
+				F414BCCA230541F300CA26D8 /* MTTipsTool.m in Sources */,
+				F4ED176224C03A17003D7B3F /* DYFCodeScannerViewController.m in Sources */,
+				F423D416230C450A008D0675 /* UITextField+MT.m in Sources */,
+				F478D86025AEDF58006B4E61 /* MTBingViewController.m in Sources */,
+				F4ED179C24C042D5003D7B3F /* EBBannerViewMaker.m in Sources */,
+				F4051E1C2306874200AD2B9B /* MTMD5Tool.m in Sources */,
+				F4ED176524C03A17003D7B3F /* UIImage+QRCode.m in Sources */,
+				F478D81E25ADA403006B4E61 /* MTRegistHeaderView.m in Sources */,
+				F4029E502307ECA600D85DD0 /* UIImageView+MT.m in Sources */,
+				F4E99F98259D7EC0002850DD /* MTSettingViewController.m in Sources */,
+				F4ED177B24C03BD9003D7B3F /* WXApiManager.m in Sources */,
+				45C4DF2F22FD42300072EE2F /* AppDelegate.m in Sources */,
+				F414BCC9230541F300CA26D8 /* MTInternationalTool.m in Sources */,
+				F4E99F7B259B2C93002850DD /* MTPayInModel.m in Sources */,
+				F478D86225AEDF58006B4E61 /* MTBingModel.m in Sources */,
+				F414BD132305537F00CA26D8 /* MTBaseViewController.m in Sources */,
+				F4E99F7E259B2C93002850DD /* MTPayInViewModel.m in Sources */,
+				F478D83525ADA4C0006B4E61 /* MTForgetViewModel.m in Sources */,
+				F4051E5523069AC400AD2B9B /* WMScrollView.m in Sources */,
+				F4051E472306951D00AD2B9B /* UINavigationController+FDFullscreenPopGesture.m in Sources */,
+				F4ED179724C042D5003D7B3F /* EBBannerView+Categories.m in Sources */,
+				F4E99FC6259DB1B1002850DD /* MTInfoModel.m in Sources */,
+				F4ED176124C03A17003D7B3F /* DYFCodeScannerPreView.m in Sources */,
+				F4E99F7D259B2C93002850DD /* MTPayInTableViewCell.m in Sources */,
+				F42019702580CD6200BECDE1 /* MTBoardListViewController.m in Sources */,
+				F4029E4523079AB800D85DD0 /* MTMyViewController.m in Sources */,
+				F4F5BC77258B4FBC00372E4D /* NSDate+Category.m in Sources */,
+				F478D85F25AEDF58006B4E61 /* MTBingViewModel.m in Sources */,
+				F4E99F7A259B2C92002850DD /* MTPayInViewController.m in Sources */,
+				F414BD1C2305537F00CA26D8 /* MTBaseImageView.m in Sources */,
+				F414BCCD230541F300CA26D8 /* MTGifRefreshHeader.m in Sources */,
+				F4051E1F2306878C00AD2B9B /* MTStringTool.m in Sources */,
+				F4E51C35258A004200135614 /* MTTimePickView.m in Sources */,
+				F414BCCB230541F300CA26D8 /* MTTopImageButton.m in Sources */,
+				F42019802580CEFE00BECDE1 /* MTBoardDetailViewController.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF3E22FD42320072EE2F /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				45C4DF4722FD42320072EE2F /* JianbinglianTests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		45C4DF4922FD42320072EE2F /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				45C4DF5222FD42320072EE2F /* JianbinglianUITests.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		45C4DF4422FD42320072EE2F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 45C4DF2922FD42300072EE2F /* Jianbinglian */;
+			targetProxy = 45C4DF4322FD42320072EE2F /* PBXContainerItemProxy */;
+		};
+		45C4DF4F22FD42320072EE2F /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 45C4DF2922FD42300072EE2F /* Jianbinglian */;
+			targetProxy = 45C4DF4E22FD42320072EE2F /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+		45C4DF3322FD42300072EE2F /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				45C4DF3422FD42300072EE2F /* Base */,
+				F414BCD8230551CD00CA26D8 /* zh-Hans */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		45C4DF3822FD42310072EE2F /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				45C4DF3922FD42310072EE2F /* Base */,
+				F414BCD9230551CE00CA26D8 /* zh-Hans */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+		F414BCDE2305521200CA26D8 /* Localizable.strings */ = {
+			isa = PBXVariantGroup;
+			children = (
+				F414BCDD2305521200CA26D8 /* zh-Hans */,
+				F414BCDF2305521700CA26D8 /* en */,
+			);
+			name = Localizable.strings;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		45C4DF5422FD42320072EE2F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 12.4;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		45C4DF5522FD42320072EE2F /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 12.4;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		45C4DF5722FD42320072EE2F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 8C2D09D5B94C209D63BA7C67 /* Pods-Jianbinglian.debug.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = H6FFJBQWGY;
+				GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SRCROOT)/Jianbinglian/Other/PrefixHeader.pch";
+				INFOPLIST_FILE = Jianbinglian/Other/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.hdl.gujiauser;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		45C4DF5822FD42320072EE2F /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 673D0FABDEC01E041559FB9A /* Pods-Jianbinglian.release.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
+				CODE_SIGN_IDENTITY = "Apple Development";
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = H6FFJBQWGY;
+				GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "$(SRCROOT)/Jianbinglian/Other/PrefixHeader.pch";
+				INFOPLIST_FILE = Jianbinglian/Other/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.hdl.gujiauser;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Release;
+		};
+		45C4DF5A22FD42320072EE2F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 7AC95B38A7A6EEA0F29C5F38 /* Pods-JianbinglianTests.debug.xcconfig */;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				CODE_SIGN_STYLE = Automatic;
+				INFOPLIST_FILE = JianbinglianTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.simon.JianbinglianTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Jianbinglian.app/Jianbinglian";
+			};
+			name = Debug;
+		};
+		45C4DF5B22FD42320072EE2F /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = C613242FEA4827FCB0291F7A /* Pods-JianbinglianTests.release.xcconfig */;
+			buildSettings = {
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				CODE_SIGN_STYLE = Automatic;
+				INFOPLIST_FILE = JianbinglianTests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.simon.JianbinglianTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Jianbinglian.app/Jianbinglian";
+			};
+			name = Release;
+		};
+		45C4DF5D22FD42320072EE2F /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 42B2BA49C2CD891CFA3AFA61 /* Pods-JianbinglianUITests.debug.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				INFOPLIST_FILE = JianbinglianUITests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.simon.JianbinglianUITests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = Jianbinglian;
+			};
+			name = Debug;
+		};
+		45C4DF5E22FD42320072EE2F /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 03C6E27E12294EBE8B7F48DC /* Pods-JianbinglianUITests.release.xcconfig */;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				INFOPLIST_FILE = JianbinglianUITests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = com.simon.JianbinglianUITests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = Jianbinglian;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		45C4DF2522FD422F0072EE2F /* Build configuration list for PBXProject "Jianbinglian" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				45C4DF5422FD42320072EE2F /* Debug */,
+				45C4DF5522FD42320072EE2F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		45C4DF5622FD42320072EE2F /* Build configuration list for PBXNativeTarget "Jianbinglian" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				45C4DF5722FD42320072EE2F /* Debug */,
+				45C4DF5822FD42320072EE2F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		45C4DF5922FD42320072EE2F /* Build configuration list for PBXNativeTarget "JianbinglianTests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				45C4DF5A22FD42320072EE2F /* Debug */,
+				45C4DF5B22FD42320072EE2F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		45C4DF5C22FD42320072EE2F /* Build configuration list for PBXNativeTarget "JianbinglianUITests" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				45C4DF5D22FD42320072EE2F /* Debug */,
+				45C4DF5E22FD42320072EE2F /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 45C4DF2222FD422F0072EE2F /* Project object */;
+}

+ 7 - 0
Jianbinglian.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:Demo.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
Jianbinglian.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 10 - 0
Jianbinglian.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Jianbinglian.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
Jianbinglian.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

+ 17 - 0
Jianbinglian/Base(基类)/BaseButton/MTBaseButton.h

@@ -0,0 +1,17 @@
+//
+//  MTBaseButton.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseButton : UIButton
++(MTBaseButton *)buttonWithFrame:(CGRect)rect title:(NSString *)title imageName:(NSString *)imageName titleColor:(UIColor *)color titleFont:(int)size;
++(MTBaseButton *)buttonWithFrame:(CGRect)rect imageName:(NSString *)imageName;
+@end
+
+NS_ASSUME_NONNULL_END

+ 29 - 0
Jianbinglian/Base(基类)/BaseButton/MTBaseButton.m

@@ -0,0 +1,29 @@
+//
+//  MTBaseButton.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseButton.h"
+
+@implementation MTBaseButton
+//UIButton方法实现
++(MTBaseButton *)buttonWithFrame:(CGRect)rect title:(NSString *)title imageName:(NSString *)imageName titleColor:(UIColor *)color titleFont:(int)size
+{
+    MTBaseButton *bt = [MTBaseButton buttonWithType:UIButtonTypeCustom];
+    bt.frame = rect;
+    [bt setTitle:title forState:UIControlStateNormal];
+    [bt setTitleColor:color forState:UIControlStateNormal];
+    bt.titleLabel.font = font(size);
+    [bt setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
+    return bt;
+    
+}
++(MTBaseButton *)buttonWithFrame:(CGRect)rect imageName:(NSString *)imageName{
+    MTBaseButton *bt = [MTBaseButton buttonWithType:UIButtonTypeCustom];
+    bt.frame = rect;
+    [bt setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
+    return bt;
+}
+@end

+ 16 - 0
Jianbinglian/Base(基类)/BaseCollectionView/MTBaseCollectionView.h

@@ -0,0 +1,16 @@
+//
+//  MTBaseCollectionView.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseCollectionView : UICollectionView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 20 - 0
Jianbinglian/Base(基类)/BaseCollectionView/MTBaseCollectionView.m

@@ -0,0 +1,20 @@
+//
+//  MTBaseCollectionView.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseCollectionView.h"
+
+@implementation MTBaseCollectionView
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 16 - 0
Jianbinglian/Base(基类)/BaseCollectionViewCell/MTBaseCollectionViewCell.h

@@ -0,0 +1,16 @@
+//
+//  MTBaseCollectionViewCell.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseCollectionViewCell : UICollectionViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 12 - 0
Jianbinglian/Base(基类)/BaseCollectionViewCell/MTBaseCollectionViewCell.m

@@ -0,0 +1,12 @@
+//
+//  MTBaseCollectionViewCell.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseCollectionViewCell.h"
+
+@implementation MTBaseCollectionViewCell
+
+@end

+ 30 - 0
Jianbinglian/Base(基类)/BaseController/MTBaseViewController.h

@@ -0,0 +1,30 @@
+//
+//  MTBaseViewController
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "MTViewControllerProtocol.h"
+#import "CustomNaviBarView.h"
+@interface MTBaseViewController  : UIViewController <MTViewControllerProtocol>
+
+@property (nonatomic, strong) CustomNaviBarView *navgationView;
+- (void)bringNaviBarToTopmost;
+
+- (void)hideNaviBar:(BOOL)bIsHide;
+- (void)setNaviBarTitle:(NSString *)strTitle;
+- (void)setNaviBarLeftBtn:(UIButton *)btn;
+- (void)setNaviBarRightBtn:(UIButton *)btn;
+
+- (void)setNaviBarTitleView:(UIView *)titleView;
+- (void)setNaviBarLeftButtonArray:(NSArray *)leftButtonArray;
+- (void)setNaviBarRightButtonArray:(NSArray *)rightButtonArray;
+- (void)navigationCanDragBack:(BOOL)bCanDragBack;
+- (void)makeViewNaviBarBackground:(UIColor*)color;
+
+- (void) mt_bindViewModel;
+- (void) mt_addSubviews;
+- (void) mt_layoutNavigation;
+@end

+ 176 - 0
Jianbinglian/Base(基类)/BaseController/MTBaseViewController.m

@@ -0,0 +1,176 @@
+//
+//  MTBaseViewController.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseViewController.h"
+#import "CustomNavigationController.h"
+@interface MTBaseViewController ()
+
+@end
+
+@implementation MTBaseViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.automaticallyAdjustsScrollViewInsets = NO;
+    
+    self.view.backgroundColor = [UIColor whiteColor];
+    [self.view addSubview:self.navgationView];    
+    
+    [self mt_layoutNavigation];
+    [self mt_addSubviews];
+    [self mt_bindViewModel];
+}
+
+- (void) mt_bindViewModel{};
+
+- (void) mt_addSubviews{};
+
+- (void) mt_layoutNavigation{};
+
+-(CustomNaviBarView *)navgationView{
+    if (!_navgationView) {
+
+        _navgationView = [[CustomNaviBarView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, navHeight)];
+        _navgationView.m_viewCtrlParent = self;
+    }
+    return _navgationView;
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    DismissHud();
+}
+
+/**
+ 使用VM配置初始化VC
+ 
+ @param viewModel 对应的VM
+ @return 对象
+ */
+- (instancetype)initWithViewModel:(id)viewModel {
+    self = [super init];
+    if (self) {
+    }
+    return self;
+}
+
+/**
+ 配置navigation,设置导航栏、分栏
+ */
+
+- (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+    [self.navigationController.navigationBar setHidden:YES];
+    NSLog(@"\n----当前Class----\n----%@---- \n", NSStringFromClass([self class]));
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    
+    [super viewWillAppear:animated];
+    [self.navigationController.navigationBar setHidden:YES];
+    if (_navgationView && !_navgationView.hidden)
+    {
+        [self.view bringSubviewToFront:_navgationView];
+    }else{}
+}
+
+-(void)viewDidDisappear:(BOOL)animated{
+    [super viewDidDisappear:animated];
+}
+
+
+
+-(void)makeViewNaviBarBackground:(UIColor*)color{
+    if (_navgationView) {
+        [_navgationView setBgColor:color];
+    }
+   
+}
+- (void)didReceiveMemoryWarning
+{
+    [super didReceiveMemoryWarning];
+    
+}
+#pragma mark -
+
+- (void)bringNaviBarToTopmost
+{
+    if (_navgationView)
+    {
+        [self.view bringSubviewToFront:_navgationView];
+    }else{}
+}
+
+- (void)hideNaviBar:(BOOL)bIsHide
+{
+    if (_navgationView) {
+        _navgationView.hidden = bIsHide;
+    }else{}
+    
+}
+- (void)setNaviBarTitleView:(UIView *)titleView{
+    if (_navgationView) {
+        [_navgationView setTitleView:titleView];
+    }else{}
+}
+- (void)setNaviBarTitle:(NSString *)strTitle
+{
+    if (_navgationView)
+    {
+        [_navgationView setTitle:strTitle];
+    }else{}
+}
+
+- (void)setNaviBarLeftBtn:(UIButton *)btn
+{
+    if (_navgationView)
+    {
+        [_navgationView setLeftBtn:btn];
+    }else{}
+}
+
+- (void)setNaviBarRightBtn:(UIButton *)btn
+{
+    if (_navgationView)
+    {
+        [_navgationView setRightBtn:btn];
+    }else{}
+}
+- (void)setNaviBarLeftButtonArray:(NSArray *)leftButtonArray{
+    if (_navgationView)
+    {
+        [_navgationView setLeftButtonArray:leftButtonArray];
+    }else{}
+}
+- (void)setNaviBarRightButtonArray:(NSArray *)rightButtonArray{
+    if (_navgationView)
+    {
+        [_navgationView setRightButtonArray:rightButtonArray];
+    }else{}
+}
+
+// 是否可右滑返回
+- (void)navigationCanDragBack:(BOOL)bCanDragBack
+{
+    if (self.navigationController){
+        [((CustomNavigationController *)(self.navigationController)) navigationCanDragBack:bCanDragBack];
+    }else{}
+}
+
+
+@end
+
+
+
+
+
+
+
+
+
+
+

+ 23 - 0
Jianbinglian/Base(基类)/BaseController/MTViewControllerProtocol.h

@@ -0,0 +1,23 @@
+//
+//  MTViewControllerProtocol.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#ifndef MTViewControllerProtocol_h
+#define MTViewControllerProtocol_h
+
+#import <Foundation/Foundation.h>
+@protocol MTViewProtocol;
+@protocol MTViewControllerProtocol <NSObject>
+
+@optional
+- (instancetype) initWithViewModel:(id) viewModel;
+- (void) mt_bindViewModel;
+- (void) mt_addSubviews;
+- (void) mt_layoutNavigation;
+@end
+
+
+#endif

+ 16 - 0
Jianbinglian/Base(基类)/BaseImageView/MTBaseImageView.h

@@ -0,0 +1,16 @@
+//
+//  MTBaseImageView.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseImageView : UIImageView
++(MTBaseImageView *)imageViewWithFrame:(CGRect)rect  image:(UIImage *)image;
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
Jianbinglian/Base(基类)/BaseImageView/MTBaseImageView.m

@@ -0,0 +1,24 @@
+//
+//  MTBaseImageView.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseImageView.h"
+
+@implementation MTBaseImageView
++(MTBaseImageView *)imageViewWithFrame:(CGRect)rect  image:(UIImage *)image{
+    MTBaseImageView*imageView = [MTBaseImageView new];
+    imageView.image = image;
+    return imageView;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 21 - 0
Jianbinglian/Base(基类)/BaseLabel/MTBaseLabel.h

@@ -0,0 +1,21 @@
+//
+//  MTBaseLabel.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseLabel : UILabel
+//UILable
++(MTBaseLabel *)labelWithFrame:(CGRect)rect backGroundColor:(UIColor *)color1 text:(NSString *)text textColor:(UIColor *)color2 font:(UIFont *)floatFont;
+
++(MTBaseLabel *)labelWithTextColor:(UIColor *)color font:(UIFont *)floatFont;
+
++(MTBaseLabel *)labelWithText:(NSString *)text andColor:(UIColor *)color font:(UIFont *)floatFont;
+@end
+
+NS_ASSUME_NONNULL_END

+ 52 - 0
Jianbinglian/Base(基类)/BaseLabel/MTBaseLabel.m

@@ -0,0 +1,52 @@
+//
+//  MTBaseLabel.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseLabel.h"
+
+@implementation MTBaseLabel
+//UILable方法实现
++(MTBaseLabel *)labelWithFrame:(CGRect)rect backGroundColor:(UIColor *)color1 text:(NSString *)text textColor:(UIColor *)color2 font:(UIFont *)floatFont
+{
+    MTBaseLabel *lb = [[MTBaseLabel alloc]init];
+    lb.frame = rect;
+    lb.backgroundColor = color1;
+    lb.text = text;
+    lb.textColor = color2;
+    lb.font = floatFont;
+    return lb;
+    
+}
++(MTBaseLabel *)labelWithTextColor:(UIColor *)color font:(UIFont *)floatFont{
+    MTBaseLabel *lb = [[MTBaseLabel alloc]init];
+    lb.textColor = color;
+    lb.font = floatFont;
+    return lb;
+}
++(MTBaseLabel *)labelWithText:(NSString *)text andColor:(UIColor *)color font:(UIFont *)floatFont{
+    MTBaseLabel *lb = [[MTBaseLabel alloc]init];
+    lb.textColor = color;
+    lb.font = floatFont;
+    lb.text = text;
+    return lb;
+}
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        self.adjustsFontSizeToFitWidth = YES;
+    }
+    return self;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 27 - 0
Jianbinglian/Base(基类)/BaseModel/MTBaseModel.h

@@ -0,0 +1,27 @@
+//
+//  MTBaseModel.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "YYModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+@interface MTBaseModel : NSObject
+@property (nonatomic, assign) NSInteger code;
+
+@property (nonatomic, assign) NSInteger is_login;
+
+@property (nonatomic, strong) id data;
+
+@property (nonatomic, copy) NSString *msg;
+
+- (void) clarifyResultWithSuccess:(void(^)(void))success failed:(void(^)(NSInteger code))failed;
+@end
+
+
+NS_ASSUME_NONNULL_END

+ 31 - 0
Jianbinglian/Base(基类)/BaseModel/MTBaseModel.m

@@ -0,0 +1,31 @@
+//
+//  MTBaseModel.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseModel.h"
+#import "MTLoginViewController.h"
+
+@implementation MTBaseModel
+
+-(void)clarifyResultWithSuccess:(void (^)(void))success failed:(nonnull void (^)(NSInteger))failed{
+    if (self.code == 1) {
+        if (success) {
+            success();
+        }
+    } else {
+        if (self.code == 100) {
+            MTLoginViewController *vc = [[MTLoginViewController alloc]init];
+            [CURRENT_NAV pushViewController:vc animated:YES];
+        }else{
+            ShowMessage(self.msg);
+            if (failed) {
+                failed(self.code);
+            }
+        }
+    }
+}
+
+@end

+ 37 - 0
Jianbinglian/Base(基类)/BaseNavigationController/CustomNaviBarView.h

@@ -0,0 +1,37 @@
+//
+//  CustomNaviBarView.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface CustomNaviBarView : UIView
+
+@property (nonatomic, weak) UIViewController *m_viewCtrlParent;
+
+
+@property (nonatomic, readonly) UIImageView *imgViewBg;
+@property (nonatomic, readonly) UIButton *btnBack;
+@property (nonatomic, strong)   NSString *title;
+
+/**
+ 自定义底部分割线
+ */
+@property (nonatomic, strong) UIView *topLine;
+
++ (CGRect)rightBtnFrame:(CGRect)rect;
++ (CGSize)barBtnSize;
++ (CGRect)titleViewFrame:(CGRect)rect;
+
+// 用自定义的按钮和标题替换默认内容
+- (void)setLeftBtn:(UIButton *)btn;
+- (void)setRightBtn:(UIButton *)btn;
+- (void)setTitleView:(UIView *)titleView;
+- (void)setLeftButtonArray:(NSArray *)leftButtonArray;
+- (void)setRightButtonArray:(NSArray *)rightButtonArray;
+- (void)setBgColor:(UIColor *)bgColor;
+- (void)setWhite;
+
+@end

+ 312 - 0
Jianbinglian/Base(基类)/BaseNavigationController/CustomNaviBarView.m

@@ -0,0 +1,312 @@
+//
+//  CustomNaviBarView.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "CustomNaviBarView.h"
+
+#define FLOAT_TitleSizeNormal               19.0f
+#define FLOAT_TitleSizeMini                 14.0f
+#define RGB_TitleNormal                     RGB(80.0f, 80.0f, 80.0f)
+#define RGB_TitleMini                       [UIColor blackColor]
+
+@interface CustomNaviBarView ()
+
+/**
+ 自定义左边按钮(数组)
+ */
+@property (nonatomic, strong) NSArray *leftButtonArray;
+
+/**
+ 自定义右边按钮(数组)
+ */
+@property (nonatomic, strong) NSArray *rightButtonArray;
+
+/**
+ 中心标题view
+ */
+@property (nonatomic, strong) UIView *titleView;
+@property (nonatomic, readonly) UIButton *btnLeft;
+@property (nonatomic, readonly) UIButton *btnRight;
+@property (nonatomic, strong) UILabel *titleLabel;
+@end
+
+@implementation CustomNaviBarView
+
+
+
++ (CGSize)barBtnSize
+{
+    return CGSizeMake(40.0f, 40.0f);
+}
++ (CGSize)titleViewSize
+{
+    return CGSizeMake(ScreenWidth - 100.0f, 40.0f);
+}
++(CGFloat)edgeSize{
+    return 5.0f;
+}
+
++ (CGRect)titleViewFrame:(CGRect)rect
+{
+    float width = 0;
+    float height  = 0;
+    if (rect.size.width > 0 || rect.size.height > 0) {
+        width = rect.size.width;
+        height  = rect.size.height;
+    }else{
+        width = [[self class] titleViewSize].width;
+        height  = [[self class] titleViewSize].height;
+    }
+    if (iphoneX) {
+        return CGRectMake(100.0f/2.f, 22.0f+20.0f, width, height);
+    }else{
+        return CGRectMake(100.0f/2.f, 22.0f, width, height);
+    }
+    
+}
++ (CGRect)leftBtnFrame
+{
+    if (iphoneX) {
+        return CGRectMake([[self class] edgeSize], 22.0f+20.0f,  [[self class] barBtnSize].width, [[self class] barBtnSize].height);
+    }else{
+        return CGRectMake([[self class] edgeSize], 22.0f,  [[self class] barBtnSize].width, [[self class] barBtnSize].height);
+    }
+    
+}
++ (CGRect)rightBtnFrame:(CGRect)rect
+{
+    float width = 0;
+    float height  = 0;
+    if (rect.size.width > 0 || rect.size.height> 0) {
+        width = rect.size.width;
+         height  = rect.size.height;
+    }else{
+        width = [[self class] barBtnSize].width;
+        height  = [[self class] barBtnSize].height;
+    }
+
+    if (iphoneX) {
+        return CGRectMake(ScreenWidth - width - [[self class] edgeSize], 22.0f+20.0f, width, height);
+    }else{
+        return CGRectMake(ScreenWidth - width - [[self class] edgeSize], 22.0f, width, height);
+    }
+    
+}
+
+
+
+- (id)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self initUI];
+    }
+    return self;
+}
+
+- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
+    UIView *view = [super hitTest:point withEvent:event];
+    if (view == nil) {
+        for (UIView *subView in self.subviews) {
+            CGPoint tp = [subView convertPoint:point fromView:self];
+            if (CGRectContainsPoint(subView.bounds, tp)) {
+                view = subView;
+            }
+        }
+    }
+    
+    return view;
+}
+- (void)initUI
+{
+    self.backgroundColor = [UIColor whiteColor];
+    
+    // 默认左侧显示返回按钮
+//    _btnBack = [[self class] createImgNaviBarBtnByImgNormal:@"icon_arrow_left" imgHighlight:@"icon_arrow_left" target:self action:@selector(btnBack:)];
+    _btnBack = [UIButton buttonWithType:UIButtonTypeCustom];
+    [_btnBack addTarget:self action:@selector(btnBack:) forControlEvents:UIControlEventTouchUpInside];
+    [_btnBack setImage:ImageNamed(@"icon_arrow_left") forState:UIControlStateNormal];
+    _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
+    _titleLabel.backgroundColor = [UIColor clearColor];
+    _titleLabel.textColor = [UIColor blackColor];
+    _titleLabel.font = font(19);
+    _titleLabel.textAlignment = NSTextAlignmentCenter;
+    
+    _imgViewBg = [[UIImageView alloc] initWithFrame:self.bounds];
+    _imgViewBg.image = [[UIImage imageNamed:@"nav_backGround_image"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
+
+    _titleLabel.frame = [[self class] titleViewFrame:CGRectZero];
+    _imgViewBg.frame = self.bounds;
+    
+    [self addSubview:_imgViewBg];
+    [self addSubview:_titleLabel];
+    [self addSubview:self.topLine];
+    [self setLeftBtn:_btnBack];
+    [self.topLine mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.left.right.equalTo(self);
+        make.height.mas_equalTo(0.5);
+    }];
+}
+
+
+- (UIView *)topLine {
+    if (!_topLine) {
+        _topLine = [[UIView alloc] init];
+        _topLine.backgroundColor = UIColorFromRGB(0xD8E3EB);
+    }
+    return _topLine;
+}
+
+- (void)btnBack:(id)sender
+{
+    if (self.m_viewCtrlParent)
+    {
+        [self.m_viewCtrlParent.navigationController popViewControllerAnimated:YES];
+    }else{}
+}
+
+
+
+
+#pragma mark -
+- (void)hideOriginalBarItem:(BOOL)bIsHide
+{
+    if (_btnLeft)
+    {
+        _btnLeft.hidden = bIsHide;
+    }else{}
+    if (_btnBack)
+    {
+        _btnBack.hidden = bIsHide;
+    }else{}
+    if (_btnRight)
+    {
+        _btnRight.hidden = bIsHide;
+    }else{}
+    if (_titleLabel)
+    {
+        _titleLabel.hidden = bIsHide;
+    }else{}
+}
+
+- (void)setTitle:(NSString *)title{
+    _title = title;
+    self.titleLabel.text = Local(title);
+}
+
+
+-(void)setBgColor:(UIColor *)bgColor{
+    if (CGColorEqualToColor(bgColor.CGColor, [UIColor clearColor].CGColor)|| CGColorEqualToColor(bgColor.CGColor, HColor(@"#FF4159").CGColor)) {
+        self.topLine.backgroundColor = bgColor;
+        
+    } else{
+        self.topLine.backgroundColor = UIColorFromRGB(0xD8E3EB);
+        self.titleLabel.hidden = NO;
+    }
+    
+    [self setBackgroundColor:bgColor];
+}
+
+-(void)setWhite{
+    self.titleLabel.textColor = [UIColor whiteColor];
+    [self setBackgroundColor:[UIColor clearColor]];
+    [self.btnLeft setImage:ImageNamed(@"backWhite") forState:UIControlStateNormal];
+    [self.topLine removeFromSuperview];
+}
+- (void)setLeftBtn:(UIButton *)btn
+{
+    if (_btnLeft)
+    {
+        [_btnLeft removeFromSuperview];
+        _btnLeft = nil;
+    }else{}
+    
+    _btnLeft = btn;
+    if (_btnLeft){
+        _btnLeft.frame = [[self class] leftBtnFrame];
+        [self addSubview:_btnLeft];
+       
+        
+    }else{}
+}
+
+- (void)setRightBtn:(UIButton *)btn
+{
+    if (_btnRight)
+    {
+        [_btnRight removeFromSuperview];
+        _btnRight = nil;
+    }else{}
+    
+    _btnRight = btn;
+    if (_btnRight){
+        _btnRight.frame = [[self class] rightBtnFrame:_btnRight.frame];
+        [self addSubview:_btnRight];
+       
+       
+    }else{}
+}
+-(void)setTitleView:(UIView *)titleView{
+    if (_titleView) {
+        [_titleView removeFromSuperview];
+        _titleView = nil;
+    }
+    if (_titleLabel) {
+        [_titleLabel removeFromSuperview];
+        _titleLabel = nil;
+    }
+    _titleView = titleView;
+    _titleView.frame = [[self class] titleViewFrame:_titleView.frame];
+    [self addSubview:_titleView];
+   
+   
+}
+
+-(void)setLeftButtonArray:(NSArray *)leftButtonArray{
+    _leftButtonArray = leftButtonArray;
+    if (_btnLeft) {
+         [self.btnLeft removeFromSuperview];
+    }
+   
+    
+    [leftButtonArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        UIButton *button = obj;
+        CGRect frame = button.frame;
+        if (iphoneX) {
+            frame.origin = CGPointMake(kNumFrom375(10+idx*40), kNumFrom375(28+22));
+        }else {
+            frame.origin = CGPointMake(kNumFrom375(10+idx*40), kNumFrom375(28));
+        }
+        
+        button.frame = frame;
+        [self addSubview:button];
+    }];
+}
+
+-(void)setRightButtonArray:(NSArray *)rightButtonArray{
+    _rightButtonArray = rightButtonArray;
+    if (_btnRight) {
+        [self.btnRight removeFromSuperview];
+    }
+    
+    [rightButtonArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        UIButton *button = obj;
+        CGRect frame = button.frame;
+        if (iphoneX) {
+            frame.origin = CGPointMake(ScreenWidth- kNumFrom375(frame.size.width) - kNumFrom375(idx*40) - kNumFrom375(idx*10), kNumFrom375(28+22));
+        }else {
+            frame.origin = CGPointMake(ScreenWidth- kNumFrom375(frame.size.width) - kNumFrom375(idx*40) - kNumFrom375(idx*10) - kNumFrom375(10), kNumFrom375(28));
+        }
+        
+        button.frame = frame;
+        [self addSubview:button];
+    }];
+}
+
+
+
+
+@end

+ 15 - 0
Jianbinglian/Base(基类)/BaseNavigationController/CustomNavigationController.h

@@ -0,0 +1,15 @@
+//
+//  CustomNavigationController.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface CustomNavigationController : UINavigationController
+
+// 是否可右滑返回
+- (void)navigationCanDragBack:(BOOL)bCanDragBack;
+
+@end

+ 42 - 0
Jianbinglian/Base(基类)/BaseNavigationController/CustomNavigationController.m

@@ -0,0 +1,42 @@
+//
+//  CustomNavigationController.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "CustomNavigationController.h"
+
+@implementation CustomNavigationController
+
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
+
+    }
+    return self;
+}
+
+
+- (void)viewDidLoad{
+    [super viewDidLoad];
+ 
+    [self setNavigationBarHidden:NO];       // 使导航条有效
+    [self.navigationBar setHidden:YES];     // 隐藏导航条,但由于导航条有效,系统的返回按钮页有效,所以可以使用系统的右滑返回手势。
+    [self.navigationBar setBarTintColor:[UIColor whiteColor]];
+  
+}
+
+- (void)didReceiveMemoryWarning{
+    [super didReceiveMemoryWarning];
+}
+
+// 是否可右滑返回
+- (void)navigationCanDragBack:(BOOL)bCanDragBack{
+	self.interactivePopGestureRecognizer.enabled = bCanDragBack;
+}
+
+
+@end

+ 17 - 0
Jianbinglian/Base(基类)/BaseRootController/MTRootController.h

@@ -0,0 +1,17 @@
+//
+//  MTRootController.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "RDVTabBarController.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTRootController : RDVTabBarController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 66 - 0
Jianbinglian/Base(基类)/BaseRootController/MTRootController.m

@@ -0,0 +1,66 @@
+//
+//  MTRootController.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTRootController.h"
+#import "RDVTabBarController.h"
+#import "RDVTabBarItem.h"
+
+#import "MTMyViewController.h"
+@interface MTRootController ()
+
+@end
+
+@implementation MTRootController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    [self setupViewControllers];
+}
+#pragma mark - Methods
+
+- (void)setupViewControllers {
+    
+    MTMyViewController *meVC = [MTMyViewController new];
+
+    [self setViewControllers:@[meVC]];
+    
+    [self customizeTabBarForController];
+}
+
+- (void)customizeTabBarForController {
+    
+    NSArray *tabbarTitles = @[@"消息",@"通讯录",@"工作",@"我的"];
+
+    NSArray *tabBarItemImages = @[
+                                  @"tabbar_home",
+                                  @"tabbar_order",
+                                  @"tabbar_shop",
+                                  @"tabbar_me"
+                                  ];
+
+    NSInteger index = 0;
+    for (RDVTabBarItem *item in [[self tabBar] items]) {
+
+        UIImage *selectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_selected",
+                                                      [tabBarItemImages objectAtIndex:index]]];
+        UIImage *unselectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@",
+                                                        [tabBarItemImages objectAtIndex:index]]];
+        [item setFinishedSelectedImage:selectedimage withFinishedUnselectedImage:unselectedimage];
+        [item setSelectedTitleAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12], NSForegroundColorAttributeName : HColor(@"#0079FE")}];
+        [item setUnselectedTitleAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12], NSForegroundColorAttributeName : HColor(@"#808080")}];
+        
+        item.titlePositionAdjustment = UIOffsetMake(0,3);
+        item.imagePositionAdjustment = UIOffsetMake(0,0);
+        
+        item.title = tabbarTitles[index];
+        index++;
+    }
+}
+
+
+
+@end

+ 16 - 0
Jianbinglian/Base(基类)/BaseTableView/MTBaseTableView.h

@@ -0,0 +1,16 @@
+//
+//  MTBaseTableView.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseTableView : UITableView
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 29 - 0
Jianbinglian/Base(基类)/BaseTableView/MTBaseTableView.m

@@ -0,0 +1,29 @@
+//
+//  MTBaseTableView.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseTableView.h"
+
+@implementation MTBaseTableView
+- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style{
+    self = [super initWithFrame:frame style:style];
+    if (self) {
+        if (@available(iOS 11.0, *)) {
+            self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+        } else {
+            // Fallback on earlier versions
+        }
+        self.showsVerticalScrollIndicator = NO;
+        self.separatorStyle = UITableViewCellSeparatorStyleNone;
+        self.backgroundColor = [UIColor backGroundGrayColor];
+        self.contentInset = UIEdgeInsetsMake(0, 0, kNumFrom375(50), 0);
+    }
+    return self;
+}
+
+
+
+@end

+ 16 - 0
Jianbinglian/Base(基类)/BaseTableViewCell/MTBaseTableViewCell.h

@@ -0,0 +1,16 @@
+//
+//  MTBaseTableViewCell.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseTableViewCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 25 - 0
Jianbinglian/Base(基类)/BaseTableViewCell/MTBaseTableViewCell.m

@@ -0,0 +1,25 @@
+//
+//  MTBaseTableViewCell.m
+// 
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseTableViewCell.h"
+
+@implementation MTBaseTableViewCell
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
+    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]){
+        self.selectionStyle = UITableViewCellSelectionStyleNone;
+    };
+    return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 17 - 0
Jianbinglian/Base(基类)/BaseTextField/MTBaseTextField.h

@@ -0,0 +1,17 @@
+//
+//  MTBaseTextField.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseTextField : UITextField
+//UITextField
++(MTBaseTextField *)textFieldWithFrame:(CGRect)rect placeholder:(NSString *)placeholder secureTextEntry:(BOOL)bool1 textColor:(UIColor *)color1 backGroundColor:(UIColor *)color2 font:(UIFont *)font;
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
Jianbinglian/Base(基类)/BaseTextField/MTBaseTextField.m

@@ -0,0 +1,24 @@
+//
+//  MTBaseTextField.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseTextField.h"
+
+@implementation MTBaseTextField
+//UITextField方法实现
++(MTBaseTextField *)textFieldWithFrame:(CGRect)rect placeholder:(NSString *)placeholder secureTextEntry:(BOOL)bool1 textColor:(UIColor *)color1 backGroundColor:(UIColor *)color2 font:(UIFont *)font
+{
+    MTBaseTextField *tf = [[MTBaseTextField alloc]init];
+    tf.frame = rect;
+    tf.backgroundColor = color2;
+    tf.placeholder = placeholder;
+    tf.secureTextEntry =bool1;
+    tf.textColor = color1;
+    tf.font = font;
+    return tf;
+    
+}
+@end

+ 19 - 0
Jianbinglian/Base(基类)/BaseView/MTBaseView.h

@@ -0,0 +1,19 @@
+//
+//  MTBaseView.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseView : UIView
+- (instancetype)initWithViewModel:(id)viewModel;
+-(void)bindViewModel;
+-(void)makeSubViews;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 28 - 0
Jianbinglian/Base(基类)/BaseView/MTBaseView.m

@@ -0,0 +1,28 @@
+//
+//  MTBaseView.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseView.h"
+
+@implementation MTBaseView
+
+- (instancetype)initWithFrame:(CGRect)frame{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self bindViewModel];
+        [self makeSubViews];
+    }
+    return self;
+}
+- (instancetype)initWithViewModel:(id)viewModel {
+    self = [super init];
+    if (self) {
+    }
+    return self;
+}
+- (void)bindViewModel{}
+-(void)makeSubViews{}
+@end

+ 22 - 0
Jianbinglian/Base(基类)/BaseViewModel/MTBaseViewModel.h

@@ -0,0 +1,22 @@
+//
+//  MTBaseViewModel.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "MTHttpTool.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MTBaseViewModel : NSObject
+@property (nonatomic, strong) RACSubject *refreshUISubject; /**< 刷新数据 */
+@property (nonatomic, strong) RACSubject *errorSubject; /**< 请求错误 */
+// 成功
+typedef void (^ViewModelSuccessBlock)(id data, NSString *successInfo);
+// 失败
+typedef void (^ViewModelFailureBlock)(NSString *errorInfo);
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
Jianbinglian/Base(基类)/BaseViewModel/MTBaseViewModel.m

@@ -0,0 +1,26 @@
+//
+//  MTBaseViewModel.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "MTBaseViewModel.h"
+
+@implementation MTBaseViewModel
+
+
+-  (RACSubject *)refreshUISubject {
+    if (!_refreshUISubject) {
+        _refreshUISubject = [RACSubject subject];
+    }
+    return _refreshUISubject;
+}
+
+- (RACSubject *)errorSubject {
+    if (!_errorSubject) {
+        _errorSubject = [RACSubject subject];
+    }
+    return _errorSubject;
+}
+@end

+ 16 - 0
Jianbinglian/Category(分类扩展)/NSLayoutConstraint+MT.h

@@ -0,0 +1,16 @@
+//
+//  NSLayoutConstraint+MT.h
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/19.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSLayoutConstraint (MT)
+@end
+
+NS_ASSUME_NONNULL_END

+ 33 - 0
Jianbinglian/Category(分类扩展)/NSLayoutConstraint+MT.m

@@ -0,0 +1,33 @@
+//
+//  NSLayoutConstraint+MT.m
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/19.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "NSLayoutConstraint+MT.h"
+#import <objc/runtime.h>
+
+@implementation NSLayoutConstraint (MT)
+
++ (void)load{
+    
+    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
+    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
+    method_exchangeImplementations(imp, myImp);
+}
+
+- (id)myInitWithCoder:(NSCoder*)aDecode
+{
+    [self myInitWithCoder:aDecode];
+    if (self){
+        if(![self.identifier isEqualToString:@"1314"])    //只对符合条件的约束进行适配
+        {
+            self.constant = kNumFrom375(self.constant);
+        } 
+    }
+    return self;
+}
+
+@end

+ 27 - 0
Jianbinglian/Category(分类扩展)/NSString+MT.h

@@ -0,0 +1,27 @@
+//
+//  NSString+MT.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSString (MT)
+
+/**
+ *  URLEncode
+ */
+- (NSString *)URLEncodedString;
+
+/**
+ *  URLDecode
+ */
+-(NSString *)URLDecodedString;
+
+-(CGFloat)computeStringHeight;
+@end
+
+NS_ASSUME_NONNULL_END

+ 35 - 0
Jianbinglian/Category(分类扩展)/NSString+MT.m

@@ -0,0 +1,35 @@
+//
+//  NSString+MT.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "NSString+MT.h"
+
+@implementation NSString (MT)
+/**
+ *  URLEncode
+ */
+- (NSString *)URLEncodedString
+{
+    // CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
+    // CharactersToLeaveUnescaped = @"[].";
+    NSString * charaters = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
+    NSCharacterSet * set = [[NSCharacterSet characterSetWithCharactersInString:charaters] invertedSet];
+   return [self stringByAddingPercentEncodingWithAllowedCharacters:set];
+    
+    
+}
+
+/**
+ *  URLDecode
+ */
+-(NSString *)URLDecodedString
+{
+    return [self stringByRemovingPercentEncoding];
+}
+- (CGFloat)computeStringHeight{
+    return [self boundingRectWithSize:CGSizeMake(ScreenWidth - kNumFrom375(30), 99999) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:kNumFrom375(14)]} context:nil].size.height+2;
+}
+@end

+ 17 - 0
Jianbinglian/Category(分类扩展)/UIButton+MT.h

@@ -0,0 +1,17 @@
+//
+//  UIButton+MT.h
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UIButton (MT)
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
Jianbinglian/Category(分类扩展)/UIButton+MT.m

@@ -0,0 +1,26 @@
+//
+//  UIButton+MT.m
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UIButton+MT.h"
+#import <objc/runtime.h>
+
+@implementation UIButton (MT)
+
++(void)load{
+    Method method1 = class_getInstanceMethod([self class], @selector(initWithCoder:));
+    Method method2 = class_getInstanceMethod([self class], @selector(adapterInitWithCode:));
+    method_exchangeImplementations(method1, method2);
+}
+-(instancetype)adapterInitWithCode:(NSCoder *)aDecoder{
+    [self adapterInitWithCode:aDecoder];
+    if (self) {
+        self.titleLabel.font = [UIFont systemFontOfSize:kNumFrom375(self.titleLabel.font.pointSize)];
+    }
+    return self;
+}
+@end

+ 20 - 0
Jianbinglian/Category(分类扩展)/UIColor+MT.h

@@ -0,0 +1,20 @@
+//
+//  UIColor+Mt.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UIColor (MT)
+
++ (UIColor *) pinkColor;
++ (UIColor *) backGroundGrayColor;
++ (UIColor *) randomColor;
++ (UIColor *) mt_colorWithHexString: (NSString *)color;
+@end
+
+NS_ASSUME_NONNULL_END

+ 68 - 0
Jianbinglian/Category(分类扩展)/UIColor+MT.m

@@ -0,0 +1,68 @@
+//
+//  UIColor+MT.m
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UIColor+MT.h"
+
+@implementation UIColor (MT)
+
++ (UIColor *) pinkColor
+{
+    return [UIColor mt_colorWithHexString:@"#F9AFBD"];
+}
+
++ (UIColor *) backGroundGrayColor
+{
+    return [UIColor mt_colorWithHexString:@"#f4f8fb"];
+}
++ (UIColor *) randomColor
+{
+    return [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1.0];
+}
+
+#pragma mark - 设置16进制颜色的方法
++ (UIColor *) mt_colorWithHexString: (NSString *)color
+{
+    NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
+    
+    // String should be 6 or 8 characters
+    if ([cString length] < 6) {
+        return [UIColor clearColor];
+    }
+    
+    // strip 0X if it appears
+    if ([cString hasPrefix:@"0X"])
+        cString = [cString substringFromIndex:2];
+    if ([cString hasPrefix:@"#"])
+        cString = [cString substringFromIndex:1];
+    if ([cString length] != 6)
+        return [UIColor clearColor];
+    
+    // Separate into r, g, b substrings
+    NSRange range;
+    range.location = 0;
+    range.length = 2;
+    
+    //r
+    NSString *rString = [cString substringWithRange:range];
+    
+    //g
+    range.location = 2;
+    NSString *gString = [cString substringWithRange:range];
+    
+    //b
+    range.location = 4;
+    NSString *bString = [cString substringWithRange:range];
+    
+    // Scan values
+    unsigned int r, g, b;
+    [[NSScanner scannerWithString:rString] scanHexInt:&r];
+    [[NSScanner scannerWithString:gString] scanHexInt:&g];
+    [[NSScanner scannerWithString:bString] scanHexInt:&b];
+    
+    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:1.0f];
+}
+@end

+ 18 - 0
Jianbinglian/Category(分类扩展)/UIImage+MT.h

@@ -0,0 +1,18 @@
+//
+//  UIImage+MT.h
+//  ADuTechnology
+//
+//  Created by Simon on 2019/9/28.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UIImage (MT)
+//压缩图片
+- (NSData *)compressQualityWithMaxLength:(NSInteger)maxLength;
+@end
+
+NS_ASSUME_NONNULL_END

+ 32 - 0
Jianbinglian/Category(分类扩展)/UIImage+MT.m

@@ -0,0 +1,32 @@
+//
+//  UIImage+MT.m
+//  ADuTechnology
+//
+//  Created by Simon on 2019/9/28.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UIImage+MT.h"
+
+@implementation UIImage (MT)
+//压缩图片
+- (NSData *)compressQualityWithMaxLength:(NSInteger)maxLength {
+    CGFloat compression = 1;
+    NSData *data = UIImageJPEGRepresentation(self, compression);
+    if (data.length < maxLength) return data;
+    CGFloat max = 1;
+    CGFloat min = 0;
+    for (int i = 0; i < 12; ++i) {
+        compression = (max + min) / 2;
+        data = UIImageJPEGRepresentation(self, compression);
+        if (data.length < maxLength * 0.9) {
+            min = compression;
+        } else if (data.length > maxLength) {
+            max = compression;
+        } else {
+            break;
+        }
+    }
+    return data;
+}
+@end

+ 16 - 0
Jianbinglian/Category(分类扩展)/UIImage+getSize.h

@@ -0,0 +1,16 @@
+//
+//  UIImage+getSize.h
+//  LiDa
+//
+//  Created by LF on 2017/7/31.
+//  Copyright © 2017年 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+/**
+ 获取图片尺寸
+ */
+@interface UIImage (getSize)
++(CGSize )getImageSizeWithUrl:(id)imageURL;
+@end

+ 178 - 0
Jianbinglian/Category(分类扩展)/UIImage+getSize.m

@@ -0,0 +1,178 @@
+//
+//  UIImage+getSize.m
+//  LiDa
+//
+//  Created by LF on 2017/7/31.
+//  Copyright © 2017年 Simon. All rights reserved.
+//
+
+#import "UIImage+getSize.h"
+#import <ImageIO/ImageIO.h>
+@implementation UIImage (getSize)
+
+// 根据图片url获取图片尺寸
++(CGSize )getImageSizeWithUrl:(id)imageURL {
+    NSURL * url = nil;
+    if ([imageURL isKindOfClass:[NSURL class]]) {
+        url = imageURL;
+    }
+    if ([imageURL isKindOfClass:[NSString class]]) {
+        url = [NSURL URLWithString:imageURL];
+    }
+    if (!imageURL) {
+        return CGSizeZero;
+    }
+
+    CGImageSourceRef imageSourceRef =     CGImageSourceCreateWithURL((CFURLRef)url, NULL);
+    CGFloat width = 0, height = 0;
+    if (imageSourceRef) {
+        CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
+        if (imageProperties != NULL) {
+            CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
+            if (widthNumberRef != NULL) {
+                CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
+            }
+            CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
+            if (heightNumberRef != NULL) {
+                CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
+            }
+            CFRelease(imageProperties);
+        }
+        CFRelease(imageSourceRef);
+    }
+    return CGSizeMake(width, height);
+//    NSURL* URL = nil;
+//    if([imageURL isKindOfClass:[NSURL class]]) {
+//        URL = imageURL;
+//    }
+//    if([imageURL isKindOfClass:[NSString class]]) {
+//        URL = [NSURL URLWithString:imageURL];
+//    }
+//    if(URL == nil) {
+//        // url不正确返回CGSizeZero
+//        return CGSizeZero;
+//    }
+//    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
+//    NSString* pathExtendsion = [URL.pathExtension lowercaseString];
+//
+//    CGSize size = CGSizeZero;
+//    if([pathExtendsion isEqualToString:@"png"]) {
+//        size =  [self getPNGImageSizeWithRequest:request];
+//    }
+//    else if([pathExtendsion isEqual:@"gif"])
+//    {
+//        size =  [self getGIFImageSizeWithRequest:request];
+//    }
+//    else{
+//        size = [self getJPGImageSizeWithRequest:request];
+//    }
+//    if(CGSizeEqualToSize(CGSizeZero, size)) {
+//
+//        // 如果获取文件头信息失败,发送异步请求请求原图
+//
+//        NSData* data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:nil error:nil];
+//        UIImage* image = [UIImage imageWithData:data];
+//        if(image) {
+//            size = image.size;
+//        }
+//    }
+//    return size;
+}
+
+//  获取PNG图片的大小
++(CGSize)getPNGImageSizeWithRequest:(NSMutableURLRequest*)request
+{
+    [request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];
+    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
+    if(data.length == 8)
+    {
+        int w1 = 0, w2 = 0, w3 = 0, w4 = 0;
+        [data getBytes:&w1 range:NSMakeRange(0, 1)];
+        [data getBytes:&w2 range:NSMakeRange(1, 1)];
+        [data getBytes:&w3 range:NSMakeRange(2, 1)];
+        [data getBytes:&w4 range:NSMakeRange(3, 1)];
+        int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;
+        int h1 = 0, h2 = 0, h3 = 0, h4 = 0;
+        [data getBytes:&h1 range:NSMakeRange(4, 1)];
+        [data getBytes:&h2 range:NSMakeRange(5, 1)];
+        [data getBytes:&h3 range:NSMakeRange(6, 1)];
+        [data getBytes:&h4 range:NSMakeRange(7, 1)];
+        int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;
+        return CGSizeMake(w, h);
+    }
+    return CGSizeZero;
+}
+
+//  获取gif图片的大小
++(CGSize)getGIFImageSizeWithRequest:(NSMutableURLRequest*)request
+{
+    [request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];
+    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
+    if(data.length == 4)
+    {
+        short w1 = 0, w2 = 0;
+        [data getBytes:&w1 range:NSMakeRange(0, 1)];
+        [data getBytes:&w2 range:NSMakeRange(1, 1)];
+        short w = w1 + (w2 << 8);
+        short h1 = 0, h2 = 0;
+        [data getBytes:&h1 range:NSMakeRange(2, 1)];
+        [data getBytes:&h2 range:NSMakeRange(3, 1)];
+        short h = h1 + (h2 << 8);
+        return CGSizeMake(w, h);
+    }
+    return CGSizeZero;
+}
+
+//  获取jpg图片的大小
++(CGSize)getJPGImageSizeWithRequest:(NSMutableURLRequest*)request
+{
+    [request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];
+    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
+    
+    if ([data length] <= 0x58) {
+        return CGSizeZero;
+    }
+    
+    if ([data length] < 210) {// 肯定只有一个DQT字段
+        short w1 = 0, w2 = 0;
+        [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
+        [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
+        short w = (w1 << 8) + w2;
+        short h1 = 0, h2 = 0;
+        [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
+        [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
+        short h = (h1 << 8) + h2;
+        return CGSizeMake(w, h);
+    } else {
+        short word = 0x0;
+        [data getBytes:&word range:NSMakeRange(0x15, 0x1)];
+        if (word == 0xdb) {
+            [data getBytes:&word range:NSMakeRange(0x5a, 0x1)];
+            if (word == 0xdb) {// 两个DQT字段
+                short w1 = 0, w2 = 0;
+                [data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];
+                [data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];
+                short w = (w1 << 8) + w2;
+                short h1 = 0, h2 = 0;
+                [data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];
+                [data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];
+                short h = (h1 << 8) + h2;
+                return CGSizeMake(w, h);
+            } else {// 一个DQT字段
+                short w1 = 0, w2 = 0;
+                [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
+                [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
+                short w = (w1 << 8) + w2;
+                short h1 = 0, h2 = 0;
+                [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
+                [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
+                short h = (h1 << 8) + h2;
+                return CGSizeMake(w, h);
+            }
+        } else {
+            return CGSizeZero;
+        }
+    }
+}
+
+@end

+ 25 - 0
Jianbinglian/Category(分类扩展)/UIImageView+MT.h

@@ -0,0 +1,25 @@
+//
+//  UIImageView+MT.h
+//  Demo
+//
+//  Created by Simon on 2019/8/17.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UIImageView (MT)
+
+#pragma mark -- 获取网络图片大小
+
+-(void)showInMiddle;
+/**
+ 根据URL获取图片大小
+
+ @param URL url/string
+ @return 大小
+ */
+-(CGSize)getImageSizeWithURL:(id)URL;
+@end
+
+

+ 94 - 0
Jianbinglian/Category(分类扩展)/UIImageView+MT.m

@@ -0,0 +1,94 @@
+//
+//  UIImageView+MT.m
+//  Demo
+//
+//  Created by Simon on 2019/8/17.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UIImageView+MT.h"
+
+@implementation UIImageView (MT)
+- (void)showInMiddle
+{
+    [self setContentScaleFactor:[[UIScreen mainScreen] scale]];
+    self.contentMode =  UIViewContentModeScaleAspectFill;
+    self.autoresizingMask = UIViewAutoresizingFlexibleHeight;
+    self.clipsToBounds  = YES;
+    self.layer.masksToBounds = YES;
+}
+#pragma mark -- 获取网络图片大小
+/**
+ *  根据图片url获取网络图片尺寸
+ */
+-(CGSize)getImageSizeWithURL:(id)URL{
+    NSURL * url = nil;
+    if ([URL isKindOfClass:[NSURL class]]) {
+        url = URL;
+    }
+    if ([URL isKindOfClass:[NSString class]]) {
+        url = [NSURL URLWithString:URL];
+    }
+    if (!URL) {
+        return CGSizeZero;
+    }
+    CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
+    CGFloat width = 0, height = 0;
+    
+    if (imageSourceRef) {
+        
+        // 获取图像属性
+        CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
+        
+        //以下是对手机32位、64位的处理
+        if (imageProperties != NULL) {
+            
+            CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
+            
+#if defined(__LP64__) && __LP64__
+            if (widthNumberRef != NULL) {
+                CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
+            }
+            
+            CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
+            
+            if (heightNumberRef != NULL) {
+                CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
+            }
+#else
+            if (widthNumberRef != NULL) {
+                CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);
+            }
+            
+            CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
+            
+            if (heightNumberRef != NULL) {
+                CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);
+            }
+#endif
+            /***************** 此处解决返回图片宽高相反问题 *****************/
+            // 图像旋转的方向属性
+            NSInteger orientation = [(__bridge NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyOrientation) integerValue];
+            CGFloat temp = 0;
+            switch (orientation) {  // 如果图像的方向不是正的,则宽高互换
+                case UIImageOrientationLeft: // 向左逆时针旋转90度
+                case UIImageOrientationRight: // 向右顺时针旋转90度
+                case UIImageOrientationLeftMirrored: // 在水平翻转之后向左逆时针旋转90度
+                case UIImageOrientationRightMirrored: { // 在水平翻转之后向右顺时针旋转90度
+                    temp = width;
+                    width = height;
+                    height = temp;
+                }
+                    break;
+                default:
+                    break;
+            }
+            /***************** 此处解决返回图片宽高相反问题 *****************/
+            
+            CFRelease(imageProperties);
+        }
+        CFRelease(imageSourceRef);
+    }
+    return CGSizeMake(width, height);
+}
+@end

+ 17 - 0
Jianbinglian/Category(分类扩展)/UILabel+MT.h

@@ -0,0 +1,17 @@
+//
+//  UILabel+MT.h
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UILabel (MT)
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
Jianbinglian/Category(分类扩展)/UILabel+MT.m

@@ -0,0 +1,26 @@
+//
+//  UILabel+MT.m
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UILabel+MT.h"
+#import <objc/runtime.h>
+
+@implementation UILabel (MT)
+
++(void)load{
+    Method method1 = class_getInstanceMethod([self class], @selector(initWithCoder:));
+    Method method2 = class_getInstanceMethod([self class], @selector(adapterInitWithCode:));
+    method_exchangeImplementations(method1, method2);
+}
+-(instancetype)adapterInitWithCode:(NSCoder *)aDecoder{
+    [self adapterInitWithCode:aDecoder];
+    if (self) {
+        self.font = [UIFont systemFontOfSize:kNumFrom375(self.font.pointSize)];
+    }
+    return self;
+}
+@end

+ 17 - 0
Jianbinglian/Category(分类扩展)/UITextField+MT.h

@@ -0,0 +1,17 @@
+//
+//  UITextField+MT.h
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UITextField (MT)
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 25 - 0
Jianbinglian/Category(分类扩展)/UITextField+MT.m

@@ -0,0 +1,25 @@
+//
+//  UITextField+MT.m
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UITextField+MT.h"
+#import <objc/runtime.h>
+
+@implementation UITextField (MT)
++(void)load{
+    Method method1 = class_getInstanceMethod([self class], @selector(initWithCoder:));
+    Method method2 = class_getInstanceMethod([self class], @selector(adapterInitWithCode:));
+    method_exchangeImplementations(method1, method2);
+}
+-(instancetype)adapterInitWithCode:(NSCoder *)aDecoder{
+    [self adapterInitWithCode:aDecoder];
+    if (self) {
+        self.font = [UIFont systemFontOfSize:kNumFrom375(self.font.pointSize)];
+    }
+    return self;
+}
+@end

+ 17 - 0
Jianbinglian/Category(分类扩展)/UITextView+MT.h

@@ -0,0 +1,17 @@
+//
+//  UITextView+MT.h
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UITextView (MT)
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
Jianbinglian/Category(分类扩展)/UITextView+MT.m

@@ -0,0 +1,26 @@
+//
+//  UITextView+MT.m
+//  SeafoodAccount
+//
+//  Created by Simon on 2019/8/20.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import "UITextView+MT.h"
+#import <objc/runtime.h>
+
+@implementation UITextView (MT)
+
++(void)load{
+    Method method1 = class_getInstanceMethod([self class], @selector(initWithCoder:));
+    Method method2 = class_getInstanceMethod([self class], @selector(adapterInitWithCode:));
+    method_exchangeImplementations(method1, method2);
+}
+-(instancetype)adapterInitWithCode:(NSCoder *)aDecoder{
+    [self adapterInitWithCode:aDecoder];
+    if (self) {
+        self.font = [UIFont systemFontOfSize:kNumFrom375(self.font.pointSize)];
+    }
+    return self;
+}
+@end

+ 61 - 0
Jianbinglian/Category(分类扩展)/UIView+MT.h

@@ -0,0 +1,61 @@
+//
+//  UIView+MT.h
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UIView (MT)
+
+
+//类别可以拓展属性,但是不能生成set和get方法
+@property (assign, nonatomic) CGFloat mt_x;
+@property (assign, nonatomic) CGFloat mt_y;
+@property (assign, nonatomic) CGFloat mt_width;
+@property (assign, nonatomic) CGFloat mt_height;
+@property (assign, nonatomic) CGSize mt_size;
+@property (assign, nonatomic) CGPoint mt_origin;
+
+// 圆角
+- (void) mt_yuanjiao:(CGFloat)radius;
+
+// 边框
+- (void) mt_biankuang:(CGFloat) width color:(UIColor *)color;
+
+// 关闭用户响应
+- (void) mt_closeUserInteractionOfSubViews;
+
+// 打开用户响应
+- (void) mt_openUserInteractionOfSubViews;
+
+// 隐藏
+- (void) mt_hideAllSubViews;
+
+// 展示
+- (void) mt_showAllSubViews;
+
+// 删除
+- (void) mt_removeAllSubViews;
+
+//部分圆角
+- (void)addRoundedCorners:(UIRectCorner)corners
+                withRadii:(CGSize)radii
+                 viewRect:(CGRect)rect;
+/// 阴影
+/// @param shadowColor 阴影颜色
+/// @param shadowOffset 阴影偏移量(-x,-x)左上阴影  (0,0)全阴影  (x,x)右下阴影
+/// @param shadowOpacity 阴影透明度
+/// @param shadowRadius 阴影半径
+/// @param cornerRadius 圆角
+-(void)mt_shadowWithShadowColor:(UIColor *)shadowColor
+                andShadowOffset:(CGSize)shadowOffset
+               andShadowOpacity:(float )shadowOpacity
+                andShadowRadius:(float)shadowRadius
+                andCornerRadius:(float)cornerRadius;
+@end
+
+NS_ASSUME_NONNULL_END

+ 155 - 0
Jianbinglian/Category(分类扩展)/UIView+MT.m

@@ -0,0 +1,155 @@
+//
+//  UIView+MT.m
+//
+//
+//  Created by Simon on 2019/3/22.
+//  Copyright © 2019 Simon. All rights reserved.
+
+#import "UIView+MT.h"
+
+@implementation UIView (MT)
+
+
+#pragma mark -- mt_Frame
+#pragma mark - adjust_x
+-(void)setMt_x:(CGFloat)mt_x{
+    CGRect frame = self.frame;
+    frame.origin.x = mt_x;
+    self.frame = frame;
+}
+-(CGFloat)mt_x{
+    return self.frame.origin.x;
+}
+
+#pragma mark - adjust_y
+-(void)setMt_y:(CGFloat)mt_y{
+    CGRect frame = self.frame;
+    frame.origin.y = mt_y;
+    self.frame = frame;
+}
+-(CGFloat)mt_y{
+    return self.frame.origin.y;
+}
+
+#pragma mark - adjust_width
+-(void)setMt_width:(CGFloat)mt_width{
+    CGRect frame = self.frame;
+    frame.size.width = mt_width;
+    self.frame = frame;
+}
+-(CGFloat)mt_width{
+    return self.frame.size.width;
+}
+
+#pragma mark - adjust_height
+- (void)setMt_height:(CGFloat)mt_height{
+    CGRect frame = self.frame;
+    frame.size.height = mt_height;
+    self.frame = frame;
+}
+- (CGFloat)mt_height{
+    return self.frame.size.height;
+}
+
+#pragma mark - adjust_size
+-(void)setMt_size:(CGSize)mt_size{
+    CGRect frame = self.frame;
+    frame.size = mt_size;
+    self.frame = frame;
+}
+- (CGSize)mt_size{
+    return self.frame.size;
+}
+
+#pragma mark - adjust_origin
+-(void)setMt_origin:(CGPoint)mt_origin{
+    CGRect frame = self.frame;
+    frame.origin = mt_origin;
+    self.frame = frame;
+}
+- (CGPoint)mt_origin{
+    return self.frame.origin;
+}
+
+
+#pragma mark - view本身
+- (void) mt_yuanjiao:(CGFloat)radius
+{
+    self.layer.masksToBounds = YES;
+    self.layer.cornerRadius = radius;
+}
+
+- (void) mt_biankuang:(CGFloat) width color:(UIColor *)color
+{
+    self.layer.borderWidth = width;
+    self.layer.borderColor = color.CGColor;
+}
+
+#pragma mark - 针对子view
+- (void) mt_closeUserInteractionOfSubViews {
+    self.userInteractionEnabled = NO;
+    for (UIView *sbV in self.subviews) {
+        sbV.userInteractionEnabled = NO;
+    }
+}
+
+- (void) mt_openUserInteractionOfSubViews {
+    self.userInteractionEnabled = YES;
+    for (UIView *sbV in self.subviews) {
+        sbV.userInteractionEnabled = YES;
+    }
+}
+
+- (void) mt_hideAllSubViews
+{
+    for (UIView *view in self.subviews) {
+        view.hidden = YES;
+    }
+}
+
+- (void) mt_showAllSubViews
+{
+    for (UIView *view in self.subviews) {
+        view.hidden = NO;
+    }
+}
+
+// 删除
+- (void) mt_removeAllSubViews
+{
+    for (UIView *view in self.subviews) {
+        [view removeFromSuperview];
+    }
+}
+
+/**
+ *  设置部分圆角(相对布局)
+ *
+ *  @param corners 需要设置为圆角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
+ *  @param radii   需要设置的圆角大小 例如 CGSizeMake(20.0f, 20.0f)
+ *  @param rect    需要设置的圆角view的rect
+ */
+- (void)addRoundedCorners:(UIRectCorner)corners
+                withRadii:(CGSize)radii
+                 viewRect:(CGRect)rect {
+    
+    UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
+    CAShapeLayer* shape = [[CAShapeLayer alloc] init];
+    [shape setPath:rounded.CGPath];
+    
+    self.layer.mask = shape;
+}
+-(void)mt_shadowWithShadowColor:(UIColor *)shadowColor
+                andShadowOffset:(CGSize)shadowOffset
+               andShadowOpacity:(float)shadowOpacity
+                andShadowRadius:(float)shadowRadius
+                andCornerRadius:(float)cornerRadius{
+    self.layer.shadowColor = shadowColor.CGColor;
+    self.layer.shadowOffset = shadowOffset;
+    self.layer.shadowOpacity = shadowOpacity;//透明度
+    self.layer.shadowRadius = shadowRadius;
+    self.layer.cornerRadius = cornerRadius;
+    self.layer.masksToBounds = YES;
+    self.clipsToBounds = NO;
+}
+@end

+ 29 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVFoodPieModel.h

@@ -0,0 +1,29 @@
+//
+//  DVFoodPieModel.h
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/27.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+@interface DVFoodPieModel : NSObject
+
+/**
+ 名称
+ */
+@property (copy, nonatomic) NSString *name;
+
+/**
+ 数值
+ */
+@property (assign, nonatomic) CGFloat value;
+
+/**
+ 比例
+ */
+@property (assign, nonatomic) CGFloat rate;
+
+@end

+ 13 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVFoodPieModel.m

@@ -0,0 +1,13 @@
+//
+//  DVFoodPieModel.m
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/27.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import "DVFoodPieModel.h"
+
+@implementation DVFoodPieModel
+
+@end

+ 17 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieCenterView.h

@@ -0,0 +1,17 @@
+//
+//  DVPieCenterView.h
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/27.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface DVPieCenterView : UIView
+
+
+@property (strong, nonatomic) UILabel *nameLabel;
+
+
+@end

+ 69 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieCenterView.m

@@ -0,0 +1,69 @@
+//
+//  DVPieCenterView.m
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/27.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import "DVPieCenterView.h"
+
+@interface DVPieCenterView ()
+
+@property (strong, nonatomic) UIView *centerView;
+
+@end
+
+
+
+@implementation DVPieCenterView
+
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    
+    if (self = [super initWithFrame:frame]) {
+        
+        self.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.4];
+        
+        
+        
+        UIView *centerView = [[UIView alloc] init];
+        
+        centerView.backgroundColor = [UIColor whiteColor];
+        
+        [self addSubview:centerView];
+        self.centerView = centerView;
+        
+        
+        UILabel *nameLabel = [[UILabel alloc] init];
+        nameLabel.textColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1];
+        nameLabel.font = [UIFont systemFontOfSize:18];
+        
+        nameLabel.textAlignment = NSTextAlignmentCenter;
+        
+        self.nameLabel = nameLabel;
+        
+        
+        [centerView addSubview:nameLabel];
+    }
+    
+    return self;
+}
+
+
+- (void)layoutSubviews {
+    
+    [super layoutSubviews];
+    
+    self.layer.cornerRadius = self.frame.size.width * 0.5;
+    self.layer.masksToBounds = true;
+    
+    self.centerView.frame = CGRectMake(6, 6, self.frame.size.width - 6 * 2, self.frame.size.height - 6 * 2);
+    self.centerView.layer.cornerRadius = self.centerView.frame.size.width * 0.5;
+    self.centerView.layer.masksToBounds = true;
+    
+    self.nameLabel.frame = self.centerView.bounds;
+}
+
+
+@end

+ 28 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieChart.h

@@ -0,0 +1,28 @@
+//
+//  DVPieChart.h
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/26.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface DVPieChart : UIView
+
+/**
+ 数据数组
+ */
+@property (strong, nonatomic) NSArray *dataArray;
+
+/**
+ 标题
+ */
+@property (copy, nonatomic) NSString *title;
+
+/**
+ 绘制方法
+ */
+- (void)draw;
+
+@end

+ 465 - 0
Jianbinglian/Lib(第三方库)/DVDishPieHeader(饼状图)/DVPieChart.m

@@ -0,0 +1,465 @@
+//
+//  DVPieChart.m
+//  DVPieChart
+//
+//  Created by SmithDavid on 2018/2/26.
+//  Copyright © 2018年 SmithDavid. All rights reserved.
+//
+
+#import "DVPieChart.h"
+#import "DVFoodPieModel.h"
+#import "DVPieCenterView.h"
+
+#define COLOR_ARRAY @[\
+[UIColor colorWithRed:251/255.0 green:166.9/255.0 blue:96.5/255.0 alpha:1],\
+[UIColor colorWithRed:151.9/255.0 green:188/255.0 blue:95.8/255.0 alpha:1],\
+[UIColor colorWithRed:245/255.0 green:94/255.0 blue:102/255.0 alpha:1],\
+[UIColor colorWithRed:29/255.0 green:140/255.0 blue:140/255.0 alpha:1],\
+[UIColor colorWithRed:121/255.0 green:113/255.0 blue:199/255.0 alpha:1],\
+[UIColor colorWithRed:16/255.0 green:149/255.0 blue:224/255.0 alpha:1]\
+]
+
+#define CHART_MARGIN 50
+
+@interface DVPieChart ()
+
+@property (nonatomic, strong) NSMutableArray *modelArray;
+@property (nonatomic, strong) NSMutableArray *colorArray;
+
+@end
+
+
+@implementation DVPieChart
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    
+    if (self = [super initWithFrame:frame]) {
+        self.backgroundColor = [UIColor whiteColor];
+    }
+    return self;
+}
+
+
+
+- (void)draw {
+    [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
+    [self setNeedsDisplay];
+}
+
+
+-(void)drawRect:(CGRect)rect{
+    
+    CGFloat min = self.bounds.size.width > self.bounds.size.height ? self.bounds.size.height : self.bounds.size.width;
+    
+    CGPoint center =  CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
+    CGFloat radius = min * 0.5 - CHART_MARGIN;
+    CGFloat start = 0;
+    CGFloat angle = 0;
+    CGFloat end = start;
+    
+    
+    if (self.dataArray.count == 0) {
+        
+        end = start + M_PI * 2;
+        
+        UIColor *color = COLOR_ARRAY.firstObject;
+        
+        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:start endAngle:end clockwise:true];
+        
+        [color set];
+        
+        //添加一根线到圆心
+        [path addLineToPoint:center];
+        [path fill];
+        
+    } else {
+        
+        NSMutableArray *pointArray = [NSMutableArray array];
+        NSMutableArray *centerArray = [NSMutableArray array];
+        
+        self.modelArray = [NSMutableArray array];
+        self.colorArray = [NSMutableArray array];
+        
+        for (int i = 0; i < self.dataArray.count; i++) {
+            
+            DVFoodPieModel *model = self.dataArray[i];
+            CGFloat percent = model.rate;
+            UIColor *color = COLOR_ARRAY[i];
+            
+            start = end;
+            
+            angle = percent * M_PI * 2;
+            
+            end = start + angle;
+            
+            UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:start endAngle:end clockwise:true];
+            
+            [color set];
+            
+            //添加一根线到圆心
+            [path addLineToPoint:center];
+            [path fill];
+            
+            
+            // 获取弧度的中心角度
+            CGFloat radianCenter = (start + end) * 0.5;
+            
+            
+            // 获取指引线的起点
+            CGFloat lineStartX = self.frame.size.width * 0.5 + radius * cos(radianCenter);
+            CGFloat lineStartY = self.frame.size.height * 0.5 + radius * sin(radianCenter);
+            
+            
+            CGPoint point = CGPointMake(lineStartX, lineStartY);
+            
+            if (i <= self.dataArray.count / 2 - 1) {
+                [pointArray insertObject:[NSValue valueWithCGPoint:point] atIndex:0];
+                [centerArray insertObject:[NSNumber numberWithFloat:radianCenter] atIndex:0];
+                [self.modelArray insertObject:model atIndex:0];
+                [self.colorArray insertObject:color atIndex:0];
+            } else {
+                [pointArray addObject:[NSValue valueWithCGPoint:point]];
+                [centerArray addObject:[NSNumber numberWithFloat:radianCenter]];
+                [self.modelArray addObject:model];
+                [self.colorArray addObject:color];
+            }
+            
+            
+            // 绘出指引线
+            //            [self addLineWithColor:color X:lineStartX Y:lineStartY name:model.name number:[NSString stringWithFormat:@"%.2f%%", model.rate * 100] radianCenter:radianCenter];
+        }
+        
+        // 通过pointArray绘制指引线
+        [self drawLineWithPointArray:pointArray centerArray:centerArray];
+        
+    }
+    
+    // 在中心添加label
+    DVPieCenterView *centerView = [[DVPieCenterView alloc] init];
+    centerView.frame = CGRectMake(0, 0, 80, 80);
+    
+    CGRect frame = centerView.frame;
+    frame.origin = CGPointMake(self.frame.size.width * 0.5 - frame.size.width * 0.5, self.frame.size.height * 0.5 - frame.size.width * 0.5);
+    centerView.frame = frame;
+    
+    centerView.nameLabel.text = self.title;
+    
+    [self addSubview:centerView];
+}
+
+
+// 绘画指引线
+- (void)addLineWithColor:(UIColor *)color X:(CGFloat)x Y:(CGFloat)y name:(NSString *)name number:(NSString *)number radianCenter:(CGFloat)radianCenter {
+    
+    // 指引线的折点
+    CGFloat breakPointX = x + 10 * cos(radianCenter);
+    CGFloat breakPointY = y + 10 * sin(radianCenter);
+    
+    // 指引线的终点
+    CGFloat endX;
+    CGFloat endY;
+    
+    // 数字的frame
+    CGFloat numberWidth = 80.f;
+    CGFloat numberHeight = 15.f;
+    
+    CGFloat numberX = breakPointX;
+    CGFloat numberY = breakPointY - numberHeight;
+    
+    
+    // title的frame
+    CGFloat titleWidth = numberWidth;
+    CGFloat titleHeight = numberHeight;
+    
+    CGFloat titleX = breakPointX;
+    CGFloat titleY = breakPointY + 2;
+    
+    NSMutableParagraphStyle * paragraph = [[NSMutableParagraphStyle alloc]init];
+    paragraph.alignment = NSTextAlignmentRight;
+    
+    if (x > self.frame.size.width * 0.5) {
+        
+        endX = breakPointX + numberWidth;
+        endY = breakPointY;
+        
+    } else {
+        
+        endX = breakPointX - numberWidth;
+        endY = breakPointY;
+        
+        paragraph.alignment = NSTextAlignmentLeft;
+        
+        numberX = endX;
+        titleX = endX;
+    }
+    
+    
+    // 绘制指引线
+    //1.获取上下文
+    CGContextRef ctx = UIGraphicsGetCurrentContext();
+    //2.绘制路径
+    UIBezierPath *path = [UIBezierPath bezierPath];
+    
+    [path moveToPoint:CGPointMake(x, y)];
+    
+    [path addLineToPoint:CGPointMake(breakPointX, breakPointY)];
+    
+    [path addLineToPoint:CGPointMake(endX, endY)];
+    
+    CGContextSetLineWidth(ctx, 1);
+    
+    //设置颜色
+    [color set];
+    
+    //3.把绘制的内容添加到上下文当中
+    CGContextAddPath(ctx, path.CGPath);
+    //4.把上下文的内容显示到View上(渲染到View的layer)(stroke fill)
+    CGContextStrokePath(ctx);
+    
+    CGFloat point = -5;
+    if (x > self.frame.size.width * 0.5) {
+        point = 0;
+    }
+    
+    // 在终点处添加点
+    UIView *view = [[UIView alloc] init];
+    view.backgroundColor = color;
+    [self addSubview:view];
+    CGRect rect = view.frame;
+    rect.size = CGSizeMake(5, 5);
+    rect.origin = CGPointMake(endX + point, endY - 2.5);
+    view.frame = rect;
+    view.layer.cornerRadius = 2.5;
+    view.layer.masksToBounds = true;
+    
+    //    UIColor *strColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1];
+    UIColor *strColor = color;
+    //指引线上面的数字
+    [name drawInRect:CGRectMake(numberX, numberY, numberWidth, numberHeight) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10.0], NSForegroundColorAttributeName:strColor,NSParagraphStyleAttributeName:paragraph}];
+    
+    // 指引线下面的title
+    [number drawInRect:CGRectMake(titleX, titleY, titleWidth, titleHeight) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:10.0],NSForegroundColorAttributeName:strColor,NSParagraphStyleAttributeName:paragraph}];
+}
+
+
+- (void)drawLineWithPointArray:(NSArray *)pointArray centerArray:(NSArray *)centerArray {
+    
+    // 记录每一个指引线包括数据所占用位置的和(总体位置)
+    CGRect rect = CGRectZero;
+    
+    // 用于计算指引线长度
+    CGFloat width = self.bounds.size.width * 0.5;
+    
+    for (int i = 0; i < pointArray.count; i++) {
+        
+        // 取出数据
+        NSValue *value = pointArray[i];
+        
+        // 每个圆弧中心店的位置
+        CGPoint point = value.CGPointValue;
+        
+        // 每个圆弧中心点的角度
+        CGFloat radianCenter = [centerArray[i] floatValue];
+        
+        // 颜色(绘制数据时要用)
+        UIColor *color = self.colorArray[i % 6];
+        
+        // 模型数据(绘制数据时要用)
+        DVFoodPieModel *model = self.modelArray[i];
+        
+        // 模型的数据
+        NSString *name = model.name;
+        NSString *number = [NSString stringWithFormat:@"%.2f%%", model.rate * 100];
+        
+        
+        // 圆弧中心点的x值和y值
+        CGFloat x = point.x;
+        CGFloat y = point.y;
+        
+        // 指引线终点的位置(x, y)
+        CGFloat startX = x + 10 * cos(radianCenter);
+        CGFloat startY = y + 10 * sin(radianCenter);
+        
+        // 指引线转折点的位置(x, y)
+        CGFloat breakPointX = x + 20 * cos(radianCenter);
+        CGFloat breakPointY = y + 20 * sin(radianCenter);
+        
+        // 转折点到中心竖线的垂直长度(为什么+20, 在实际做出的效果中,有的转折线很丑,+20为了美化)
+        CGFloat margin = fabs(width - breakPointX) + 20;
+        
+        // 指引线长度
+        CGFloat lineWidth = width - margin;
+        
+        // 指引线起点(x, y)
+        CGFloat endX;
+        CGFloat endY;
+        
+        // 绘制文字和数字时,所占的size(width和height)
+        // width使用lineWidth更好,我这么写固定值是为了达到产品要求
+        CGFloat numberWidth = 80.f;
+        CGFloat numberHeight = 15.f;
+        
+        CGFloat titleWidth = numberWidth;
+        CGFloat titleHeight = numberHeight;
+        
+        // 绘制文字和数字时的起始位置(x, y)与上面的合并起来就是frame
+        CGFloat numberX;// = breakPointX;
+        CGFloat numberY = breakPointY - numberHeight;
+        
+        CGFloat titleX = breakPointX;
+        CGFloat titleY = breakPointY + 2;
+        
+        
+        // 文本段落属性(绘制文字和数字时需要)
+        NSMutableParagraphStyle * paragraph = [[NSMutableParagraphStyle alloc]init];
+        // 文字靠右
+        paragraph.alignment = NSTextAlignmentRight;
+        
+        // 判断x位置,确定在指引线向左还是向右绘制
+        // 根据需要变更指引线的起始位置
+        // 变更文字和数字的位置
+        if (x <= width) { // 在左边
+            
+            endX = 10;
+            endY = breakPointY;
+            
+            // 文字靠左
+            paragraph.alignment = NSTextAlignmentLeft;
+            
+            numberX = endX;
+            titleX = endX;
+            
+        } else {    // 在右边
+            
+            endX = self.bounds.size.width - 10;
+            endY = breakPointY;
+            
+            numberX = endX - numberWidth;
+            titleX = endX - titleWidth;
+        }
+        
+        
+        if (i != 0) {
+            
+            // 当i!=0时,就需要计算位置总和(方法开始出的rect)与rect1(将进行绘制的位置)是否有重叠
+            CGRect rect1 = CGRectMake(numberX, numberY, numberWidth, titleY + titleHeight - numberY);
+            
+            CGFloat margin = 0;
+            
+            if (CGRectIntersectsRect(rect, rect1)) {
+                // 两个面积重叠
+                // 三种情况
+                // 1. 压上面
+                // 2. 压下面
+                // 3. 包含
+                // 通过计算让面积重叠的情况消除
+                if (CGRectContainsRect(rect, rect1)) {// 包含
+                    
+                    if (i % self.dataArray.count <= self.dataArray.count * 0.5 - 1) {
+                        // 将要绘制的位置在总位置偏上
+                        margin = CGRectGetMaxY(rect1) - rect.origin.y;
+                        endY -= margin;
+                    } else {
+                        // 将要绘制的位置在总位置偏下
+                        margin = CGRectGetMaxY(rect) - rect1.origin.y;
+                        endY += margin;
+                    }
+                    
+                    
+                } else {    // 相交
+                    
+                    if (CGRectGetMaxY(rect1) > rect.origin.y && rect1.origin.y < rect.origin.y) { // 压在总位置上面
+                        margin = CGRectGetMaxY(rect1) - rect.origin.y;
+                        endY -= margin;
+                        
+                    } else if (rect1.origin.y < CGRectGetMaxY(rect) &&  CGRectGetMaxY(rect1) > CGRectGetMaxY(rect)) {  // 压总位置下面
+                        margin = CGRectGetMaxY(rect) - rect1.origin.y;
+                        endY += margin;
+                    }
+                    
+                }
+            }
+            titleY = endY + 2;
+            numberY = endY - numberHeight;
+            
+            
+            // 通过计算得出的将要绘制的位置
+            CGRect rect2 = CGRectMake(numberX, numberY, numberWidth, titleY + titleHeight - numberY);
+            
+            // 把新获得的rect和之前的rect合并
+            if (numberX == rect.origin.x) {
+                // 当两个位置在同一侧的时候才需要合并
+                if (rect2.origin.y < rect.origin.y) {
+                    rect = CGRectMake(rect.origin.x, rect2.origin.y, rect.size.width, rect.size.height + rect2.size.height);
+                } else {
+                    rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height + rect2.size.height);
+                }
+            }
+            
+        } else {
+            rect = CGRectMake(numberX, numberY, numberWidth, titleY + titleHeight - numberY);
+        }
+        
+        
+        // 重新制定转折点
+        if (endX == 10) {
+            breakPointX = endX + lineWidth;
+        } else {
+            breakPointX = endX - lineWidth;
+        }
+        
+        breakPointY = endY;
+        
+        //1.获取上下文
+        CGContextRef ctx = UIGraphicsGetCurrentContext();
+        //2.绘制路径
+        UIBezierPath *path = [UIBezierPath bezierPath];
+        
+        [path moveToPoint:CGPointMake(endX, endY)];
+        
+        [path addLineToPoint:CGPointMake(breakPointX, breakPointY)];
+        
+        [path addLineToPoint:CGPointMake(startX, startY)];
+        
+        CGContextSetLineWidth(ctx, 0.5);
+        
+        //设置颜色
+        [color set];
+        
+        //3.把绘制的内容添加到上下文当中
+        CGContextAddPath(ctx, path.CGPath);
+        //4.把上下文的内容显示到View上(渲染到View的layer)(stroke fill)
+        CGContextStrokePath(ctx);
+        
+        
+        
+        // 在终点处添加点(小圆点)
+        // movePoint,让转折线指向小圆点中心
+        CGFloat movePoint = -2.5;
+        
+        UIView *view = [[UIView alloc] init];
+        view.backgroundColor = color;
+        [self addSubview:view];
+        CGRect rect = view.frame;
+        rect.size = CGSizeMake(5, 5);
+        rect.origin = CGPointMake(startX + movePoint, startY - 2.5);
+        view.frame = rect;
+        view.layer.cornerRadius = 2.5;
+        view.layer.masksToBounds = true;
+        
+        
+        
+        //指引线上面的数字
+        [name drawInRect:CGRectMake(numberX, numberY, numberWidth, numberHeight) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9.0], NSForegroundColorAttributeName:color,NSParagraphStyleAttributeName:paragraph}];
+        
+        // 指引线下面的title
+        [number drawInRect:CGRectMake(titleX, titleY, titleWidth, titleHeight) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9.0],NSForegroundColorAttributeName:color,NSParagraphStyleAttributeName:paragraph}];
+        
+    }
+    
+    
+}
+
+
+@end
+

+ 33 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScanner.h

@@ -0,0 +1,33 @@
+//
+//  DYFCodeScanner.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#ifndef DYFCodeScanner_h
+#define DYFCodeScanner_h
+
+#import "DYFQRCodeImageView.h"
+#import "DYFCodeScannerViewController.h"
+#import "UIImage+QRCode.h"
+
+#endif /* DYFCodeScanner_h */

+ 83 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerMacros.h

@@ -0,0 +1,83 @@
+//
+//  DYFCodeScannerMacros.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#ifndef DYFCodeScannerMacros_h
+#define DYFCodeScannerMacros_h
+
+// 日志输出
+#ifdef DEBUG
+    #define DYFLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+    #define DYFLog(fmt, ...) {}
+#endif
+
+// Resolving block circular reference - __weak (arc)
+#ifndef DYFWeakObject
+    #if __has_feature(objc_arc)
+        #define DYFWeakObject(o) try {} @finally {} __weak __typeof(o) weak##_##o = o;
+    #else
+        #define DYFWeakObject(o) try {} @finally {} __block __typeof(o) weak##_##o = o;
+    #endif
+#endif
+
+// Resolving block circular reference - __strong (arc)
+#ifndef DYFStrongObject
+    #if __has_feature(objc_arc)
+        #define DYFStrongObject(o) try {} @finally {} __strong __typeof(o) strong##_##o = weak##_##o;
+    #else
+        #define DYFStrongObject(o) try {} @finally {} __typeof(o) strong##_##o = weak##_##o;
+    #endif
+#endif
+
+// 创建二维码时,中间头像的宽和高
+#define DYFQRCodeMeImageW                100.f
+#define DYFQRCodeMeImageH                100.f
+
+// Bundle名称
+#define DYFBundleName                    @"DYFCodeScanner.bundle"
+
+// 字符串追加字符串
+#define DYFAppendingString(s, e)         [s stringByAppendingString:e]
+// 字符串追加路径
+#define DYFAppendingPathComponent(s, e)  [s stringByAppendingPathComponent:e]
+// Bundle文件路径
+#define DYFBundleFilePath(name)          DYFAppendingPathComponent(DYFBundleName, name)
+
+// 通过图像名称获取图像对象
+#define DYFImageNamed(name)              [UIImage imageNamed:name]
+
+// 通过图像名称获取Bundle中的图像对象
+#define DYFBundleImageNamed(name)        [UIImage imageNamed:DYFBundleFilePath(name)]
+
+// 目标对象是否响应方法
+#define DYFRespondsToMethod(target, sel) (target && [target respondsToSelector:@selector(sel)])
+
+// 获取应用单例
+#define DYFSharedApp                     UIApplication.sharedApplication
+
+// 获取状态栏高度
+#define DYFStatusBarHeight               DYFSharedApp.statusBarFrame.size.height
+
+#endif /* DYFCodeScannerMacros_h */

+ 57 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerPreView.h

@@ -0,0 +1,57 @@
+//
+//  DYFCodeScannerPreView.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import <AVFoundation/AVFoundation.h>
+
+@protocol DYFCodeScannerPreViewDelegate <NSObject>
+
+- (void)back;
+- (void)turnOnTorch;
+- (void)turnOffTorch;
+- (void)openPhotoLibrary;
+
+@optional
+
+- (void)zoom:(CGFloat)scale;
+- (void)queryHistory;
+
+@end
+
+@interface DYFCodeScannerPreView : UIView
+
+@property (nonatomic,   weak) id<DYFCodeScannerPreViewDelegate> delegate;
+@property (nonatomic,   copy) NSString *title;
+
+@property (nonatomic, assign) CGSize transparentArea;
+@property (nonatomic, assign) BOOL isReading;
+@property (nonatomic, strong) UILabel *tipLabel;
+@property (nonatomic, assign) BOOL hasTorch;
+@property (nonatomic, assign) BOOL hasNavigationBar;
+
+- (void)startScan;
+- (void)stopScan;
+
+@end

+ 450 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerPreView.m

@@ -0,0 +1,450 @@
+//
+//  DYFCodeScannerPreView.m
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+
+
+#import "DYFCodeScannerPreView.h"
+#import "DYFCodeScannerMacros.h"
+#import "UIButton+Corner.h"
+#import "DYFCodeScannerViewController.h"
+
+#define ItemW                  40.f
+#define ItemH                  40.f
+
+
+@interface DYFCodeScannerPreView ()
+@property (nonatomic, strong) UIImageView *lineImgView;
+@end
+
+
+@implementation DYFCodeScannerPreView
+
+- (UIImageView *)lineImgView {
+    if (!_lineImgView) {
+        _lineImgView = [[UIImageView alloc] init];
+        _lineImgView.image = DYFBundleImageNamed(@"code_scanner_line");
+    }
+    return _lineImgView;
+}
+
+- (UILabel *)tipLabel {
+    if (!_tipLabel) {
+        _tipLabel = [[UILabel alloc] init];
+    }
+    return _tipLabel;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self configure];
+    }
+    return self;
+}
+
+- (void)configure {
+    self.autoresizingMask       = (UIViewAutoresizingFlexibleLeftMargin |
+                                   UIViewAutoresizingFlexibleWidth      |
+                                   UIViewAutoresizingFlexibleTopMargin  |
+                                   UIViewAutoresizingFlexibleHeight);
+    self.backgroundColor        = [UIColor clearColor];
+    self.userInteractionEnabled = YES;
+    
+    self.transparentArea        = CGSizeMake(280, 280);
+    self.hasNavigationBar       = NO;
+    
+    [self addLine];
+    [self addTipLabel];
+    [self addItems];
+    
+    [self addPinchGR];
+}
+
+- (void)addLine {
+    [self addSubview:self.lineImgView];
+}
+
+- (void)addTipLabel {
+    self.tipLabel.backgroundColor = [UIColor clearColor];
+    self.tipLabel.numberOfLines   = 1;
+    self.tipLabel.font            = [UIFont systemFontOfSize:13.f];
+    self.tipLabel.textColor       = [UIColor colorWithWhite:0.8f alpha:1.f];
+    self.tipLabel.textAlignment   = NSTextAlignmentCenter;
+    [self addSubview:self.tipLabel];
+}
+
+- (void)addItems {
+    UIButton *backButton = [[UIButton alloc] init];
+    [backButton setImage:ImageNamed(@"code_scanner_back") forState:UIControlStateNormal];
+    [backButton addTarget:self action:@selector(itemClicked:) forControlEvents:UIControlEventTouchUpInside];
+    backButton.tag       = 9;
+    [self addSubview:backButton];
+    
+    UILabel *titleLabel = [[UILabel alloc] init];
+    titleLabel.backgroundColor = [UIColor clearColor];
+    titleLabel.tag             = 10;
+    titleLabel.textColor       = [UIColor whiteColor];
+    titleLabel.numberOfLines   = 1;
+    titleLabel.textAlignment   = NSTextAlignmentCenter;
+    titleLabel.font            = [UIFont boldSystemFontOfSize:17.f];
+    [self addSubview:titleLabel];
+    
+    UIButton *torchButton = [[UIButton alloc] init];
+    
+    [torchButton setImage:ImageNamed(@"code_scanner_torch") forState:UIControlStateNormal];
+    [torchButton addTarget:self action:@selector(itemClicked:) forControlEvents:UIControlEventTouchUpInside];
+    torchButton.tag       = 11;
+    torchButton.showsTouchWhenHighlighted = YES;
+    [self addSubview:torchButton];
+    
+    UIButton *photoButton = [[UIButton alloc] init];
+    [photoButton setImage:ImageNamed(@"code_scanner_photo") forState:UIControlStateNormal];
+    [photoButton addTarget:self action:@selector(itemClicked:) forControlEvents:UIControlEventTouchUpInside];
+    photoButton.tag       = 12;
+    photoButton.showsTouchWhenHighlighted = YES;
+    [self addSubview:photoButton];
+    
+    UIButton *historyButton = [[UIButton alloc] init];
+    [historyButton setImage:ImageNamed(@"code_scanner_history") forState:UIControlStateNormal];
+    [historyButton addTarget:self action:@selector(itemClicked:) forControlEvents:UIControlEventTouchUpInside];
+    historyButton.tag       = 13;
+    historyButton.hidden    = YES;
+    historyButton.showsTouchWhenHighlighted = YES;
+    [self addSubview:historyButton];
+}
+
+- (void)addPinchGR {
+    UIPinchGestureRecognizer *pinchGR = [[UIPinchGestureRecognizer alloc] init];
+    [pinchGR addTarget:self action:@selector(pinchAction:)];
+    [self addGestureRecognizer:pinchGR];
+}
+
+- (void)pinchAction:(UIPinchGestureRecognizer *)recognizer {
+    if (recognizer.state == UIGestureRecognizerStateChanged) {
+        CGFloat maxScale = 5.f;
+        CGFloat minScale = 1.f;
+        
+        CGFloat nowScale = recognizer.scale;
+        if (nowScale > maxScale) {
+            nowScale = maxScale;
+        }
+        if (nowScale < minScale) {
+            nowScale = minScale;
+        }
+        
+        if (DYFRespondsToMethod(self.delegate, zoom:)) {
+            [self.delegate zoom:nowScale];
+        }
+    }
+}
+
+- (void)setTitle:(NSString *)title {
+    UILabel *titleLabel = [self viewWithTag:10];
+    titleLabel.text = title;
+    DYFLog(@"title: %@", titleLabel.text);
+}
+
+- (NSString *)title {
+    UILabel *titleLabel = [self viewWithTag:10];
+    return titleLabel.text;
+}
+
+- (void)setHasTorch:(BOOL)hasTorch {
+    _hasTorch = hasTorch;
+    if (hasTorch) {
+        UIButton *torchButton = [self viewWithTag:11];
+        [torchButton setImage:ImageNamed(@"code_scanner_torch_on") forState:UIControlStateSelected];
+    }
+}
+
+- (void)updateLayout {
+    DYFLog();
+    [self layoutLine];
+    [self layoutTipLabel];
+    
+    CGSize    vSize         = self.bounds.size;
+    
+    UIButton *backButton    = [self viewWithTag: 9];
+    UILabel  *titleLabel    = [self viewWithTag:10];
+    UIButton *torchButton   = [self viewWithTag:11];
+    UIButton *photoButton   = [self viewWithTag:12];
+    UIButton *historyButton = [self viewWithTag:13];
+    
+    if (self.hasNavigationBar) {
+        backButton.hidden = YES;
+        titleLabel.hidden = YES;
+    }
+    
+    if (!backButton.hidden) {
+        CGFloat dt       =  8.f;
+        CGFloat backBtnX = 12.f;
+        CGFloat backBtnY = (DYFStatusBarHeight > 20.f) ? 44.f : 34.f;
+        backButton.frame = CGRectMake(backBtnX, backBtnY, ItemW - dt, ItemH - dt);
+        backButton.imageEdgeInsets = UIEdgeInsetsMake(3, -2, 3, 2);
+        
+        CGFloat titleLabX = backBtnX + ItemW - dt + 10.f;
+        CGFloat titleLabY = backButton.frame.origin.y;
+        CGFloat titleLabW = vSize.width - 2*titleLabX;
+        titleLabel.frame  = CGRectMake(titleLabX, titleLabY, titleLabW, ItemH - dt);
+    }
+    
+    UIColor *bgColor  = [UIColor colorWithWhite:0.2 alpha:0.6];
+    
+    CGFloat tipLabY   = self.tipLabel.frame.origin.y;
+    CGFloat tipLabH   = self.tipLabel.frame.size.height;
+    
+    CGFloat torchBtnX = (vSize.width - self.transparentArea.width)/2.f;
+    CGFloat torchBtnY = tipLabY + tipLabH + 30.f;
+    torchButton.frame = CGRectMake(torchBtnX, torchBtnY, ItemW, ItemH);
+    torchButton.clipCorner(UIRectCornerAllCorners, bgColor, ItemH/2, VVBorderNull);
+    
+    CGFloat photoBtnX = (vSize.width - ItemW)/2.f;
+    CGFloat photoBtnY = torchButton.frame.origin.y;
+    if (historyButton.hidden) {
+        photoBtnX     = (vSize.width + self.transparentArea.width)/2.f - ItemW;
+    }
+    photoButton.frame = CGRectMake(photoBtnX, photoBtnY, ItemW, ItemH);
+    photoButton.clipCorner(UIRectCornerAllCorners, bgColor, ItemH/2, VVBorderNull);
+    
+    if (!historyButton.hidden) {
+        CGFloat historyBtnX = (vSize.width + self.transparentArea.width)/2.f - ItemW;
+        CGFloat historyBtnY = torchButton.frame.origin.y;
+        historyButton.frame = CGRectMake(historyBtnX, historyBtnY, ItemW, ItemH);
+        historyButton.clipCorner(UIRectCornerAllCorners, bgColor, ItemH/2, VVBorderNull);
+    }
+}
+
+- (void)layoutLine {
+    CGFloat vW = self.bounds.size.width;
+    CGFloat vH = self.bounds.size.height;
+    CGFloat tH = self.transparentArea.height;
+    
+    CGFloat dw = 260.f;
+    CGFloat dh = 2.f;
+    CGFloat dx = (vW - dw)/2;
+    CGFloat dy = vH/2 - tH/2 - 20.f;
+    
+    self.lineImgView.frame = CGRectMake(dx, dy, dw, dh);
+}
+
+- (void)layoutTipLabel {
+    CGFloat vW = self.bounds.size.width;
+    CGFloat vH = self.bounds.size.height;
+    CGFloat tW = self.transparentArea.width;
+    CGFloat tH = self.transparentArea.height;
+    
+    CGFloat dw = tW + 40.f;
+    CGFloat dh = [self heightForString:self.tipLabel andWidth:dw];
+    CGFloat dx = (vW - dw)/2;
+    CGFloat dy = vH/2 + tH/2 - 20.f;
+    
+    self.tipLabel.frame = CGRectMake(dx, dy, dw, dh);
+}
+
+- (void)itemClicked:(UIButton *)sender {
+    NSInteger index = sender.tag - 10;
+    
+    switch (index) {
+        case -1: {
+            !DYFRespondsToMethod(self.delegate, back) ?: [self.delegate back];
+            break;
+        }
+            
+        case 1: {
+            DYFLog(@"hasTorch: %d", self.hasTorch);
+            if (self.hasTorch) {
+                sender.selected = !sender.selected;
+                
+                if (sender.selected) {
+                    !DYFRespondsToMethod(self.delegate, turnOnTorch)  ?: [self.delegate turnOnTorch];
+                } else {
+                    !DYFRespondsToMethod(self.delegate, turnOffTorch) ?: [self.delegate turnOffTorch];
+                }
+            }
+            break;
+        }
+            
+        case 2: {
+            !DYFRespondsToMethod(self.delegate, openPhotoLibrary) ?: [self.delegate openPhotoLibrary];
+            break;
+        }
+            
+        case 3: {
+            !DYFRespondsToMethod(self.delegate, queryHistory) ?: [self.delegate queryHistory];
+            break;
+        }
+            
+        default:
+            break;
+    }
+    
+    if (index != 1) {
+        UIButton *torchButton = [self viewWithTag:11];
+        torchButton.selected  = NO;
+        !DYFRespondsToMethod(self.delegate, turnOffTorch) ?: [self.delegate turnOffTorch];
+    }
+}
+
+- (CGFloat)heightForString:(UILabel *)label andWidth:(CGFloat)width {
+    CGSize sizeToFit = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];
+    return sizeToFit.height;
+}
+
+- (void)startAnimation {
+    if (!_lineImgView || !_isReading) {
+        return;
+    }
+    
+    CGFloat vH = self.bounds.size.height;
+    CGFloat tH = self.transparentArea.height;
+    
+    [UIView animateWithDuration:2.f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+        
+        //self.lineImgView.transform = CGAffineTransformMakeTranslation(0, tH - 20);
+        CGRect r = self.lineImgView.frame;
+        r.origin.y = vH/2 + tH/2 - 40.f;
+        self.lineImgView.frame = r;
+        
+    } completion:^(BOOL finished) {
+        
+        //self.lineImgView.transform = CGAffineTransformIdentity;
+        CGRect r = self.lineImgView.frame;
+        r.origin.y = vH/2 - tH/2 - 20.f;
+        self.lineImgView.frame = r;
+        
+        [self startAnimation];
+        
+    }];
+}
+
+- (void)startScan {
+    if (_lineImgView) {
+        _isReading = YES;
+        [self updateLayout];
+        [self startAnimation];
+    }
+}
+
+- (void)stopScan {
+    _isReading = NO;
+}
+
+- (void)drawRect:(CGRect)rect {
+    CGSize vSize          = self.bounds.size;
+    CGRect screenDrawRect = CGRectMake(0, 0, vSize.width, vSize.height);
+    
+    CGFloat rX = (screenDrawRect.size.width  - self.transparentArea.width )/2;
+    CGFloat rY = (screenDrawRect.size.height - self.transparentArea.height)/2 - 30;
+    CGFloat rW = self.transparentArea.width;
+    CGFloat rH = self.transparentArea.height;
+    CGRect clearDrawRect = CGRectMake(rX, rY, rW, rH);
+    
+    CGContextRef ctx = UIGraphicsGetCurrentContext();
+    
+    [self addScreenFillRect:ctx rect:screenDrawRect];
+    [self addCenterClearRect:ctx rect:clearDrawRect];
+    [self addWhiteRect:ctx rect:clearDrawRect];
+    [self addCornerLineWithContext:ctx rect:clearDrawRect];
+}
+
+- (void)addScreenFillRect:(CGContextRef)ctx rect:(CGRect)rect {
+    CGContextSetRGBFillColor(ctx, 10/255.0, 10/255.0, 10/255.0, 0.5);
+    CGContextFillRect(ctx, rect); // draw the transparent layer
+}
+
+- (void)addCenterClearRect:(CGContextRef)ctx rect:(CGRect)rect {
+    CGContextClearRect(ctx, rect); // clear the center rect  of the layer
+}
+
+- (void)addWhiteRect:(CGContextRef)ctx rect:(CGRect)rect {
+    CGContextStrokeRect(ctx, rect);
+    CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
+    CGContextSetLineWidth(ctx, 0.8);
+    CGContextAddRect(ctx, rect);
+    CGContextStrokePath(ctx);
+}
+
+- (void)addCornerLineWithContext:(CGContextRef)ctx rect:(CGRect)rect {
+    // 画四个边角
+    CGContextSetLineWidth(ctx, 2);
+    CGContextSetRGBStrokeColor(ctx, 52/255.0, 191/255.0, 37/255.0, 1);
+    
+    // 左上角
+    CGPoint poinsTopLeftA[] = {
+        CGPointMake(rect.origin.x+0.7, rect.origin.y),
+        CGPointMake(rect.origin.x+0.7, rect.origin.y+15)
+    };
+    CGPoint poinsTopLeftB[] = {
+        CGPointMake(rect.origin.x, rect.origin.y+0.7),
+        CGPointMake(rect.origin.x+15, rect.origin.y+0.7)
+    };
+    [self addLine:poinsTopLeftA pointB:poinsTopLeftB ctx:ctx];
+    
+    // 左下角
+    CGPoint poinsBottomLeftA[] = {
+        CGPointMake(rect.origin.x+0.7, rect.origin.y+rect.size.height-15),
+        CGPointMake(rect.origin.x+0.7, rect.origin.y+rect.size.height)
+    };
+    CGPoint poinsBottomLeftB[] = {
+        CGPointMake(rect.origin.x, rect.origin.y+rect.size.height-0.7),
+        CGPointMake(rect.origin.x+0.7+15, rect.origin.y+rect.size.height-0.7)
+    };
+    [self addLine:poinsBottomLeftA pointB:poinsBottomLeftB ctx:ctx];
+    
+    // 右上角
+    CGPoint poinsTopRightA[] = {
+        CGPointMake(rect.origin.x+rect.size.width-15, rect.origin.y+0.7),
+        CGPointMake(rect.origin.x+rect.size.width, rect.origin.y+0.7)
+    };
+    CGPoint poinsTopRightB[] = {
+        CGPointMake(rect.origin.x+rect.size.width-0.7, rect.origin.y),
+        CGPointMake(rect.origin.x+rect.size.width-0.7, rect.origin.y+15+0.7)
+    };
+    [self addLine:poinsTopRightA pointB:poinsTopRightB ctx:ctx];
+    
+    // 右下角
+    CGPoint poinsBottomRightA[] = {
+        CGPointMake(rect.origin.x+rect.size.width-0.7, rect.origin.y+rect.size.height-15),
+        CGPointMake(rect.origin.x-0.7+rect.size.width, rect.origin.y+rect.size.height)
+    };
+    CGPoint poinsBottomRightB[] = {
+        CGPointMake(rect.origin.x+rect.size.width-15, rect.origin.y+rect.size.height-0.7),
+        CGPointMake(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height-0.7)
+    };
+    [self addLine:poinsBottomRightA pointB:poinsBottomRightB ctx:ctx];
+    
+    CGContextStrokePath(ctx);
+}
+
+- (void)addLine:(CGPoint[])pointA pointB:(CGPoint[])pointB ctx:(CGContextRef)ctx {
+    CGContextAddLines(ctx, pointA, 2);
+    CGContextAddLines(ctx, pointB, 2);
+}
+
+- (void)dealloc {
+    DYFLog();
+}
+
+@end

+ 57 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerViewController.h

@@ -0,0 +1,57 @@
+//
+//  DYFCodeScannerViewController.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import <AVFoundation/AVFoundation.h>
+
+/**
+ A block is used to capture the output with a boolean value and a string value.
+ */
+typedef void (^DYFCaptureOutputResultHandler)(BOOL result, NSString *stringValue);
+
+typedef NS_ENUM(NSInteger, DYFCodeScannerType) {
+    DYFCodeScannerTypeAll = 0, // Default, scan QRCode and barcode.
+    DYFCodeScannerTypeQRCode,  // Scan QRCode only.
+    DYFCodeScannerTypeBarcode, // Scan barcode only.
+};
+
+@interface DYFCodeScannerViewController : UIViewController
+
+/** It is used to hide navigation bar for a code scanner. */
+@property (nonatomic, assign) BOOL navigationBarHidden;
+
+/** The scan type for a code scanner. */
+@property (nonatomic, assign) DYFCodeScannerType scanType;
+
+/** The string is used to prompt users. */
+@property (nonatomic,   copy) NSString *tipString;
+
+/** The title for navigation item. */
+@property (nonatomic,   copy) NSString *navigationTitle;
+
+/** When the property is setted, it is called back after the output is captured. */
+@property (nonatomic,   copy) DYFCaptureOutputResultHandler resultHandler;
+
+@end

+ 378 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFCodeScannerViewController.m

@@ -0,0 +1,378 @@
+//
+//  DYFCodeScannerViewController.m
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import "DYFCodeScannerViewController.h"
+#import "DYFCodeScannerPreView.h"
+#import "DYFCodeScannerMacros.h"
+#import "UIImage+QRCode.h"
+
+@interface DYFCodeScannerViewController () <AVCaptureMetadataOutputObjectsDelegate, DYFCodeScannerPreViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIGestureRecognizerDelegate>
+@property (nonatomic, strong) AVCaptureSession      *session;  // 会话
+@property (nonatomic, strong) AVCaptureDeviceInput  *input;    // 输入流
+@property (nonatomic, strong) DYFCodeScannerPreView *preView;  // 预览视图
+@end
+
+@implementation DYFCodeScannerViewController
+
+- (instancetype)init {
+    self = [super init];
+    if (self) {
+        [self configure];
+    }
+    return self;
+}
+
+- (void)configure {
+    self.scanType = DYFCodeScannerTypeAll;
+}
+
+- (UIStatusBarStyle)preferredStatusBarStyle {
+    return UIStatusBarStyleLightContent;
+}
+
+- (BOOL)shouldAutorotate {
+    return NO;
+}
+
+- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
+    return UIInterfaceOrientationMaskPortrait;
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    [self configureNavigationBar];
+    [self addPreView];
+    [self requestAccess];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    
+    if (self.navigationBarHidden) {
+        [self hideNavigationBar:YES];
+    }
+    
+    if (self.session) {
+        [self.session startRunning];
+    }
+    
+    [self.preView startScan];
+}
+
+- (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+    if (self.navigationController) {
+        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
+    }
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    
+    if (self.navigationBarHidden) {
+        [self hideNavigationBar:NO];
+    }
+    
+    if (self.session) {
+        [self.session stopRunning];
+    }
+    
+    [self.preView stopScan];
+}
+
+- (void)hideNavigationBar:(BOOL)hidden {
+    if (self.navigationController) {
+        self.navigationController.navigationBarHidden = hidden;
+    }
+}
+
+- (void)configureNavigationBar {
+    if (self.navigationController) {
+        self.navigationController.interactivePopGestureRecognizer.delegate = self;
+        self.navigationItem.title = self.navigationTitle;
+        
+        if (!self.navigationBarHidden) {
+            UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
+            backButton.frame = CGRectMake(0, 0, 40, 40);
+            [backButton setImage:DYFBundleImageNamed(@"code_scanner_blueBack") forState:UIControlStateNormal];
+            [backButton addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
+            backButton.imageEdgeInsets = UIEdgeInsetsMake(3, -10, 3, 30);
+            
+            UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
+            spaceItem.width = -20;
+            UIBarButtonItem *backItem  = [[UIBarButtonItem alloc] initWithCustomView:backButton];
+            self.navigationItem.leftBarButtonItems = @[spaceItem, backItem];
+            
+            self.preView.hasNavigationBar = YES;
+        } else {
+            self.preView.hasNavigationBar = NO;
+        }
+    } else {
+        self.preView.hasNavigationBar = NO;
+    }
+}
+
+- (void)backButtonClicked:(UIButton *)sender {
+    [self.navigationController popViewControllerAnimated:YES];
+}
+
+- (void)requestAccess {
+    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            if (granted) {
+                [self configureScanner];
+            } else {
+                NSString *msg = @"请在系统“设置”-“隐私”-“相机”选项中,允许App访问你的相机";
+                DYFLog(@"[W]: %@", msg);
+                if (self.resultHandler) {
+                    self.resultHandler(NO, msg);
+                }
+            }
+        });
+    }];
+}
+
+- (DYFCodeScannerPreView *)preView {
+    if (!_preView) {
+        _preView = [[DYFCodeScannerPreView alloc] initWithFrame:self.view.bounds];
+        _preView.delegate      = self;
+        _preView.title         = self.navigationTitle;
+        _preView.tipLabel.text = self.tipString;
+    }
+    return _preView;
+}
+
+- (void)addPreView {
+    [self.view addSubview:self.preView];
+}
+
+- (void)configureScanner {
+    // 获取摄像设备
+    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
+    // 创建输入流
+    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
+    // 创建输出流
+    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
+    // 设置代理在主线程里刷新
+    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
+    
+    [self setInput:input];
+    [self checkTorch];
+    
+    // 会话
+    self.session = [[AVCaptureSession alloc] init];
+    
+    if ([self.session canAddInput:input]) {
+        [self.session addInput:input];
+    }
+    
+    if([self.session canAddOutput:output]) {
+        [self.session addOutput:output];
+    }
+    
+    // 设置数据采集质量
+    [self.session setSessionPreset:AVCaptureSessionPresetHigh];
+    
+    // 设置扫码支持的编码格式
+    switch (self.scanType) {
+        case DYFCodeScannerTypeAll:
+            output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,
+                                           AVMetadataObjectTypeEAN13Code,
+                                           AVMetadataObjectTypeEAN8Code,
+                                           AVMetadataObjectTypeUPCECode,
+                                           AVMetadataObjectTypeCode39Code,
+                                           AVMetadataObjectTypeCode39Mod43Code,
+                                           AVMetadataObjectTypeCode93Code,
+                                           AVMetadataObjectTypeCode128Code,
+                                           AVMetadataObjectTypePDF417Code];
+            break;
+            
+        case DYFCodeScannerTypeQRCode:
+            output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
+            break;
+            
+        case DYFCodeScannerTypeBarcode:
+            output.metadataObjectTypes = @[AVMetadataObjectTypeEAN13Code,
+                                           AVMetadataObjectTypeEAN8Code,
+                                           AVMetadataObjectTypeUPCECode,
+                                           AVMetadataObjectTypeCode39Code,
+                                           AVMetadataObjectTypeCode39Mod43Code,
+                                           AVMetadataObjectTypeCode93Code,
+                                           AVMetadataObjectTypeCode128Code,
+                                           AVMetadataObjectTypePDF417Code];
+            break;
+            
+        default:
+            break;
+    }
+    
+    
+    if (self.input.device.isFocusPointOfInterestSupported &&
+        [self.input.device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
+        [self.input.device lockForConfiguration:nil];
+        [self.input.device setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
+        [self.input.device unlockForConfiguration];
+    }
+    
+    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.session];
+    previewLayer.frame = self.view.layer.bounds;
+    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
+    
+    // 将预览层添加到界面中
+    [self.view.layer insertSublayer:previewLayer atIndex:0];
+    
+    [self.session startRunning];
+}
+
+- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
+    if (!self.preView.isReading) { return; }
+    
+    if (metadataObjects.count > 0) {
+        [self.session stopRunning];
+        [self.preView stopScan];
+        
+        AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects[0];
+        NSString *result = metadataObject.stringValue;
+        
+        [self captureOutputWithCompletion:^{
+            !self.resultHandler ?: self.resultHandler(result ? YES : NO, result);
+        }];
+    }
+}
+
+- (void)captureOutputWithCompletion:(void (^)(void))completionHandler {
+    UINavigationController *nc = self.navigationController;
+    if (nc) {
+        if (nc.viewControllers.count == 1) {
+            [nc dismissViewControllerAnimated:YES completion:completionHandler];
+        } else {
+            [nc popViewControllerAnimated:YES];
+            !completionHandler ?: completionHandler();
+        }
+    } else {
+        [self dismissViewControllerAnimated:YES completion:completionHandler];
+    }
+}
+
+- (void)checkTorch {
+    AVCaptureDevice *device = self.input.device;
+    [device lockForConfiguration:nil];
+    self.preView.hasTorch = device.hasTorch;
+    [device unlockForConfiguration];
+}
+
+#pragma mark - DYFCodeScannerPreViewDelegate
+
+- (void)back {
+    DYFLog();
+    [self captureOutputWithCompletion:NULL];
+}
+
+- (void)turnOnTorch {
+    DYFLog();
+    [self configureTorch:YES];
+}
+
+- (void)turnOffTorch {
+    DYFLog();
+    [self configureTorch:NO];
+}
+
+- (void)configureTorch:(BOOL)onOrOff {
+    AVCaptureDevice *device = self.input.device;
+    // 锁定
+    [device lockForConfiguration:nil];
+    // 判断是否有闪光灯
+    if ([device hasTorch]) {
+        if (onOrOff) {
+            device.torchMode = AVCaptureTorchModeOn;
+        } else {
+            device.torchMode = AVCaptureTorchModeOff;
+        }
+    }
+    // 解锁
+    [device unlockForConfiguration];
+}
+
+- (void)openPhotoLibrary {
+    DYFLog();
+    [self presentImagePicker];
+}
+
+- (void)queryHistory {
+    DYFLog();
+}
+
+- (void)presentImagePicker {
+    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
+        
+        UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
+        ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
+        ipc.delegate = self;
+        [self presentViewController:ipc animated:YES completion:NULL];
+        
+    } else {
+        
+        DYFLog(@"[W]: ImagePicker: SourceType is not available.");
+    }
+}
+
+- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
+    [picker dismissViewControllerAnimated:YES completion:NULL];
+    
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        
+        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
+        
+        NSString *codeMsg = image.yf_stringValue;
+        DYFLog(@"OriginalImage: %@, QRCode message: %@", image, codeMsg);
+        
+        [self captureOutputWithCompletion:^{
+            !self.resultHandler ?: self.resultHandler(codeMsg ? YES : NO, codeMsg);
+        }];
+    });
+}
+
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
+    [picker dismissViewControllerAnimated:YES completion:NULL];
+}
+
+- (void)zoom:(CGFloat)scale {
+    AVCaptureDevice *device = self.input.device;
+    [device lockForConfiguration:nil];
+    device.videoZoomFactor = scale;
+    [device unlockForConfiguration];
+}
+
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)dealloc {
+    DYFLog();
+}
+
+@end

+ 42 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFQRCodeImageView.h

@@ -0,0 +1,42 @@
+//
+//  DYFQRCodeImageView.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import <CoreImage/CoreImage.h>
+
+@interface DYFQRCodeImageView : UIImageView
+
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue;
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue centerImage:(UIImage *)centerImage;
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor;
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor centerImage:(UIImage *)centerImage;
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue;
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue centerImage:(UIImage *)centerImage;
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor;
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor centerImage:(UIImage *)centerImage;
+
+@end

+ 148 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/DYFQRCodeImageView.m

@@ -0,0 +1,148 @@
+//
+//  DYFQRCodeImageView.m
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import "DYFQRCodeImageView.h"
+#import "DYFCodeScannerMacros.h"
+
+@implementation DYFQRCodeImageView
+
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue {
+    return [self createWithFrame:frame stringValue:stringValue centerImage:nil];
+}
+
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue centerImage:(UIImage *)centerImage {
+    return [[self alloc] initWithFrame:frame stringValue:stringValue centerImage:centerImage];
+}
+
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor {
+    return [self createWithFrame:frame stringValue:stringValue backgroudColor:backgroudColor foregroudColor:foregroudColor centerImage:nil];
+}
+
++ (instancetype)createWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor centerImage:(UIImage *)centerImage {
+    return [[self alloc] initWithFrame:frame stringValue:stringValue backgroudColor:backgroudColor foregroudColor:foregroudColor centerImage:centerImage];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue {
+    return [self initWithFrame:frame stringValue:stringValue centerImage:nil];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue centerImage:(UIImage *)centerImage {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self generateQRCodeWithStringValue:stringValue centerImage:centerImage];
+    }
+    return self;
+}
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor {
+    return [self initWithFrame:frame stringValue:stringValue backgroudColor:backgroudColor foregroudColor:foregroudColor centerImage:nil];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame stringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor centerImage:(UIImage *)centerImage {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self generateQRCodeWithStringValue:stringValue backgroudColor:backgroudColor foregroudColor:foregroudColor centerImage:centerImage];
+    }
+    return self;
+}
+
+- (void)generateQRCodeWithStringValue:(NSString *)stringValue centerImage:(UIImage *)centerImage {
+    // 创建二维码过滤器
+    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
+    [qrFilter setDefaults];
+    
+    // 生成二维码
+    NSData *data = [stringValue dataUsingEncoding:NSUTF8StringEncoding];
+    [qrFilter setValue:data forKey:@"inputMessage"];
+    
+    CIImage *codeImage = qrFilter.outputImage;
+    // 拉伸
+    codeImage = [codeImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
+    
+    // 绘制二维码
+    UIImage *qrImage = [UIImage imageWithCIImage:codeImage];
+    UIGraphicsBeginImageContext(qrImage.size);
+    [qrImage drawInRect:CGRectMake(0, 0, qrImage.size.width, qrImage.size.height)];
+    
+    if (centerImage) {
+        CGFloat meImgX = (qrImage.size.width  - DYFQRCodeMeImageW)/2.f;
+        CGFloat meImgY = (qrImage.size.height - DYFQRCodeMeImageH)/2.f;
+        [centerImage drawInRect:CGRectMake(meImgX, meImgY, DYFQRCodeMeImageW, DYFQRCodeMeImageH)];
+    }
+    
+    // 获取绘制好的二维码
+    self.image = UIGraphicsGetImageFromCurrentImageContext();
+    
+    UIGraphicsEndImageContext();
+}
+
+- (void)generateQRCodeWithStringValue:(NSString *)stringValue backgroudColor:(UIColor *)backgroudColor foregroudColor:(UIColor *)foregroudColor centerImage:(UIImage *)centerImage {
+    // 创建二维码过滤器
+    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
+    [qrFilter setDefaults];
+    
+    // 生成二维码
+    NSData *data = [stringValue dataUsingEncoding:NSUTF8StringEncoding];
+    [qrFilter setValue:data forKey:@"inputMessage"];
+    CIImage *codeImage = qrFilter.outputImage;
+    
+    // 生成带有颜色的二维码
+    // 创建颜色过滤器
+    CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"];
+    // 设置默认值
+    [colorFilter setDefaults];
+    
+    // 输入内容
+    // 画颜色的图片
+    [colorFilter setValue:codeImage forKey:@"inputImage"];
+    
+    // 使用CIColor
+    // inputColor0 前景色 [CIColor colorWithRed:1 green:0 blue:0]
+    [colorFilter setValue:[CIColor colorWithCGColor:foregroudColor.CGColor] forKey:@"inputColor0"];
+    // inputColor1 背景色 [CIColor colorWithRed:0 green:1 blue:0]
+    [colorFilter setValue:[CIColor colorWithCGColor:backgroudColor.CGColor] forKey:@"inputColor1"];
+    
+    codeImage = colorFilter.outputImage;
+    // 拉伸
+    codeImage = [codeImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)];
+    
+    // 绘制二维码
+    UIImage *qrImage = [UIImage imageWithCIImage:codeImage];
+    UIGraphicsBeginImageContext(qrImage.size);
+    [qrImage drawInRect:CGRectMake(0, 0, qrImage.size.width, qrImage.size.height)];
+    
+    if (centerImage) {
+        CGFloat meImgX = (qrImage.size.width  - DYFQRCodeMeImageW)/2.f;
+        CGFloat meImgY = (qrImage.size.height - DYFQRCodeMeImageH)/2.f;
+        [centerImage drawInRect:CGRectMake(meImgX, meImgY, DYFQRCodeMeImageW, DYFQRCodeMeImageH)];
+    }
+    
+    // 获取绘制好的二维码
+    self.image = UIGraphicsGetImageFromCurrentImageContext();
+    
+    UIGraphicsEndImageContext();
+}
+
+@end

+ 58 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIButton+Corner.h

@@ -0,0 +1,58 @@
+//
+//  UIButton+Corner.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import <CoreGraphics/CoreGraphics.h>
+
+// Declare Border Struct.
+struct VVBorder {
+    CGFloat width;
+    UIColor *color;
+};
+typedef struct VVBorder VVBorder;
+
+// Declare Border Null.
+CG_EXTERN const VVBorder VVBorderNull;
+
+CG_INLINE VVBorder
+VVBorderMake(CGFloat width, UIColor *color) {
+    VVBorder b;
+    b.width = width;
+    b.color = color;
+    return b;
+}
+
+// Block for clipping corner.
+typedef void (^ClipCornerBlock)(UIRectCorner rc,
+                                UIColor *color,
+                                CGFloat radius,
+                                VVBorder border);
+
+@interface UIButton (Corner)
+
+// Clips corner.
+- (ClipCornerBlock)clipCorner;
+
+@end

+ 81 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIButton+Corner.m

@@ -0,0 +1,81 @@
+//
+//  UIButton+Corner.m
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import "UIButton+Corner.h"
+
+const VVBorder VVBorderNull = {0, nil};
+
+@implementation UIButton (Corner)
+
+- (ClipCornerBlock)clipCorner {
+    ClipCornerBlock block = ^(UIRectCorner rc, UIColor *color, CGFloat radius, VVBorder border) {
+        CGRect mRect       = self.bounds;
+        CGSize mSize       = mRect.size;
+        CGSize radii       = CGSizeMake(radius, radius);
+        
+        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:mRect byRoundingCorners:rc cornerRadii:radii];
+        UIImage *mImage    = nil;
+        if (@available(iOS 10.0, *)) {
+            UIGraphicsImageRenderer *render = [[UIGraphicsImageRenderer alloc] initWithSize:mSize];
+            
+            mImage = [render imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {
+                UIGraphicsImageRendererContext  *ctx = rendererContext;
+                
+                CGContextSetFillColorWithColor  (ctx.CGContext, color.CGColor);
+                CGContextSetStrokeColorWithColor(ctx.CGContext, border.color.CGColor);
+                CGContextSetLineWidth           (ctx.CGContext, border.width);
+                
+                [path addClip];
+                
+                CGContextAddPath (ctx.CGContext, path.CGPath);
+                CGContextDrawPath(ctx.CGContext, kCGPathFillStroke);
+            }];
+        } else {
+            UIGraphicsBeginImageContext(mSize);
+            
+            CGContextRef context = UIGraphicsGetCurrentContext();
+            
+            CGContextSetFillColorWithColor  (context, color.CGColor);
+            CGContextSetStrokeColorWithColor(context, border.color.CGColor);
+            CGContextSetLineWidth           (context, border.width);
+            
+            [path addClip];
+            
+            CGContextAddPath (context, path.CGPath);
+            CGContextDrawPath(context, kCGPathFillStroke);
+            
+            mImage = UIGraphicsGetImageFromCurrentImageContext();
+            
+            UIGraphicsEndImageContext();
+        }
+        
+        [self setBackgroundImage:mImage forState:UIControlStateNormal];
+        [self setBackgroundImage:mImage forState:UIControlStateHighlighted];
+    };
+    
+    return block;
+}
+
+@end

+ 34 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIImage+QRCode.h

@@ -0,0 +1,34 @@
+//
+//  UIImage+QRCode.h
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import <UIKit/UIKit.h>
+#import <CoreImage/CoreImage.h>
+
+@interface UIImage (QRCode)
+
+// Returns QRCode string value, otherwise, nil.
+- (NSString *)yf_stringValue;
+
+@end

+ 52 - 0
Jianbinglian/Lib(第三方库)/DYCodeScanner(二维码)/UIImage+QRCode.m

@@ -0,0 +1,52 @@
+//
+//  UIImage+QRCode.m
+//
+//  Created by dyf on 2018/01/28.
+//  Copyright © 2018 dyf. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#import "UIImage+QRCode.h"
+
+@implementation UIImage (QRCode)
+
+- (NSString *)yf_stringValue {
+    // 创建一个CIImage对象, 开始识别图片, 获取图片特征
+    CIImage *ciImage = [[CIImage alloc] initWithCGImage:self.CGImage options:nil];
+    
+    // 创建上下文, 软件渲染
+    CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}];
+    
+    // 创建一个探测器(CIDetectorTypeQRCode)
+    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];
+    
+    NSArray<CIFeature *> *features = [detector featuresInImage:ciImage];
+    for (CIQRCodeFeature *codef in features) {
+#if DEBUG
+        // 打印二维码中的信息
+        NSLog(@"QRCode Feature Message: %@", codef.messageString);
+#endif
+    }
+    CIQRCodeFeature *codef = (CIQRCodeFeature *)features.firstObject;
+    
+    return codef.messageString;
+}
+
+@end

+ 36 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView+Categories.h

@@ -0,0 +1,36 @@
+//
+//  EBBannerView+Categories.h
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/20.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import "EBBannerView.h"
+
+#define WEAK_SELF(weakSelf)  __weak __typeof(&*self)weakSelf = self;
+#define ScreenWidth [UIScreen mainScreen].bounds.size.width
+#define ScreenHeight [UIScreen mainScreen].bounds.size.height
+
+@interface EBBannerView (EBCategory)
+
++(UIImage*)defaultIcon;
++(NSString*)defaultTitle;
++(NSString*)defaultDate;
++(NSTimeInterval)defaultAnimationTime;
++(NSTimeInterval)defaultStayTime;
++(UInt32)defaultSoundID;
+
+@end
+
+@interface NSTimer (EBCategory)
+
++ (NSTimer *)eb_scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void (^)(NSTimer *timer))block repeats:(BOOL)repeats;
+
+@end
+
+@interface UIImage (EBBannerViewCategory)
+
++(UIColor *)colorAtPoint:(CGPoint)point;
+
+@end

+ 99 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView+Categories.m

@@ -0,0 +1,99 @@
+//
+//  EBBannerView+Categories.m
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/20.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import "EBBannerView+Categories.h"
+#import "EBBannerView.h"
+
+@implementation EBBannerView (EBCategory)
+
++(UIImage*)defaultIcon{
+    return [UIImage imageNamed:@"AppIcon40x40"] ?: [UIImage imageNamed:@"AppIcon60x60"] ?: [UIImage imageNamed:@"AppIcon80x80"];
+}
+
++(NSString*)defaultTitle{
+    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
+    return [infoDictionary objectForKey:@"CFBundleDisplayName"] ?: [infoDictionary objectForKey:@"CFBundleName"];
+}
+
++(NSString*)defaultDate{
+    return NSLocalizedString(@"现在", nil);
+}
+
++(NSTimeInterval)defaultAnimationTime{
+    return 0.3;
+}
+
+
++(NSTimeInterval)defaultStayTime{
+    return 4;
+}
+
++(UInt32)defaultSoundID{
+    return 1312;
+}
+
+-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
+    if (CGRectContainsPoint(self.frame, point)) {
+        return self;
+    } else {
+        return [super hitTest:point withEvent:event];
+    }
+}
+
+@end
+
+@implementation NSTimer (EBCategory)
+
++ (void)_eb_ExecBlock:(NSTimer *)timer {
+    if ([timer userInfo]) {
+        void (^block)(NSTimer *timer) = (void (^)(NSTimer *timer))[timer userInfo];
+        block(timer);
+    }
+}
++ (NSTimer *)eb_scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void (^)(NSTimer *timer))block repeats:(BOOL)repeats {
+    return [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(_eb_ExecBlock:) userInfo:[block copy] repeats:repeats];
+}
+
+@end
+
+@implementation UIImage (EBBannerViewCategory)
+
++(UIColor *)colorAtPoint:(CGPoint)point{
+    UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];
+    UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图,包括window
+    [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
+    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
+    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, viewImage.size.width, viewImage.size.height), point)) {
+        return nil;
+    }
+    NSInteger pointX = trunc(point.x);
+    NSInteger pointY = trunc(point.y);
+    CGImageRef cgImage = viewImage.CGImage;
+    NSUInteger width = viewImage.size.width;
+    NSUInteger height = viewImage.size.height;
+    viewImage = nil;
+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+    int bytesPerPixel = 4;
+    int bytesPerRow = bytesPerPixel * 1;
+    NSUInteger bitsPerComponent = 8;
+    unsigned char pixelData[4] = { 0, 0, 0, 0 };
+    CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
+    CGColorSpaceRelease(colorSpace);
+    CGContextSetBlendMode(context, kCGBlendModeCopy);
+    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
+    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
+    UIGraphicsEndImageContext();
+    CGContextRelease(context);
+    CGFloat red = (CGFloat)pixelData[0] / 255.0f;
+    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
+    CGFloat blue = (CGFloat)pixelData[2] / 255.0f;
+    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
+    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
+}
+
+@end

+ 276 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView.m

@@ -0,0 +1,276 @@
+//
+//  EBBannerView.m
+//  iOS-Foreground-Push-Notification
+//
+//  Created by pikacode@qq.com on 0/7/21.
+//  Copyright © 200年 57300022@qq.com. All rights reserved.
+//
+
+#import "EBBannerView.h"
+#import "EBMuteDetector.h"
+#import <AudioToolbox/AudioToolbox.h>
+#import "EBCustomBannerView.h"
+#import "EBBannerView+Categories.h"
+#import "EBBannerWindow.h"
+
+#define kAnimationDamping 0.8
+
+NSString *const EBBannerViewDidClickNotification = @"EBBannerViewDidClickNotification";
+
+@interface EBBannerView() {
+    NSTimer *_hideTimer;
+}
+
+@property (weak, nonatomic) IBOutlet UIImageView *imageView;
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+@property (weak, nonatomic) IBOutlet UILabel *contentLabel;
+@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
+@property (weak, nonatomic) IBOutlet UIView *lineView;
+
+@property (nonatomic, assign)BOOL isExpand;
+@property(nonatomic, assign, readonly)CGFloat standardHeight;
+@property (nonatomic, assign, readonly)CGFloat calculatedContentHeight;
+
+@property (nonatomic, assign, readonly)CGFloat fixedX;
+@property (nonatomic, assign, readonly)CGFloat fixedY;
+@property (nonatomic, assign, readonly)CGFloat fixedWidth;
+
+@property(nonatomic, strong)EBBannerViewMaker *maker;
+
+@end
+
+@implementation EBBannerView
+
+static NSMutableArray <EBBannerView*>*sharedBannerViews;
+static EBBannerWindow *sharedWindow;
+
+#pragma mark - public
+
++(instancetype)bannerWithBlock:(void(^)(EBBannerViewMaker *make))block{
+    
+    sharedWindow = [EBBannerWindow sharedWindow];
+    
+    EBBannerViewMaker *maker = [EBBannerViewMaker defaultMaker];
+    block(maker);
+    maker.style = MAX(maker.style, 9);
+    
+    EBBannerView *bannerView = [EBBannerView bannerViewWithStyle:maker.style];
+    bannerView.maker = maker;
+    if (maker.style == EBBannerViewStyleiOS9) {
+        bannerView.dateLabel.textColor = [[UIImage colorAtPoint:bannerView.dateLabel.center] colorWithAlphaComponent:0.7];
+        CGPoint lineCenter = bannerView.lineView.center;
+        bannerView.lineView.backgroundColor = [[UIImage colorAtPoint:CGPointMake(lineCenter.x, lineCenter.y - 7)] colorWithAlphaComponent:0.5];
+    }
+    return bannerView;
+}
+
++(instancetype)current{
+    EBBannerView *view = sharedWindow.rootViewController.view.subviews.lastObject;
+    if ([view isKindOfClass:[EBBannerView class]] && view.superview) {
+        return view;
+    } else {
+        return nil;
+    }
+}
+
+-(void)show{
+    if (_hideTimer) {
+        [_hideTimer invalidate];
+        _hideTimer = nil;
+    }
+    SystemSoundID soundID = _maker.soundID;
+    if (_maker.soundName) {
+        NSURL *url = [[NSBundle mainBundle] URLForResource:_maker.soundName withExtension:nil];
+        AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
+    }
+    WEAK_SELF(weakSelf);
+    [[EBMuteDetector sharedDetecotr] detectComplete:^(BOOL isMute) {
+        if (isMute && weakSelf.maker.vibrateOnMute) {
+            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+        } else {
+            AudioServicesPlaySystemSound(soundID);
+        }
+    }];
+    
+    self.imageView.image = _maker.icon;
+    self.titleLabel.text = _maker.title;
+    self.dateLabel.text = _maker.date;
+    self.contentLabel.text = _maker.content;
+    self.lineView.hidden = self.calculatedContentHeight < 34;
+    //iOS8 使用新样式label显示bug
+    if (UIDevice.currentDevice.systemVersion.intValue < 9 && _maker.style > 9) {
+        self.contentLabel.numberOfLines = 1;
+    }
+
+    [sharedWindow.rootViewController.view addSubview:self];
+    
+    self.frame = CGRectMake(self.fixedX, -self.standardHeight, self.fixedWidth, self.standardHeight);
+    
+    CGFloat damping = _maker.style == 9 ? 1 : kAnimationDamping;
+    
+    sharedWindow.hidden = NO;
+    
+    [UIView animateWithDuration:_maker.showAnimationDuration delay:0 usingSpringWithDamping:damping initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
+
+        weakSelf.frame = CGRectMake(weakSelf.fixedX, weakSelf.fixedY, weakSelf.fixedWidth, weakSelf.standardHeight);
+    } completion:^(BOOL finished) {
+        
+        EBBannerView *strongSelf = weakSelf;
+        strongSelf->_hideTimer = [NSTimer scheduledTimerWithTimeInterval:weakSelf.maker.stayDuration target:weakSelf selector:@selector(hide) userInfo:nil repeats:NO];
+    }];
+}
+
++(void)showWithContent:(NSString*)content{
+    [[EBBannerView bannerWithBlock:^(EBBannerViewMaker *make) {
+        make.content = content;
+    }] show];
+}
+
+#pragma mark - private
+
++(instancetype)bannerViewWithStyle:(EBBannerViewStyle)style{
+    EBBannerView *bannerView;
+    for (EBBannerView *view in sharedBannerViews) {
+        if (view.maker.style == style) {
+            bannerView = view;
+            break;
+        }
+    }
+    if (bannerView == nil) {
+        NSArray *views = [[NSBundle bundleForClass:self.class] loadNibNamed:@"EBBannerView" owner:nil options:nil];
+        NSUInteger index = MIN(style - 9, views.count - 1);
+        bannerView = views[index];
+        [[NSNotificationCenter defaultCenter] addObserver:bannerView selector:@selector(applicationDidChangeStatusBarOrientationNotification) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
+        [bannerView addGestureRecognizer];
+        bannerView.layer.shadowColor = UIColor.blackColor.CGColor;
+        bannerView.layer.shadowRadius = 3.5;
+        bannerView.layer.shadowOpacity = 0.35;
+        bannerView.layer.shadowOffset = CGSizeZero;
+        [sharedBannerViews addObject:bannerView];
+    }
+    return bannerView;
+}
+
+-(void)hide{
+    WEAK_SELF(weakSelf);
+    [UIView animateWithDuration:_maker.hideAnimationDuration delay:0 usingSpringWithDamping:kAnimationDamping initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
+        
+        weakSelf.frame = CGRectMake(weakSelf.fixedX, -weakSelf.standardHeight - (weakSelf.frame.size.height - weakSelf.standardHeight), weakSelf.fixedWidth, weakSelf.frame.size.height);
+    } completion:^(BOOL finished) {
+        if (weakSelf.superview.subviews.count == 1) {
+            sharedWindow.hidden = YES;
+        }
+        [weakSelf removeFromSuperview];
+    }];
+}
+
+-(void)applicationDidChangeStatusBarOrientationNotification{
+    if (!self.superview) {
+        return;
+    }
+    self.frame = CGRectMake(self.fixedX, self.fixedY, self.fixedWidth, self.standardHeight);
+}
+
+-(void)addGestureRecognizer{
+    UISwipeGestureRecognizer *swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUpGesture:)];
+    swipeUpGesture.direction = UISwipeGestureRecognizerDirectionUp;
+    [self addGestureRecognizer:swipeUpGesture];
+
+    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
+    [self addGestureRecognizer:tapGesture];
+
+    UISwipeGestureRecognizer *swipeDownGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDownGesture:)];
+    swipeDownGesture.direction = UISwipeGestureRecognizerDirectionDown;
+    [self addGestureRecognizer:swipeDownGesture];
+}
+
+-(void)tapGesture:(UITapGestureRecognizer*)tapGesture{
+    if (_maker.showDetailOrHideWhenClickLongText && !self.lineView.hidden) {
+        UISwipeGestureRecognizer *g = [UISwipeGestureRecognizer new];
+        g.direction = UISwipeGestureRecognizerDirectionDown;
+        [self swipeDownGesture:g];
+    } else {
+        [[NSNotificationCenter defaultCenter] postNotificationName:EBBannerViewDidClickNotification object:_maker.object];
+        [self hide];
+    }
+}
+
+-(void)swipeUpGesture:(UISwipeGestureRecognizer*)gesture{
+    if (gesture.direction == UISwipeGestureRecognizerDirectionUp) {
+        [self hide];
+    }
+}
+
+-(void)swipeDownGesture:(UISwipeGestureRecognizer*)gesture{
+    if (gesture.direction == UISwipeGestureRecognizerDirectionDown && !self.lineView.hidden) {
+        if (UIDevice.currentDevice.systemVersion.intValue < 9 && _maker.style > 9) {
+            self.contentLabel.numberOfLines = 0;
+        }
+        self.isExpand = YES;
+        self.lineView.hidden = YES;
+        
+        [_hideTimer invalidate];
+        _hideTimer = nil;
+        _hideTimer = [NSTimer scheduledTimerWithTimeInterval:_maker.swipeDownStayDuration target:self selector:@selector(hide) userInfo:nil repeats:NO];
+        
+        WEAK_SELF(weakSelf);
+        CGFloat originContentHeight = self.contentLabel.frame.size.height;
+        [UIView animateWithDuration:_maker.hideAnimationDuration delay:0 usingSpringWithDamping:kAnimationDamping initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
+            
+            weakSelf.frame = CGRectMake(weakSelf.fixedX, weakSelf.fixedY, weakSelf.fixedWidth, weakSelf.standardHeight + weakSelf.calculatedContentHeight - originContentHeight + 1);
+        } completion:^(BOOL finished) {
+            
+            weakSelf.frame = CGRectMake(weakSelf.fixedX, weakSelf.fixedY, weakSelf.fixedWidth, weakSelf.standardHeight + weakSelf.calculatedContentHeight - originContentHeight + 1);
+        }];
+    }
+}
+
+#pragma mark - @property
+
+-(CGFloat)standardHeight{
+    switch (_maker.style) {
+        case EBBannerViewStyleiOS8:
+        case EBBannerViewStyleiOS9:
+            return 70;
+        case EBBannerViewStyleiOS10:
+        case EBBannerViewStyleiOS11:
+        case EBBannerViewStyleiOS12:
+            return 90;
+    }
+}
+
+-(CGFloat)calculatedContentHeight{
+    CGSize size = CGSizeMake(self.contentLabel.frame.size.width, MAXFLOAT);
+    NSDictionary *dict = [NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:self.contentLabel.font.pointSize] forKey:NSFontAttributeName];
+    CGFloat calculatedHeight = [self.contentLabel.text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size.height;
+    return calculatedHeight;
+}
+
+-(BOOL)isiPhoneX{
+    if (@available(iOS 11.0, *)) {
+        return UIApplication.sharedApplication.keyWindow.safeAreaInsets.bottom > 0;
+//        return UIApplication.sharedApplication.delegate.window.safeAreaInsets.bottom > 0;
+    } else {
+        return NO;
+    }
+}
+
+-(CGFloat)fixedX{
+    return ([self isiPhoneX] && ![self isPortrait]) ? 128 : 0;
+}
+
+-(CGFloat)fixedY{
+    return ([self isiPhoneX] && [self isPortrait]) ? 33 : 0;
+}
+
+-(CGFloat)fixedWidth{
+    return ([self isiPhoneX] && ![self isPortrait]) ? 556 : ScreenWidth;
+}
+
+-(BOOL)isPortrait{
+    return ScreenWidth < ScreenHeight;
+}
+
+@end
+
+ 

+ 590 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerView.xib

@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clipsSubviews="YES" tag="9" contentMode="scaleToFill" id="iN0-l3-epB" userLabel="Banner View iOS 9" customClass="EBBannerView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="70"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SfK-LV-meM">
+                    <rect key="frame" x="41" y="6" width="30" height="17"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="17" id="1Ya-dU-30P"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zvg-9L-jbZ">
+                    <rect key="frame" x="251" y="6" width="29" height="17"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.53333333333333333" green="0.62745098039215685" blue="0.11764705882352941" alpha="0.89562821061643838" colorSpace="custom" customColorSpace="sRGB"/>
+                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                </label>
+                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="3LX-GO-ytA">
+                    <rect key="frame" x="13" y="6" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="BBu-Jj-Rh8"/>
+                        <constraint firstAttribute="width" constant="20" id="QrM-O5-XqR"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </imageView>
+                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3XN-Ja-hWT">
+                    <rect key="frame" x="140" y="63" width="40" height="4"/>
+                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="0.20034246575342465" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="40" id="1aX-v6-8T6"/>
+                        <constraint firstAttribute="height" constant="4" id="5KV-c9-Tif"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="2"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8ye-hb-Ujc">
+                    <rect key="frame" x="41" y="23" width="239" height="17"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+            </subviews>
+            <color key="backgroundColor" red="0.078431372549019607" green="0.078431372549019607" blue="0.078431372549019607" alpha="0.90000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="8" id="BXv-cQ-3ZT"/>
+                <constraint firstAttribute="trailing" secondItem="Zvg-9L-jbZ" secondAttribute="trailing" constant="40" id="G4g-N7-H4b"/>
+                <constraint firstItem="3LX-GO-ytA" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="6" id="GxO-lE-YJA"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="top" secondItem="SfK-LV-meM" secondAttribute="bottom" id="Gz1-Qc-GNi"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="top" secondItem="3LX-GO-ytA" secondAttribute="top" id="JPh-tI-rj4"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="SfK-LV-meM" secondAttribute="trailing" constant="8" id="OW3-cd-zZC"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="leading" secondItem="3LX-GO-ytA" secondAttribute="trailing" constant="8" id="Qb9-64-hfw"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="Waa-2j-xe4"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="leading" secondItem="3LX-GO-ytA" secondAttribute="trailing" constant="8" id="aTf-wq-Ws9"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="bHt-Ad-hfF"/>
+                <constraint firstAttribute="trailing" secondItem="8ye-hb-Ujc" secondAttribute="trailing" constant="40" id="fDh-qF-nJe"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="lPh-fk-lzq"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="lcx-9u-222"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="top" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="8" id="qAC-Xv-WQv"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="top" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="6" id="qDp-vB-zTt"/>
+                <constraint firstAttribute="bottom" secondItem="3XN-Ja-hWT" secondAttribute="bottom" constant="3" id="sho-ap-o8h"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="top" secondItem="3LX-GO-ytA" secondAttribute="top" id="u7N-vZ-i4s"/>
+                <constraint firstItem="3LX-GO-ytA" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="wWH-dS-9mc"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="leading" secondItem="SfK-LV-meM" secondAttribute="trailing" constant="8" id="yrd-Oa-94U"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <userDefinedRuntimeAttributes>
+                <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+            </userDefinedRuntimeAttributes>
+            <variation key="default">
+                <mask key="constraints">
+                    <exclude reference="Waa-2j-xe4"/>
+                    <exclude reference="BXv-cQ-3ZT"/>
+                    <exclude reference="lPh-fk-lzq"/>
+                    <exclude reference="qAC-Xv-WQv"/>
+                    <exclude reference="yrd-Oa-94U"/>
+                    <exclude reference="bHt-Ad-hfF"/>
+                </mask>
+            </variation>
+            <connections>
+                <outlet property="contentLabel" destination="8ye-hb-Ujc" id="g14-6s-7G1"/>
+                <outlet property="dateLabel" destination="Zvg-9L-jbZ" id="Vpm-ct-bdR"/>
+                <outlet property="imageView" destination="3LX-GO-ytA" id="B0I-o4-24Z"/>
+                <outlet property="lineView" destination="3XN-Ja-hWT" id="Roq-j6-DrO"/>
+                <outlet property="titleLabel" destination="SfK-LV-meM" id="uUD-XF-aci"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="-139.5"/>
+        </view>
+        <view clipsSubviews="YES" tag="10" contentMode="scaleToFill" id="FuQ-h0-Tnu" userLabel="Banner View iOS 10" customClass="EBBannerView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7yW-Dq-ZqA">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JiX-vA-bbX">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cdU-tQ-e7r">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="M5S-BA-9WJ">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="HqN-D2-fqn"/>
+                                        <constraint firstAttribute="width" constant="20" id="Y2u-jL-wNA"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0d1-ud-Cqn">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="cdU-tQ-e7r" firstAttribute="centerY" secondItem="M5S-BA-9WJ" secondAttribute="centerY" id="6Re-zk-fCe"/>
+                                <constraint firstItem="0d1-ud-Cqn" firstAttribute="centerY" secondItem="M5S-BA-9WJ" secondAttribute="centerY" id="FfH-Kn-g9V"/>
+                                <constraint firstAttribute="height" constant="36" id="Iu4-jB-01O"/>
+                                <constraint firstAttribute="trailing" secondItem="0d1-ud-Cqn" secondAttribute="trailing" constant="16" id="Vf8-BT-Lc4"/>
+                                <constraint firstItem="M5S-BA-9WJ" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="top" constant="8" id="eXj-Cu-ed5"/>
+                                <constraint firstItem="M5S-BA-9WJ" firstAttribute="leading" secondItem="JiX-vA-bbX" secondAttribute="leading" constant="8" id="f3J-Xz-Vuk"/>
+                                <constraint firstItem="cdU-tQ-e7r" firstAttribute="leading" secondItem="M5S-BA-9WJ" secondAttribute="trailing" constant="8" id="r3l-6p-bD1"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ggN-eQ-t44">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PlN-Fu-byf">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NF0-Jl-Zb9" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.792156862745098" green="0.792156862745098" blue="0.792156862745098" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="EpJ-gN-cOO"/>
+                                        <constraint firstAttribute="width" constant="40" id="jSQ-Il-7hO"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.93333333330000001" green="0.93333333330000001" blue="0.93333333330000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="PlN-Fu-byf" firstAttribute="leading" secondItem="ggN-eQ-t44" secondAttribute="leading" constant="15" id="7IU-4e-1iU"/>
+                                <constraint firstAttribute="bottom" secondItem="NF0-Jl-Zb9" secondAttribute="bottom" constant="3" id="KaL-RE-UI0"/>
+                                <constraint firstItem="NF0-Jl-Zb9" firstAttribute="centerX" secondItem="ggN-eQ-t44" secondAttribute="centerX" id="bg1-eG-9DB"/>
+                                <constraint firstItem="NF0-Jl-Zb9" firstAttribute="top" relation="greaterThanOrEqual" secondItem="PlN-Fu-byf" secondAttribute="bottom" constant="6" id="e51-ht-XRX"/>
+                                <constraint firstAttribute="bottom" secondItem="PlN-Fu-byf" secondAttribute="bottom" constant="8" id="i37-lN-GSM"/>
+                                <constraint firstAttribute="trailing" secondItem="PlN-Fu-byf" secondAttribute="trailing" constant="8" id="mni-O1-Wrk"/>
+                                <constraint firstItem="PlN-Fu-byf" firstAttribute="centerY" secondItem="ggN-eQ-t44" secondAttribute="centerY" id="tc3-dv-lKE"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="i37-lN-GSM"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="JiX-vA-bbX" firstAttribute="leading" secondItem="7yW-Dq-ZqA" secondAttribute="leading" id="1aT-Ok-ixh"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="bottom" id="R3Y-8L-Ouf"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="leading" secondItem="7yW-Dq-ZqA" secondAttribute="leading" id="Rfu-a2-KpF"/>
+                        <constraint firstItem="JiX-vA-bbX" firstAttribute="top" secondItem="7yW-Dq-ZqA" secondAttribute="top" id="Yoj-eJ-mau"/>
+                        <constraint firstAttribute="trailing" secondItem="ggN-eQ-t44" secondAttribute="trailing" id="c9F-3I-neS"/>
+                        <constraint firstAttribute="trailing" secondItem="JiX-vA-bbX" secondAttribute="trailing" id="evQ-GU-L9x"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="bottom" id="vZB-u0-kJK"/>
+                        <constraint firstAttribute="bottom" secondItem="ggN-eQ-t44" secondAttribute="bottom" id="ygp-U0-FHa"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="7yW-Dq-ZqA" secondAttribute="trailing" constant="8" id="0h1-xp-uVn"/>
+                <constraint firstItem="7yW-Dq-ZqA" firstAttribute="leading" secondItem="FuQ-h0-Tnu" secondAttribute="leading" constant="8" id="bHy-zK-tmO"/>
+                <constraint firstAttribute="bottom" secondItem="7yW-Dq-ZqA" secondAttribute="bottom" constant="8" id="faZ-82-wWt"/>
+                <constraint firstItem="7yW-Dq-ZqA" firstAttribute="top" secondItem="FuQ-h0-Tnu" secondAttribute="top" constant="8" id="r3K-xa-ISG"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="PlN-Fu-byf" id="xat-XT-N8g"/>
+                <outlet property="dateLabel" destination="0d1-ud-Cqn" id="6wJ-K8-JKG"/>
+                <outlet property="imageView" destination="M5S-BA-9WJ" id="QyC-qP-gbo"/>
+                <outlet property="lineView" destination="NF0-Jl-Zb9" id="Z5f-fc-wUB"/>
+                <outlet property="titleLabel" destination="cdU-tQ-e7r" id="cq0-yc-9hf"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="5"/>
+        </view>
+        <view clipsSubviews="YES" tag="11" contentMode="scaleToFill" id="bKA-bm-N9w" userLabel="Banner View iOS 11" customClass="EBBannerView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kDy-gB-6fk">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tRG-wn-Jup">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xxL-Ex-JLB">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="cJO-Wj-HZ3">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="kk5-4M-aEB"/>
+                                        <constraint firstAttribute="height" constant="20" id="u8v-4K-trn"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F1q-Ut-WQc">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="xxL-Ex-JLB" firstAttribute="leading" secondItem="cJO-Wj-HZ3" secondAttribute="trailing" constant="8" id="0aD-GM-GHe"/>
+                                <constraint firstAttribute="trailing" secondItem="F1q-Ut-WQc" secondAttribute="trailing" constant="16" id="1D7-dr-a2I"/>
+                                <constraint firstItem="cJO-Wj-HZ3" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="top" constant="8" id="IFd-GC-ruQ"/>
+                                <constraint firstAttribute="height" constant="36" id="WSg-lQ-Luk"/>
+                                <constraint firstItem="xxL-Ex-JLB" firstAttribute="centerY" secondItem="cJO-Wj-HZ3" secondAttribute="centerY" id="il4-b9-Xvt"/>
+                                <constraint firstItem="F1q-Ut-WQc" firstAttribute="centerY" secondItem="cJO-Wj-HZ3" secondAttribute="centerY" id="vWV-18-Elp"/>
+                                <constraint firstItem="cJO-Wj-HZ3" firstAttribute="leading" secondItem="tRG-wn-Jup" secondAttribute="leading" constant="8" id="yC9-xZ-VW4"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JIx-cL-R5w">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qui-ab-szz">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UMP-J1-Z5p" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.792156862745098" green="0.792156862745098" blue="0.792156862745098" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="40" id="iFl-gs-CFT"/>
+                                        <constraint firstAttribute="height" constant="4" id="rZJ-Kb-Qm2"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="qui-ab-szz" firstAttribute="leading" secondItem="JIx-cL-R5w" secondAttribute="leading" constant="15" id="51P-kJ-o26"/>
+                                <constraint firstItem="UMP-J1-Z5p" firstAttribute="top" relation="greaterThanOrEqual" secondItem="qui-ab-szz" secondAttribute="bottom" constant="6" id="Hrv-ul-evk"/>
+                                <constraint firstItem="UMP-J1-Z5p" firstAttribute="centerX" secondItem="JIx-cL-R5w" secondAttribute="centerX" id="NcZ-GP-ste"/>
+                                <constraint firstItem="qui-ab-szz" firstAttribute="centerY" secondItem="JIx-cL-R5w" secondAttribute="centerY" id="W7g-jr-cZq"/>
+                                <constraint firstAttribute="trailing" secondItem="qui-ab-szz" secondAttribute="trailing" constant="8" id="ZcQ-1U-vaz"/>
+                                <constraint firstAttribute="bottom" secondItem="qui-ab-szz" secondAttribute="bottom" constant="8" id="btp-Ie-xzC"/>
+                                <constraint firstAttribute="bottom" secondItem="UMP-J1-Z5p" secondAttribute="bottom" constant="3" id="mqI-HI-Uvi"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="btp-Ie-xzC"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="JIx-cL-R5w" secondAttribute="trailing" id="1Uc-6J-zrf"/>
+                        <constraint firstAttribute="bottom" secondItem="JIx-cL-R5w" secondAttribute="bottom" id="4Oa-UV-nZ7"/>
+                        <constraint firstItem="tRG-wn-Jup" firstAttribute="leading" secondItem="kDy-gB-6fk" secondAttribute="leading" id="ODE-xP-bSI"/>
+                        <constraint firstAttribute="trailing" secondItem="tRG-wn-Jup" secondAttribute="trailing" id="Tap-la-AQj"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="bottom" id="bnr-d6-HWe"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="bottom" id="jxg-AT-8hu"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="leading" secondItem="kDy-gB-6fk" secondAttribute="leading" id="tGd-WN-h6d"/>
+                        <constraint firstItem="tRG-wn-Jup" firstAttribute="top" secondItem="kDy-gB-6fk" secondAttribute="top" id="wwZ-rp-dHj"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="kDy-gB-6fk" secondAttribute="bottom" constant="8" id="8GH-DP-XwZ"/>
+                <constraint firstItem="kDy-gB-6fk" firstAttribute="leading" secondItem="bKA-bm-N9w" secondAttribute="leading" constant="8" id="FOv-eX-p3M"/>
+                <constraint firstItem="kDy-gB-6fk" firstAttribute="top" secondItem="bKA-bm-N9w" secondAttribute="top" constant="8" id="NiU-8g-cou"/>
+                <constraint firstAttribute="trailing" secondItem="kDy-gB-6fk" secondAttribute="trailing" constant="8" id="urX-DG-gKm"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="qui-ab-szz" id="SW9-kM-NyX"/>
+                <outlet property="dateLabel" destination="F1q-Ut-WQc" id="y9F-s9-QdU"/>
+                <outlet property="imageView" destination="cJO-Wj-HZ3" id="Efj-HW-sCT"/>
+                <outlet property="lineView" destination="UMP-J1-Z5p" id="xJV-4N-lwj"/>
+                <outlet property="titleLabel" destination="xxL-Ex-JLB" id="efy-Vt-f9t"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="150.5"/>
+        </view>
+        <view clipsSubviews="YES" tag="12" contentMode="scaleToFill" id="ZcT-r6-Sxd" userLabel="Banner View iOS 12" customClass="EBBannerView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iBt-iM-2Fl">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JIy-WU-xdA">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gX9-ee-ILZ">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="DyH-1Y-Gbr">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="cCu-CS-iLg"/>
+                                        <constraint firstAttribute="width" constant="20" id="kib-OM-EJA"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pkw-x6-qHt">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="Pkw-x6-qHt" firstAttribute="centerY" secondItem="DyH-1Y-Gbr" secondAttribute="centerY" id="C5E-sl-K4s"/>
+                                <constraint firstItem="DyH-1Y-Gbr" firstAttribute="leading" secondItem="JIy-WU-xdA" secondAttribute="leading" constant="8" id="FxO-VY-KvG"/>
+                                <constraint firstItem="gX9-ee-ILZ" firstAttribute="centerY" secondItem="DyH-1Y-Gbr" secondAttribute="centerY" id="ZI0-NQ-FWq"/>
+                                <constraint firstItem="DyH-1Y-Gbr" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="top" constant="8" id="abe-cH-aVv"/>
+                                <constraint firstAttribute="trailing" secondItem="Pkw-x6-qHt" secondAttribute="trailing" constant="16" id="dkm-ov-e64"/>
+                                <constraint firstItem="gX9-ee-ILZ" firstAttribute="leading" secondItem="DyH-1Y-Gbr" secondAttribute="trailing" constant="8" id="gUJ-5C-hPZ"/>
+                                <constraint firstAttribute="height" constant="36" id="yiY-Jo-Px8"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Gba-7L-W4P">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eiZ-aE-wUX">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mkj-V8-ZAo" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.79215686269999996" green="0.79215686269999996" blue="0.79215686269999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="3YQ-ch-S8x"/>
+                                        <constraint firstAttribute="width" constant="40" id="uaJ-wL-giY"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="mkj-V8-ZAo" firstAttribute="top" relation="greaterThanOrEqual" secondItem="eiZ-aE-wUX" secondAttribute="bottom" constant="6" id="2pp-Mr-Jfe"/>
+                                <constraint firstItem="eiZ-aE-wUX" firstAttribute="centerY" secondItem="Gba-7L-W4P" secondAttribute="centerY" id="3ox-fa-6RA"/>
+                                <constraint firstAttribute="trailing" secondItem="eiZ-aE-wUX" secondAttribute="trailing" constant="8" id="DI9-9h-ChM"/>
+                                <constraint firstItem="mkj-V8-ZAo" firstAttribute="centerX" secondItem="Gba-7L-W4P" secondAttribute="centerX" id="DuD-eh-Wjo"/>
+                                <constraint firstAttribute="bottom" secondItem="mkj-V8-ZAo" secondAttribute="bottom" constant="3" id="UKU-ak-eFg"/>
+                                <constraint firstAttribute="bottom" secondItem="eiZ-aE-wUX" secondAttribute="bottom" constant="8" id="b2e-3U-A0z"/>
+                                <constraint firstItem="eiZ-aE-wUX" firstAttribute="leading" secondItem="Gba-7L-W4P" secondAttribute="leading" constant="15" id="gNb-6h-Q4b"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="b2e-3U-A0z"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="Gba-7L-W4P" secondAttribute="trailing" id="CEF-AD-MRQ"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="bottom" id="Ccw-fP-Pr0"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="leading" secondItem="iBt-iM-2Fl" secondAttribute="leading" id="ITc-vt-kLf"/>
+                        <constraint firstItem="JIy-WU-xdA" firstAttribute="leading" secondItem="iBt-iM-2Fl" secondAttribute="leading" id="KT1-zf-JnH"/>
+                        <constraint firstAttribute="bottom" secondItem="Gba-7L-W4P" secondAttribute="bottom" id="OIk-gt-YX0"/>
+                        <constraint firstAttribute="trailing" secondItem="JIy-WU-xdA" secondAttribute="trailing" id="ceP-Mx-1qv"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="bottom" id="fv3-91-3WM"/>
+                        <constraint firstItem="JIy-WU-xdA" firstAttribute="top" secondItem="iBt-iM-2Fl" secondAttribute="top" id="gro-bP-tgA"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="iBt-iM-2Fl" secondAttribute="bottom" constant="8" id="56T-aF-6c4"/>
+                <constraint firstAttribute="trailing" secondItem="iBt-iM-2Fl" secondAttribute="trailing" constant="8" id="Kod-Na-IZP"/>
+                <constraint firstItem="iBt-iM-2Fl" firstAttribute="top" secondItem="ZcT-r6-Sxd" secondAttribute="top" constant="8" id="NDb-Fe-3pc"/>
+                <constraint firstItem="iBt-iM-2Fl" firstAttribute="leading" secondItem="ZcT-r6-Sxd" secondAttribute="leading" constant="8" id="sik-Le-kHA"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="eiZ-aE-wUX" id="IO8-xi-uWs"/>
+                <outlet property="dateLabel" destination="Pkw-x6-qHt" id="6pe-kJ-aLk"/>
+                <outlet property="imageView" destination="DyH-1Y-Gbr" id="uPD-hM-8id"/>
+                <outlet property="lineView" destination="mkj-V8-ZAo" id="YjZ-Ma-Eex"/>
+                <outlet property="titleLabel" destination="gX9-ee-ILZ" id="Cim-tS-YqF"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="290"/>
+        </view>
+        <view clipsSubviews="YES" tag="13" contentMode="scaleToFill" id="EMB-ot-5Qb" userLabel="Banner View iOS 13" customClass="EBBannerView">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="c3p-F4-rmc">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="isa-ao-cnZ">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mZq-cc-z7r">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yZL-Wp-6pz">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="GXZ-SS-AzU"/>
+                                        <constraint firstAttribute="height" constant="20" id="Pz4-XG-WZ1"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zfw-Lf-1vq">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="yZL-Wp-6pz" firstAttribute="leading" secondItem="isa-ao-cnZ" secondAttribute="leading" constant="8" id="4Ag-Qg-4Kq"/>
+                                <constraint firstAttribute="trailing" secondItem="Zfw-Lf-1vq" secondAttribute="trailing" constant="16" id="7Tj-fl-1rf"/>
+                                <constraint firstAttribute="height" constant="36" id="P0Y-bm-cHn"/>
+                                <constraint firstItem="mZq-cc-z7r" firstAttribute="centerY" secondItem="yZL-Wp-6pz" secondAttribute="centerY" id="b0V-EV-z1p"/>
+                                <constraint firstItem="mZq-cc-z7r" firstAttribute="leading" secondItem="yZL-Wp-6pz" secondAttribute="trailing" constant="8" id="bh8-HO-abY"/>
+                                <constraint firstItem="Zfw-Lf-1vq" firstAttribute="centerY" secondItem="yZL-Wp-6pz" secondAttribute="centerY" id="ct2-h1-NK5"/>
+                                <constraint firstItem="yZL-Wp-6pz" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="top" constant="8" id="tew-s1-oPz"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8gr-41-q3Y">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OgR-iC-uzK">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DpU-UI-PtJ" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.79215686269999996" green="0.79215686269999996" blue="0.79215686269999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="FMz-5v-vrV"/>
+                                        <constraint firstAttribute="width" constant="40" id="Fnh-O2-pDg"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="OgR-iC-uzK" firstAttribute="centerY" secondItem="8gr-41-q3Y" secondAttribute="centerY" id="3Vr-sT-qcV"/>
+                                <constraint firstItem="OgR-iC-uzK" firstAttribute="leading" secondItem="8gr-41-q3Y" secondAttribute="leading" constant="15" id="I5W-IB-jBi"/>
+                                <constraint firstAttribute="bottom" secondItem="OgR-iC-uzK" secondAttribute="bottom" constant="8" id="Y7l-hP-MJ3"/>
+                                <constraint firstItem="DpU-UI-PtJ" firstAttribute="centerX" secondItem="8gr-41-q3Y" secondAttribute="centerX" id="exa-IT-7IG"/>
+                                <constraint firstAttribute="bottom" secondItem="DpU-UI-PtJ" secondAttribute="bottom" constant="3" id="iyn-aS-8f6"/>
+                                <constraint firstAttribute="trailing" secondItem="OgR-iC-uzK" secondAttribute="trailing" constant="8" id="k3i-ur-eoU"/>
+                                <constraint firstItem="DpU-UI-PtJ" firstAttribute="top" relation="greaterThanOrEqual" secondItem="OgR-iC-uzK" secondAttribute="bottom" constant="6" id="mfW-p1-MJv"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="Y7l-hP-MJ3"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="bottom" id="D5l-k7-495"/>
+                        <constraint firstItem="isa-ao-cnZ" firstAttribute="top" secondItem="c3p-F4-rmc" secondAttribute="top" id="LVI-93-SbU"/>
+                        <constraint firstAttribute="bottom" secondItem="8gr-41-q3Y" secondAttribute="bottom" id="amY-ys-yT4"/>
+                        <constraint firstAttribute="trailing" secondItem="8gr-41-q3Y" secondAttribute="trailing" id="fSY-vZ-ev8"/>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="bottom" id="t0M-Nf-gHr"/>
+                        <constraint firstItem="isa-ao-cnZ" firstAttribute="leading" secondItem="c3p-F4-rmc" secondAttribute="leading" id="tVD-AS-Gz2"/>
+                        <constraint firstAttribute="trailing" secondItem="isa-ao-cnZ" secondAttribute="trailing" id="wXp-ji-ogN"/>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="leading" secondItem="c3p-F4-rmc" secondAttribute="leading" id="xF3-RL-v1F"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="c3p-F4-rmc" secondAttribute="bottom" constant="8" id="44Y-Y8-rQ6"/>
+                <constraint firstItem="c3p-F4-rmc" firstAttribute="top" secondItem="EMB-ot-5Qb" secondAttribute="top" constant="8" id="5Jk-BX-xtT"/>
+                <constraint firstItem="c3p-F4-rmc" firstAttribute="leading" secondItem="EMB-ot-5Qb" secondAttribute="leading" constant="8" id="lQ4-zG-S7O"/>
+                <constraint firstAttribute="trailing" secondItem="c3p-F4-rmc" secondAttribute="trailing" constant="8" id="mN8-Xw-AOQ"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="OgR-iC-uzK" id="moz-Gh-sjO"/>
+                <outlet property="dateLabel" destination="Zfw-Lf-1vq" id="Sq9-nO-po9"/>
+                <outlet property="imageView" destination="yZL-Wp-6pz" id="8i4-7S-G9z"/>
+                <outlet property="lineView" destination="DpU-UI-PtJ" id="UTL-UO-wqe"/>
+                <outlet property="titleLabel" destination="mZq-cc-z7r" id="3tC-1e-0Hq"/>
+            </connections>
+            <point key="canvasLocation" x="81" y="395"/>
+        </view>
+    </objects>
+</document>

+ 45 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewController.m

@@ -0,0 +1,45 @@
+//
+//  EBBannerViewController.m
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/23.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import "EBBannerViewController.h"
+
+@interface EBBannerViewController ()
+
+@end
+
+@implementation EBBannerViewController
+
+- (instancetype)init
+{
+    self = [self initWithNibName:@"EBBannerViewController" bundle:[NSBundle bundleForClass:self.class]];
+    if (self) {
+        
+    }
+    return self;
+}
+
+static UIInterfaceOrientationMask supportedOrientations;
+
++(void)setSupportedInterfaceOrientations:(UIInterfaceOrientationMask)orientations{
+    supportedOrientations = orientations;
+}
+
++(void)setStatusBarHidden:(BOOL)hidden{
+    statusBarHidden = hidden;
+}
+
+-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
+    return supportedOrientations;
+}
+
+static BOOL statusBarHidden;
+-(BOOL)prefersStatusBarHidden{
+    return statusBarHidden;
+}
+
+@end

+ 23 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewController.xib

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14269.12" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14252.5"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="EBBannerViewController">
+            <connections>
+                <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </view>
+    </objects>
+</document>

+ 47 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerViewMaker.m

@@ -0,0 +1,47 @@
+//
+//  EBBannerViewMaker.m
+//  EBBannerView
+//
+//  Created by wxc on 2017/11/27.
+//
+
+#import "EBBannerView.h"
+
+@implementation EBBannerViewMaker
+
++(instancetype)defaultMaker{
+    EBBannerViewMaker *maker = [EBBannerViewMaker new];
+    maker.style = MAX(UIDevice.currentDevice.systemVersion.intValue, 9);
+    maker.icon = [UIImage imageNamed:@"AppIcon40x40"] ?: [UIImage imageNamed:@"AppIcon60x60"] ?: [UIImage imageNamed:@"AppIcon80x80"] ?: [UIImage imageNamed:@"AppIcon"];
+    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
+    maker.title = [infoDictionary objectForKey:@"CFBundleDisplayName"] ?: [infoDictionary objectForKey:@"CFBundleName"];
+    maker.date = NSLocalizedString(@"现在", nil);
+    maker.content = @"";
+    maker.showAnimationDuration = 0.3;
+    maker.hideAnimationDuration = 0.5;
+    maker.stayDuration = 4;
+    maker.swipeDownStayDuration = 4;
+    maker.soundID = 1312;
+    maker.vibrateOnMute = YES;
+    maker.showDetailOrHideWhenClickLongText = YES;
+    return maker;
+}
+
+-(void)setStyle:(EBBannerViewStyle)style{
+    if (style < 9) {
+        _style = EBBannerViewStyleiOS9;
+    } else if (style > 12) {
+        _style = EBBannerViewStyleiOS12;
+    } else {
+        _style = style;
+    }
+}
+
+-(id)object{
+    if (!_object) {
+        _object = self.content.copy;
+    }
+    return _object;
+}
+
+@end

+ 15 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerWindow.h

@@ -0,0 +1,15 @@
+//
+//  EBBannerWindow.h
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/23.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface EBBannerWindow : UIWindow
+
++(instancetype)sharedWindow;
+
+@end

+ 100 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBBannerWindow.m

@@ -0,0 +1,100 @@
+//
+//  EBBannerWindow.m
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/23.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import "EBBannerWindow.h"
+#import "EBBannerViewController.h"
+#import "EBBannerView+Categories.h"
+#import "EBEmptyWindow.h"
+
+@implementation EBBannerWindow
+
+static EBBannerWindow *sharedWindow;
+static EBEmptyWindow *emptyWindow;
+
++(instancetype)sharedWindow{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        SEL sel = @selector(initWithWindowScene:);
+        if ([EBBannerWindow.new respondsToSelector:sel]) {
+            id obj = [UIApplication.sharedApplication.keyWindow valueForKey:@"windowScene"];
+            #pragma clang diagnostic push
+            #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+            sharedWindow = [[EBBannerWindow alloc] performSelector:sel withObject:obj];
+            #pragma clang diagnostic pop
+        } else {
+            // Fallback on earlier versions
+            sharedWindow = [[self alloc] initWithFrame:CGRectZero];
+        }
+        sharedWindow.windowLevel = UIWindowLevelAlert;
+        sharedWindow.layer.masksToBounds = NO;
+        UIWindow *originKeyWindow = UIApplication.sharedApplication.keyWindow;
+        [sharedWindow makeKeyAndVisible];
+        
+        /* fix bug:
+         EBBannerViewController setSupportedInterfaceOrientations -> Portrait
+         push to a VC with orientation Left
+         UITextFiled's pad will show a wrong orientation with Portrait
+         */
+        emptyWindow = [[EBEmptyWindow alloc] initWithFrame:CGRectZero];
+        emptyWindow.windowLevel = UIWindowLevelAlert;
+        [emptyWindow makeKeyAndVisible];
+        [originKeyWindow makeKeyAndVisible];
+        
+        [EBBannerViewController setSupportedInterfaceOrientations:UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscape];
+        [EBBannerViewController setStatusBarHidden:NO];
+        
+        EBBannerViewController *vc = [EBBannerViewController new];
+        vc.view.backgroundColor = [UIColor clearColor];
+        vc.view.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);
+        sharedWindow.rootViewController = vc;
+    });
+    return sharedWindow;
+}
+
+-(instancetype)initWithFrame:(CGRect)frame{
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
+    }
+    return self;
+}
+
+-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
+    __block UIView *view;
+    [self.rootViewController.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+        if (CGRectContainsPoint(obj.frame, point)) {
+            view = obj;
+        }
+    }];
+    if (view) {
+        CGPoint point1 = [self convertPoint:point toView:view];
+        return [view hitTest:point1 withEvent:event];
+    } else {
+        if (@available(iOS 13.0, *)) {
+            return [UIApplication.sharedApplication.keyWindow hitTest:point withEvent:event];
+        } else {
+            return [super hitTest:point withEvent:event];
+        }
+    }
+}
+
+-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
+    if ([keyPath isEqualToString:@"frame"] && !CGRectEqualToRect(self.frame, CGRectZero)) {
+        self.frame = CGRectZero;
+    }
+}
+
+-(void)dealloc{
+    if (@available(iOS 13.0, *)) {
+        
+    } else {
+        [self removeObserver:self forKeyPath:@"frame"];
+    }
+}
+
+@end

+ 240 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBCustomBannerView.m

@@ -0,0 +1,240 @@
+//
+//  EBCustomBannerView.m
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/20.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import "EBCustomBannerView.h"
+#import "EBBannerView.h"
+#import <AudioToolbox/AudioToolbox.h>
+#import "EBMuteDetector.h"
+#import "EBBannerWindow.h"
+#import "EBBannerView+Categories.h"
+
+@interface EBCustomBannerViewMaker()
+@property(nonatomic, strong)UIView *view;
+@end
+
+@implementation EBCustomBannerViewMaker
++(instancetype)makerWithView:(UIView*)view{
+    EBCustomBannerViewMaker *maker = [EBCustomBannerViewMaker new];
+    maker.portraitMode = EBCustomViewAppearModeTop;
+    maker.landscapeMode = EBCustomViewAppearModeTop;
+    maker.animationDuration = 0.3;
+    maker.stayDuration = 4.0;
+    maker.soundID = 0;
+    maker.view = view;
+    maker.landscapeFrame = view.frame;
+    maker.portraitFrame = view.frame;
+    maker.centerModeDurations = @[@0.3, @0.2, @0.1];
+    maker.vibrateOnMute = YES;
+    return maker;
+}
+@end
+
+@interface EBCustomBannerView()
+
+@property(nonatomic, strong)EBCustomBannerViewMaker *maker;
+
+@end
+
+@implementation EBCustomBannerView
+
+static NSMutableArray <EBCustomBannerView*>*sharedCustomViews;
+static EBBannerWindow *sharedWindow;
+
++(void)sharedCustomBannerViewInit{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedWindow = [EBBannerWindow sharedWindow];
+        sharedCustomViews = [NSMutableArray<EBCustomBannerView*> array];
+    });
+}
+
++(EBCustomBannerView*)showCustomView:(UIView*)view block:(void(^)(EBCustomBannerViewMaker *make))block{
+    EBCustomBannerView *bannerView = [EBCustomBannerView customView:view block:block];
+    [bannerView show];
+    return bannerView;
+}
+
+//make a custom view and show later
++(EBCustomBannerView*)customView:(UIView*)view block:(void(^)(EBCustomBannerViewMaker *make))block{
+    EBCustomBannerView *bannerView = [EBCustomBannerView new];
+    EBCustomBannerViewMaker *maker = [EBCustomBannerViewMaker makerWithView:view];
+    bannerView.maker = maker;
+    block(maker);
+    [[NSNotificationCenter defaultCenter] addObserver:bannerView selector:@selector(applicationDidChangeStatusBarOrientationNotification) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
+    return bannerView;
+}
+
+-(void)applicationDidChangeStatusBarOrientationNotification{
+    if (sharedCustomViews.count == 0) {
+        return;
+    }
+    if ([self currentIsLandscape]) {
+        [sharedCustomViews enumerateObjectsUsingBlock:^(EBCustomBannerView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+            obj.maker.view.frame = obj.maker.landscapeFrame;
+        }];
+    } else {
+        [sharedCustomViews enumerateObjectsUsingBlock:^(EBCustomBannerView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+            obj.maker.view.frame = obj.maker.portraitFrame;
+        }];
+    }
+}
+
+-(void)show{
+
+    [EBCustomBannerView sharedCustomBannerViewInit];
+    
+    [sharedCustomViews addObject:self];
+    
+    if (_maker.soundName || _maker.soundID != 0) {
+        SystemSoundID soundID;
+        if (_maker.soundName) {
+            NSURL *url = [[NSBundle mainBundle] URLForResource:_maker.soundName withExtension:nil];
+            AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
+        } else {
+            soundID = _maker.soundID;
+        }
+        WEAK_SELF(weakSelf);
+        [[EBMuteDetector sharedDetecotr] detectComplete:^(BOOL isMute) {
+            if (isMute && weakSelf.maker.vibrateOnMute) {
+                AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+            } else {
+                AudioServicesPlaySystemSound(soundID);
+            }
+        }];
+    }
+
+    [sharedWindow.rootViewController.view addSubview:_maker.view];
+
+    
+    if ([self currentAppearMode] == EBCustomViewAppearModeCenter) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            WEAK_SELF(weakSelf);
+            UIView *view = weakSelf.maker.view;
+            view.frame = [weakSelf showFrame];
+            view.alpha = 0;
+            [UIView animateWithDuration:weakSelf.maker.centerModeDurations[0].doubleValue animations:^{
+                view.alpha = 1;
+            }];
+            view.alpha = 0;
+            
+            view.layer.shouldRasterize = YES;
+            view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4);
+            [UIView animateWithDuration:weakSelf.maker.centerModeDurations[1].doubleValue animations:^{
+                view.alpha = 1;
+                view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
+            } completion:^(BOOL finished) {
+                [UIView animateWithDuration:weakSelf.maker.centerModeDurations[2].doubleValue delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+                    view.alpha = 1;
+                    view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
+                } completion:^(BOOL finished2) {
+                    view.layer.shouldRasterize = NO;
+                    if (weakSelf.maker.stayDuration > 0) {
+                        [NSTimer eb_scheduledTimerWithTimeInterval:weakSelf.maker.stayDuration block:^(NSTimer *timer) {
+                            [weakSelf hide];
+                        } repeats:NO];
+                    }
+                }];
+            }];
+        });
+    } else {
+        _maker.view.frame = [self hideFrame];
+        WEAK_SELF(weakSelf);
+        [UIView animateWithDuration:_maker.animationDuration animations:^{
+            weakSelf.maker.view.frame = [weakSelf showFrame];
+        } completion:^(BOOL finished) {
+            if (weakSelf.maker.stayDuration > 0) {
+                [NSTimer eb_scheduledTimerWithTimeInterval:weakSelf.maker.stayDuration block:^(NSTimer *timer) {
+                    [weakSelf hide];
+                } repeats:NO];
+            }
+        }];
+    }
+}
+
+-(void)hide{
+    if (!self.maker.view.superview) {
+        return;
+    }
+    if ([self currentAppearMode] == EBCustomViewAppearModeCenter) {
+        
+        dispatch_async(dispatch_get_main_queue(), ^{
+            WEAK_SELF(weakSelf);
+            UIView *view = weakSelf.maker.view;
+            [UIView animateWithDuration:weakSelf.maker.centerModeDurations[0].doubleValue animations:^{
+                view.alpha = 0;
+            }];
+            
+            view.layer.shouldRasterize = YES;
+            [UIView animateWithDuration:weakSelf.maker.centerModeDurations[2].doubleValue animations:^{
+                view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
+            } completion:^(BOOL finished){
+                [UIView animateWithDuration:weakSelf.maker.centerModeDurations[1].doubleValue delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
+                    view.alpha = 0;
+                    view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4);
+                } completion:^(BOOL finished){
+                    [view removeFromSuperview];
+                    [sharedCustomViews removeObject:weakSelf];
+                }];
+            }];
+        });
+        
+    } else {
+        WEAK_SELF(weakSelf);
+        [UIView animateWithDuration:_maker.animationDuration animations:^{
+            weakSelf.maker.view.frame = [weakSelf hideFrame];
+        } completion:^(BOOL finished) {
+            if (weakSelf.maker.view.superview) {
+                [weakSelf.maker.view removeFromSuperview];
+            }
+            if ([sharedCustomViews containsObject:weakSelf]) {
+                [sharedCustomViews removeObject:weakSelf];
+            }
+        }];
+    }
+}
+
+-(BOOL)currentIsLandscape{
+    return UIDeviceOrientationIsLandscape(UIDevice.currentDevice.orientation);
+}
+
+-(CGRect)showFrame{
+    return [self currentIsLandscape] ? _maker.landscapeFrame : _maker.portraitFrame;
+}
+
+-(CGRect)hideFrame{
+    CGRect hideFrame = [self showFrame];
+    switch ([self currentAppearMode]) {
+        case EBCustomViewAppearModeTop:
+            hideFrame.origin.y = -hideFrame.size.height;
+            break;
+        case EBCustomViewAppearModeLeft:
+            hideFrame.origin.x = -hideFrame.size.width;
+            break;
+        case EBCustomViewAppearModeRight:
+            hideFrame.origin.x = ScreenWidth + hideFrame.size.width;
+            break;
+        case EBCustomViewAppearModeBottom:
+            hideFrame.origin.y = ScreenHeight;
+            break;
+        case EBCustomViewAppearModeCenter:
+            break;
+        default:
+            break;
+    }
+    return hideFrame;
+}
+
+-(EBCustomBannerViewAppearMode)currentAppearMode{
+    return [self currentIsLandscape] ? _maker.landscapeMode : _maker.portraitMode;
+}
+
+-(void)dealloc{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+@end

+ 12 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBEmptyWindow.h

@@ -0,0 +1,12 @@
+//
+//  EBEmptyWindow.h
+//  EBBannerView
+//
+//  Created by WTSD on 2018/1/10.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface EBEmptyWindow : UIWindow
+
+@end

+ 16 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBEmptyWindow.m

@@ -0,0 +1,16 @@
+//
+//  EBEmptyWindow.m
+//  EBBannerView
+//
+//  Created by WTSD on 2018/1/10.
+//
+
+#import "EBEmptyWindow.h"
+
+@implementation EBEmptyWindow
+
+-(UIWindowLevel)windowLevel{
+    return UIWindowLevelAlert;
+}
+
+@end

+ 16 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.h

@@ -0,0 +1,16 @@
+//
+//  EBMuteSwitchDetector.h
+//
+//  Created by 57380422@qq.com on 6/2/13.
+//  Copyright (c) 2013 57380422@qq.com. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface EBMuteDetector : NSObject
+
++(EBMuteDetector*)sharedDetecotr;
+
+-(void)detectComplete:(void (^)(BOOL isMute))completionHandler;
+
+@end

+ 63 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.m

@@ -0,0 +1,63 @@
+//
+//  EBMuteSwitchDetector.m
+//
+//  Created by 57380422@qq.comon 6/2/13.
+//  Copyright (c) 2013 57380422@qq.com. All rights reserved.
+//
+
+#import "EBMuteDetector.h"
+#import <AudioToolbox/AudioToolbox.h>
+#import <UIKit/UIKit.h>
+
+@interface EBMuteDetector()
+
+@property (nonatomic,assign) NSTimeInterval interval;
+
+@property (nonatomic,assign) SystemSoundID soundId;
+
+
+typedef void (^DetectCompleteBlock)(BOOL isMute);
+
+@property(nonatomic, copy)DetectCompleteBlock completeBlock;
+
+@end
+
+@implementation EBMuteDetector
+
+void EBSoundMuteNotificationCompletionProc(SystemSoundID  ssID,void* clientData){
+    NSTimeInterval elapsed = [NSDate timeIntervalSinceReferenceDate] - [EBMuteDetector sharedDetecotr].interval;
+    BOOL isMute = elapsed < 0.1;
+    [EBMuteDetector sharedDetecotr].completeBlock(isMute);
+}
+
++(EBMuteDetector*)sharedDetecotr{
+    static EBMuteDetector* sharedDetecotr = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedDetecotr = [EBMuteDetector new];
+        NSURL* url = [[NSBundle bundleForClass:[self class]] URLForResource:@"EBMuteDetector" withExtension:@"mp3"];
+        if (AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &sharedDetecotr->_soundId) == kAudioServicesNoError) {
+            AudioServicesAddSystemSoundCompletion(sharedDetecotr.soundId, CFRunLoopGetMain(), kCFRunLoopDefaultMode, EBSoundMuteNotificationCompletionProc,(__bridge void *)(self));
+            UInt32 yes = 1;
+            AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(sharedDetecotr.soundId),&sharedDetecotr->_soundId,sizeof(yes), &yes);
+        } else {
+            sharedDetecotr.soundId = -1;
+        }
+    });
+    return sharedDetecotr;
+}
+
+-(void)detectComplete:(void (^)(BOOL isMute))completionHandler{
+    self.interval = [NSDate timeIntervalSinceReferenceDate];
+    AudioServicesPlaySystemSound(self.soundId);
+    self.completeBlock = completionHandler;
+}
+
+-(void)dealloc{
+    if (self.soundId != -1) {
+        AudioServicesRemoveSystemSoundCompletion(self.soundId);
+        AudioServicesDisposeSystemSoundID(self.soundId);
+    }
+}
+
+@end

BIN
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBMuteDetector.mp3


+ 590 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/Classes/EBSystemBannerView.xib

@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view clipsSubviews="YES" tag="9" contentMode="scaleToFill" id="iN0-l3-epB" userLabel="Banner View iOS 9" customClass="EBSystemBannerView" customModule="EBBannerViewSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="70"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SfK-LV-meM">
+                    <rect key="frame" x="41" y="6" width="30" height="17"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="17" id="1Ya-dU-30P"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="14"/>
+                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zvg-9L-jbZ">
+                    <rect key="frame" x="251" y="6" width="29" height="17"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="0.53333333333333333" green="0.62745098039215685" blue="0.11764705882352941" alpha="0.89562821061643838" colorSpace="custom" customColorSpace="sRGB"/>
+                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                </label>
+                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="3LX-GO-ytA">
+                    <rect key="frame" x="13" y="6" width="20" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="BBu-Jj-Rh8"/>
+                        <constraint firstAttribute="width" constant="20" id="QrM-O5-XqR"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </imageView>
+                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3XN-Ja-hWT">
+                    <rect key="frame" x="140" y="63" width="40" height="4"/>
+                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="0.20034246575342465" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="40" id="1aX-v6-8T6"/>
+                        <constraint firstAttribute="height" constant="4" id="5KV-c9-Tif"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="2"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8ye-hb-Ujc">
+                    <rect key="frame" x="41" y="23" width="239" height="17"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+            </subviews>
+            <color key="backgroundColor" red="0.078431372549019607" green="0.078431372549019607" blue="0.078431372549019607" alpha="0.90000000000000002" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="8" id="BXv-cQ-3ZT"/>
+                <constraint firstAttribute="trailing" secondItem="Zvg-9L-jbZ" secondAttribute="trailing" constant="40" id="G4g-N7-H4b"/>
+                <constraint firstItem="3LX-GO-ytA" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="6" id="GxO-lE-YJA"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="top" secondItem="SfK-LV-meM" secondAttribute="bottom" id="Gz1-Qc-GNi"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="top" secondItem="3LX-GO-ytA" secondAttribute="top" id="JPh-tI-rj4"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="SfK-LV-meM" secondAttribute="trailing" constant="8" id="OW3-cd-zZC"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="leading" secondItem="3LX-GO-ytA" secondAttribute="trailing" constant="8" id="Qb9-64-hfw"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="Waa-2j-xe4"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="leading" secondItem="3LX-GO-ytA" secondAttribute="trailing" constant="8" id="aTf-wq-Ws9"/>
+                <constraint firstItem="Zvg-9L-jbZ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="bHt-Ad-hfF"/>
+                <constraint firstAttribute="trailing" secondItem="8ye-hb-Ujc" secondAttribute="trailing" constant="40" id="fDh-qF-nJe"/>
+                <constraint firstItem="8ye-hb-Ujc" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="lPh-fk-lzq"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="lcx-9u-222"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="top" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="8" id="qAC-Xv-WQv"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="top" relation="greaterThanOrEqual" secondItem="8ye-hb-Ujc" secondAttribute="bottom" constant="6" id="qDp-vB-zTt"/>
+                <constraint firstAttribute="bottom" secondItem="3XN-Ja-hWT" secondAttribute="bottom" constant="3" id="sho-ap-o8h"/>
+                <constraint firstItem="SfK-LV-meM" firstAttribute="top" secondItem="3LX-GO-ytA" secondAttribute="top" id="u7N-vZ-i4s"/>
+                <constraint firstItem="3LX-GO-ytA" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="13" id="wWH-dS-9mc"/>
+                <constraint firstItem="3XN-Ja-hWT" firstAttribute="leading" secondItem="SfK-LV-meM" secondAttribute="trailing" constant="8" id="yrd-Oa-94U"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <userDefinedRuntimeAttributes>
+                <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+            </userDefinedRuntimeAttributes>
+            <variation key="default">
+                <mask key="constraints">
+                    <exclude reference="Waa-2j-xe4"/>
+                    <exclude reference="BXv-cQ-3ZT"/>
+                    <exclude reference="lPh-fk-lzq"/>
+                    <exclude reference="qAC-Xv-WQv"/>
+                    <exclude reference="yrd-Oa-94U"/>
+                    <exclude reference="bHt-Ad-hfF"/>
+                </mask>
+            </variation>
+            <connections>
+                <outlet property="contentLabel" destination="8ye-hb-Ujc" id="nhc-Vl-3mK"/>
+                <outlet property="dateLabel" destination="Zvg-9L-jbZ" id="Vpm-ct-bdR"/>
+                <outlet property="imageView" destination="3LX-GO-ytA" id="B0I-o4-24Z"/>
+                <outlet property="lineView" destination="3XN-Ja-hWT" id="Roq-j6-DrO"/>
+                <outlet property="titleLabel" destination="SfK-LV-meM" id="uUD-XF-aci"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="-139.5"/>
+        </view>
+        <view clipsSubviews="YES" tag="10" contentMode="scaleToFill" id="FuQ-h0-Tnu" userLabel="Banner View iOS 10" customClass="EBSystemBannerView" customModule="EBBannerViewSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7yW-Dq-ZqA">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JiX-vA-bbX">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cdU-tQ-e7r">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="M5S-BA-9WJ">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="HqN-D2-fqn"/>
+                                        <constraint firstAttribute="width" constant="20" id="Y2u-jL-wNA"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0d1-ud-Cqn">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="cdU-tQ-e7r" firstAttribute="centerY" secondItem="M5S-BA-9WJ" secondAttribute="centerY" id="6Re-zk-fCe"/>
+                                <constraint firstItem="0d1-ud-Cqn" firstAttribute="centerY" secondItem="M5S-BA-9WJ" secondAttribute="centerY" id="FfH-Kn-g9V"/>
+                                <constraint firstAttribute="height" constant="36" id="Iu4-jB-01O"/>
+                                <constraint firstAttribute="trailing" secondItem="0d1-ud-Cqn" secondAttribute="trailing" constant="16" id="Vf8-BT-Lc4"/>
+                                <constraint firstItem="M5S-BA-9WJ" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="top" constant="8" id="eXj-Cu-ed5"/>
+                                <constraint firstItem="M5S-BA-9WJ" firstAttribute="leading" secondItem="JiX-vA-bbX" secondAttribute="leading" constant="8" id="f3J-Xz-Vuk"/>
+                                <constraint firstItem="cdU-tQ-e7r" firstAttribute="leading" secondItem="M5S-BA-9WJ" secondAttribute="trailing" constant="8" id="r3l-6p-bD1"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ggN-eQ-t44">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PlN-Fu-byf">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NF0-Jl-Zb9" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.792156862745098" green="0.792156862745098" blue="0.792156862745098" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="EpJ-gN-cOO"/>
+                                        <constraint firstAttribute="width" constant="40" id="jSQ-Il-7hO"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.93333333330000001" green="0.93333333330000001" blue="0.93333333330000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="PlN-Fu-byf" firstAttribute="leading" secondItem="ggN-eQ-t44" secondAttribute="leading" constant="15" id="7IU-4e-1iU"/>
+                                <constraint firstAttribute="bottom" secondItem="NF0-Jl-Zb9" secondAttribute="bottom" constant="3" id="KaL-RE-UI0"/>
+                                <constraint firstItem="NF0-Jl-Zb9" firstAttribute="centerX" secondItem="ggN-eQ-t44" secondAttribute="centerX" id="bg1-eG-9DB"/>
+                                <constraint firstItem="NF0-Jl-Zb9" firstAttribute="top" relation="greaterThanOrEqual" secondItem="PlN-Fu-byf" secondAttribute="bottom" constant="6" id="e51-ht-XRX"/>
+                                <constraint firstAttribute="bottom" secondItem="PlN-Fu-byf" secondAttribute="bottom" constant="8" id="i37-lN-GSM"/>
+                                <constraint firstAttribute="trailing" secondItem="PlN-Fu-byf" secondAttribute="trailing" constant="8" id="mni-O1-Wrk"/>
+                                <constraint firstItem="PlN-Fu-byf" firstAttribute="centerY" secondItem="ggN-eQ-t44" secondAttribute="centerY" id="tc3-dv-lKE"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="i37-lN-GSM"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="JiX-vA-bbX" firstAttribute="leading" secondItem="7yW-Dq-ZqA" secondAttribute="leading" id="1aT-Ok-ixh"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="bottom" id="R3Y-8L-Ouf"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="leading" secondItem="7yW-Dq-ZqA" secondAttribute="leading" id="Rfu-a2-KpF"/>
+                        <constraint firstItem="JiX-vA-bbX" firstAttribute="top" secondItem="7yW-Dq-ZqA" secondAttribute="top" id="Yoj-eJ-mau"/>
+                        <constraint firstAttribute="trailing" secondItem="ggN-eQ-t44" secondAttribute="trailing" id="c9F-3I-neS"/>
+                        <constraint firstAttribute="trailing" secondItem="JiX-vA-bbX" secondAttribute="trailing" id="evQ-GU-L9x"/>
+                        <constraint firstItem="ggN-eQ-t44" firstAttribute="top" secondItem="JiX-vA-bbX" secondAttribute="bottom" id="vZB-u0-kJK"/>
+                        <constraint firstAttribute="bottom" secondItem="ggN-eQ-t44" secondAttribute="bottom" id="ygp-U0-FHa"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="7yW-Dq-ZqA" secondAttribute="trailing" constant="8" id="0h1-xp-uVn"/>
+                <constraint firstItem="7yW-Dq-ZqA" firstAttribute="leading" secondItem="FuQ-h0-Tnu" secondAttribute="leading" constant="8" id="bHy-zK-tmO"/>
+                <constraint firstAttribute="bottom" secondItem="7yW-Dq-ZqA" secondAttribute="bottom" constant="8" id="faZ-82-wWt"/>
+                <constraint firstItem="7yW-Dq-ZqA" firstAttribute="top" secondItem="FuQ-h0-Tnu" secondAttribute="top" constant="8" id="r3K-xa-ISG"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="PlN-Fu-byf" id="FYl-Qw-U0i"/>
+                <outlet property="dateLabel" destination="0d1-ud-Cqn" id="6wJ-K8-JKG"/>
+                <outlet property="imageView" destination="M5S-BA-9WJ" id="QyC-qP-gbo"/>
+                <outlet property="lineView" destination="NF0-Jl-Zb9" id="Z5f-fc-wUB"/>
+                <outlet property="titleLabel" destination="cdU-tQ-e7r" id="cq0-yc-9hf"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="5"/>
+        </view>
+        <view clipsSubviews="YES" tag="11" contentMode="scaleToFill" id="bKA-bm-N9w" userLabel="Banner View iOS 11" customClass="EBSystemBannerView" customModule="EBBannerViewSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kDy-gB-6fk">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tRG-wn-Jup">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xxL-Ex-JLB">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="cJO-Wj-HZ3">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="kk5-4M-aEB"/>
+                                        <constraint firstAttribute="height" constant="20" id="u8v-4K-trn"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F1q-Ut-WQc">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="xxL-Ex-JLB" firstAttribute="leading" secondItem="cJO-Wj-HZ3" secondAttribute="trailing" constant="8" id="0aD-GM-GHe"/>
+                                <constraint firstAttribute="trailing" secondItem="F1q-Ut-WQc" secondAttribute="trailing" constant="16" id="1D7-dr-a2I"/>
+                                <constraint firstItem="cJO-Wj-HZ3" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="top" constant="8" id="IFd-GC-ruQ"/>
+                                <constraint firstAttribute="height" constant="36" id="WSg-lQ-Luk"/>
+                                <constraint firstItem="xxL-Ex-JLB" firstAttribute="centerY" secondItem="cJO-Wj-HZ3" secondAttribute="centerY" id="il4-b9-Xvt"/>
+                                <constraint firstItem="F1q-Ut-WQc" firstAttribute="centerY" secondItem="cJO-Wj-HZ3" secondAttribute="centerY" id="vWV-18-Elp"/>
+                                <constraint firstItem="cJO-Wj-HZ3" firstAttribute="leading" secondItem="tRG-wn-Jup" secondAttribute="leading" constant="8" id="yC9-xZ-VW4"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JIx-cL-R5w">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qui-ab-szz">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UMP-J1-Z5p" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.792156862745098" green="0.792156862745098" blue="0.792156862745098" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="40" id="iFl-gs-CFT"/>
+                                        <constraint firstAttribute="height" constant="4" id="rZJ-Kb-Qm2"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431372549022" green="0.96078431372549022" blue="0.96078431372549022" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="qui-ab-szz" firstAttribute="leading" secondItem="JIx-cL-R5w" secondAttribute="leading" constant="15" id="51P-kJ-o26"/>
+                                <constraint firstItem="UMP-J1-Z5p" firstAttribute="top" relation="greaterThanOrEqual" secondItem="qui-ab-szz" secondAttribute="bottom" constant="6" id="Hrv-ul-evk"/>
+                                <constraint firstItem="UMP-J1-Z5p" firstAttribute="centerX" secondItem="JIx-cL-R5w" secondAttribute="centerX" id="NcZ-GP-ste"/>
+                                <constraint firstItem="qui-ab-szz" firstAttribute="centerY" secondItem="JIx-cL-R5w" secondAttribute="centerY" id="W7g-jr-cZq"/>
+                                <constraint firstAttribute="trailing" secondItem="qui-ab-szz" secondAttribute="trailing" constant="8" id="ZcQ-1U-vaz"/>
+                                <constraint firstAttribute="bottom" secondItem="qui-ab-szz" secondAttribute="bottom" constant="8" id="btp-Ie-xzC"/>
+                                <constraint firstAttribute="bottom" secondItem="UMP-J1-Z5p" secondAttribute="bottom" constant="3" id="mqI-HI-Uvi"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="btp-Ie-xzC"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="JIx-cL-R5w" secondAttribute="trailing" id="1Uc-6J-zrf"/>
+                        <constraint firstAttribute="bottom" secondItem="JIx-cL-R5w" secondAttribute="bottom" id="4Oa-UV-nZ7"/>
+                        <constraint firstItem="tRG-wn-Jup" firstAttribute="leading" secondItem="kDy-gB-6fk" secondAttribute="leading" id="ODE-xP-bSI"/>
+                        <constraint firstAttribute="trailing" secondItem="tRG-wn-Jup" secondAttribute="trailing" id="Tap-la-AQj"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="bottom" id="bnr-d6-HWe"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="top" secondItem="tRG-wn-Jup" secondAttribute="bottom" id="jxg-AT-8hu"/>
+                        <constraint firstItem="JIx-cL-R5w" firstAttribute="leading" secondItem="kDy-gB-6fk" secondAttribute="leading" id="tGd-WN-h6d"/>
+                        <constraint firstItem="tRG-wn-Jup" firstAttribute="top" secondItem="kDy-gB-6fk" secondAttribute="top" id="wwZ-rp-dHj"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="kDy-gB-6fk" secondAttribute="bottom" constant="8" id="8GH-DP-XwZ"/>
+                <constraint firstItem="kDy-gB-6fk" firstAttribute="leading" secondItem="bKA-bm-N9w" secondAttribute="leading" constant="8" id="FOv-eX-p3M"/>
+                <constraint firstItem="kDy-gB-6fk" firstAttribute="top" secondItem="bKA-bm-N9w" secondAttribute="top" constant="8" id="NiU-8g-cou"/>
+                <constraint firstAttribute="trailing" secondItem="kDy-gB-6fk" secondAttribute="trailing" constant="8" id="urX-DG-gKm"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="qui-ab-szz" id="SW9-kM-NyX"/>
+                <outlet property="dateLabel" destination="F1q-Ut-WQc" id="y9F-s9-QdU"/>
+                <outlet property="imageView" destination="cJO-Wj-HZ3" id="Efj-HW-sCT"/>
+                <outlet property="lineView" destination="UMP-J1-Z5p" id="xJV-4N-lwj"/>
+                <outlet property="titleLabel" destination="xxL-Ex-JLB" id="efy-Vt-f9t"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="150.5"/>
+        </view>
+        <view clipsSubviews="YES" tag="12" contentMode="scaleToFill" id="ZcT-r6-Sxd" userLabel="Banner View iOS 12" customClass="EBSystemBannerView" customModule="EBBannerViewSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iBt-iM-2Fl">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JIy-WU-xdA">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gX9-ee-ILZ">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="DyH-1Y-Gbr">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="cCu-CS-iLg"/>
+                                        <constraint firstAttribute="width" constant="20" id="kib-OM-EJA"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Pkw-x6-qHt">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="Pkw-x6-qHt" firstAttribute="centerY" secondItem="DyH-1Y-Gbr" secondAttribute="centerY" id="C5E-sl-K4s"/>
+                                <constraint firstItem="DyH-1Y-Gbr" firstAttribute="leading" secondItem="JIy-WU-xdA" secondAttribute="leading" constant="8" id="FxO-VY-KvG"/>
+                                <constraint firstItem="gX9-ee-ILZ" firstAttribute="centerY" secondItem="DyH-1Y-Gbr" secondAttribute="centerY" id="ZI0-NQ-FWq"/>
+                                <constraint firstItem="DyH-1Y-Gbr" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="top" constant="8" id="abe-cH-aVv"/>
+                                <constraint firstAttribute="trailing" secondItem="Pkw-x6-qHt" secondAttribute="trailing" constant="16" id="dkm-ov-e64"/>
+                                <constraint firstItem="gX9-ee-ILZ" firstAttribute="leading" secondItem="DyH-1Y-Gbr" secondAttribute="trailing" constant="8" id="gUJ-5C-hPZ"/>
+                                <constraint firstAttribute="height" constant="36" id="yiY-Jo-Px8"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Gba-7L-W4P">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eiZ-aE-wUX">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mkj-V8-ZAo" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.79215686269999996" green="0.79215686269999996" blue="0.79215686269999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="3YQ-ch-S8x"/>
+                                        <constraint firstAttribute="width" constant="40" id="uaJ-wL-giY"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="mkj-V8-ZAo" firstAttribute="top" relation="greaterThanOrEqual" secondItem="eiZ-aE-wUX" secondAttribute="bottom" constant="6" id="2pp-Mr-Jfe"/>
+                                <constraint firstItem="eiZ-aE-wUX" firstAttribute="centerY" secondItem="Gba-7L-W4P" secondAttribute="centerY" id="3ox-fa-6RA"/>
+                                <constraint firstAttribute="trailing" secondItem="eiZ-aE-wUX" secondAttribute="trailing" constant="8" id="DI9-9h-ChM"/>
+                                <constraint firstItem="mkj-V8-ZAo" firstAttribute="centerX" secondItem="Gba-7L-W4P" secondAttribute="centerX" id="DuD-eh-Wjo"/>
+                                <constraint firstAttribute="bottom" secondItem="mkj-V8-ZAo" secondAttribute="bottom" constant="3" id="UKU-ak-eFg"/>
+                                <constraint firstAttribute="bottom" secondItem="eiZ-aE-wUX" secondAttribute="bottom" constant="8" id="b2e-3U-A0z"/>
+                                <constraint firstItem="eiZ-aE-wUX" firstAttribute="leading" secondItem="Gba-7L-W4P" secondAttribute="leading" constant="15" id="gNb-6h-Q4b"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="b2e-3U-A0z"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstAttribute="trailing" secondItem="Gba-7L-W4P" secondAttribute="trailing" id="CEF-AD-MRQ"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="bottom" id="Ccw-fP-Pr0"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="leading" secondItem="iBt-iM-2Fl" secondAttribute="leading" id="ITc-vt-kLf"/>
+                        <constraint firstItem="JIy-WU-xdA" firstAttribute="leading" secondItem="iBt-iM-2Fl" secondAttribute="leading" id="KT1-zf-JnH"/>
+                        <constraint firstAttribute="bottom" secondItem="Gba-7L-W4P" secondAttribute="bottom" id="OIk-gt-YX0"/>
+                        <constraint firstAttribute="trailing" secondItem="JIy-WU-xdA" secondAttribute="trailing" id="ceP-Mx-1qv"/>
+                        <constraint firstItem="Gba-7L-W4P" firstAttribute="top" secondItem="JIy-WU-xdA" secondAttribute="bottom" id="fv3-91-3WM"/>
+                        <constraint firstItem="JIy-WU-xdA" firstAttribute="top" secondItem="iBt-iM-2Fl" secondAttribute="top" id="gro-bP-tgA"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="iBt-iM-2Fl" secondAttribute="bottom" constant="8" id="56T-aF-6c4"/>
+                <constraint firstAttribute="trailing" secondItem="iBt-iM-2Fl" secondAttribute="trailing" constant="8" id="Kod-Na-IZP"/>
+                <constraint firstItem="iBt-iM-2Fl" firstAttribute="top" secondItem="ZcT-r6-Sxd" secondAttribute="top" constant="8" id="NDb-Fe-3pc"/>
+                <constraint firstItem="iBt-iM-2Fl" firstAttribute="leading" secondItem="ZcT-r6-Sxd" secondAttribute="leading" constant="8" id="sik-Le-kHA"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="eiZ-aE-wUX" id="IO8-xi-uWs"/>
+                <outlet property="dateLabel" destination="Pkw-x6-qHt" id="6pe-kJ-aLk"/>
+                <outlet property="imageView" destination="DyH-1Y-Gbr" id="uPD-hM-8id"/>
+                <outlet property="lineView" destination="mkj-V8-ZAo" id="YjZ-Ma-Eex"/>
+                <outlet property="titleLabel" destination="gX9-ee-ILZ" id="Cim-tS-YqF"/>
+            </connections>
+            <point key="canvasLocation" x="82" y="290"/>
+        </view>
+        <view clipsSubviews="YES" tag="13" contentMode="scaleToFill" id="EMB-ot-5Qb" userLabel="Banner View iOS 13" customClass="EBSystemBannerView" customModule="EBBannerViewSwift" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="c3p-F4-rmc">
+                    <rect key="frame" x="8" y="8" width="304" height="74"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="isa-ao-cnZ">
+                            <rect key="frame" x="0.0" y="0.0" width="304" height="36"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mZq-cc-z7r">
+                                    <rect key="frame" x="36" y="9.5" width="28.5" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yZL-Wp-6pz">
+                                    <rect key="frame" x="8" y="8" width="20" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="20" id="GXZ-SS-AzU"/>
+                                        <constraint firstAttribute="height" constant="20" id="Pz4-XG-WZ1"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="5"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="现在" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Zfw-Lf-1vq">
+                                    <rect key="frame" x="259" y="9.5" width="29" height="17"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="yZL-Wp-6pz" firstAttribute="leading" secondItem="isa-ao-cnZ" secondAttribute="leading" constant="8" id="4Ag-Qg-4Kq"/>
+                                <constraint firstAttribute="trailing" secondItem="Zfw-Lf-1vq" secondAttribute="trailing" constant="16" id="7Tj-fl-1rf"/>
+                                <constraint firstAttribute="height" constant="36" id="P0Y-bm-cHn"/>
+                                <constraint firstItem="mZq-cc-z7r" firstAttribute="centerY" secondItem="yZL-Wp-6pz" secondAttribute="centerY" id="b0V-EV-z1p"/>
+                                <constraint firstItem="mZq-cc-z7r" firstAttribute="leading" secondItem="yZL-Wp-6pz" secondAttribute="trailing" constant="8" id="bh8-HO-abY"/>
+                                <constraint firstItem="Zfw-Lf-1vq" firstAttribute="centerY" secondItem="yZL-Wp-6pz" secondAttribute="centerY" id="ct2-h1-NK5"/>
+                                <constraint firstItem="yZL-Wp-6pz" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="top" constant="8" id="tew-s1-oPz"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8gr-41-q3Y">
+                            <rect key="frame" x="0.0" y="36" width="304" height="38"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Content" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OgR-iC-uzK">
+                                    <rect key="frame" x="15" y="13" width="281" height="12"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DpU-UI-PtJ" userLabel="line">
+                                    <rect key="frame" x="132" y="31" width="40" height="4"/>
+                                    <color key="backgroundColor" red="0.79215686269999996" green="0.79215686269999996" blue="0.79215686269999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="4" id="FMz-5v-vrV"/>
+                                        <constraint firstAttribute="width" constant="40" id="Fnh-O2-pDg"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                                            <integer key="value" value="2"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" red="0.96078431369999995" green="0.96078431369999995" blue="0.96078431369999995" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="OgR-iC-uzK" firstAttribute="centerY" secondItem="8gr-41-q3Y" secondAttribute="centerY" id="3Vr-sT-qcV"/>
+                                <constraint firstItem="OgR-iC-uzK" firstAttribute="leading" secondItem="8gr-41-q3Y" secondAttribute="leading" constant="15" id="I5W-IB-jBi"/>
+                                <constraint firstAttribute="bottom" secondItem="OgR-iC-uzK" secondAttribute="bottom" constant="8" id="Y7l-hP-MJ3"/>
+                                <constraint firstItem="DpU-UI-PtJ" firstAttribute="centerX" secondItem="8gr-41-q3Y" secondAttribute="centerX" id="exa-IT-7IG"/>
+                                <constraint firstAttribute="bottom" secondItem="DpU-UI-PtJ" secondAttribute="bottom" constant="3" id="iyn-aS-8f6"/>
+                                <constraint firstAttribute="trailing" secondItem="OgR-iC-uzK" secondAttribute="trailing" constant="8" id="k3i-ur-eoU"/>
+                                <constraint firstItem="DpU-UI-PtJ" firstAttribute="top" relation="greaterThanOrEqual" secondItem="OgR-iC-uzK" secondAttribute="bottom" constant="6" id="mfW-p1-MJv"/>
+                            </constraints>
+                            <variation key="default">
+                                <mask key="constraints">
+                                    <exclude reference="Y7l-hP-MJ3"/>
+                                </mask>
+                            </variation>
+                        </view>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="bottom" id="D5l-k7-495"/>
+                        <constraint firstItem="isa-ao-cnZ" firstAttribute="top" secondItem="c3p-F4-rmc" secondAttribute="top" id="LVI-93-SbU"/>
+                        <constraint firstAttribute="bottom" secondItem="8gr-41-q3Y" secondAttribute="bottom" id="amY-ys-yT4"/>
+                        <constraint firstAttribute="trailing" secondItem="8gr-41-q3Y" secondAttribute="trailing" id="fSY-vZ-ev8"/>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="top" secondItem="isa-ao-cnZ" secondAttribute="bottom" id="t0M-Nf-gHr"/>
+                        <constraint firstItem="isa-ao-cnZ" firstAttribute="leading" secondItem="c3p-F4-rmc" secondAttribute="leading" id="tVD-AS-Gz2"/>
+                        <constraint firstAttribute="trailing" secondItem="isa-ao-cnZ" secondAttribute="trailing" id="wXp-ji-ogN"/>
+                        <constraint firstItem="8gr-41-q3Y" firstAttribute="leading" secondItem="c3p-F4-rmc" secondAttribute="leading" id="xF3-RL-v1F"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
+                        <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+                            <integer key="value" value="12"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="c3p-F4-rmc" secondAttribute="bottom" constant="8" id="44Y-Y8-rQ6"/>
+                <constraint firstItem="c3p-F4-rmc" firstAttribute="top" secondItem="EMB-ot-5Qb" secondAttribute="top" constant="8" id="5Jk-BX-xtT"/>
+                <constraint firstItem="c3p-F4-rmc" firstAttribute="leading" secondItem="EMB-ot-5Qb" secondAttribute="leading" constant="8" id="lQ4-zG-S7O"/>
+                <constraint firstAttribute="trailing" secondItem="c3p-F4-rmc" secondAttribute="trailing" constant="8" id="mN8-Xw-AOQ"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="contentLabel" destination="OgR-iC-uzK" id="moz-Gh-sjO"/>
+                <outlet property="dateLabel" destination="Zfw-Lf-1vq" id="Sq9-nO-po9"/>
+                <outlet property="imageView" destination="yZL-Wp-6pz" id="8i4-7S-G9z"/>
+                <outlet property="lineView" destination="DpU-UI-PtJ" id="UTL-UO-wqe"/>
+                <outlet property="titleLabel" destination="mZq-cc-z7r" id="3tC-1e-0Hq"/>
+            </connections>
+            <point key="canvasLocation" x="81" y="395"/>
+        </view>
+    </objects>
+</document>

+ 62 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBBannerView.h

@@ -0,0 +1,62 @@
+//
+//  EBBannerView.h
+//  iOS-Foreground-Push-Notification
+//
+//  Created by pikacode@qq.com on 16/7/21.
+//  Copyright © 2016年 57380422@qq.com. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef enum : NSInteger {
+    EBBannerViewStyleiOS8 = 8,
+    EBBannerViewStyleiOS9 = 9,
+    EBBannerViewStyleiOS10 = 10,
+    EBBannerViewStyleiOS11 = 11,
+    EBBannerViewStyleiOS12 = 12
+} EBBannerViewStyle;
+
+@protocol EBCustomBannerViewProtocol;
+@class EBCustomBannerView, EBBannerViewMaker;
+
+@interface EBBannerView : UIView
+
+//show system version style with default values
++(void)showWithContent:(NSString*)content;
+
+//get a specific style banner, customize values below, then call 'show'
++(instancetype)bannerWithBlock:(void(^)(EBBannerViewMaker *make))block;
+-(void)show;
+
+//u don't have to call hide, this only use for (long_text && forbidAutoHiddenWhenSwipeDown = YES)
+-(void)hide;
+
++(instancetype)current;//can be nil
+
+@end
+
+@interface EBBannerViewMaker : NSObject
+
+@property(nonatomic, assign)EBBannerViewStyle style;//default is UIDevice.currentDevice.systemVersion.intValue
+@property(nonatomic, strong)UIImage  *icon;//default is app icon
+@property(nonatomic, strong)NSString *title;//default is app name
+@property(nonatomic, strong)NSString *date;//default is "now" = "现在"
+@property(nonatomic, strong)NSString *content;
+@property(nonatomic, assign)NSTimeInterval showAnimationDuration;//default is 0.3
+@property(nonatomic, assign)NSTimeInterval hideAnimationDuration;//default is 0.5
+@property(nonatomic, assign)NSTimeInterval stayDuration;//default is 4.0
+@property(nonatomic, assign)NSTimeInterval swipeDownStayDuration;//default is 4.0
+@property(nonatomic, strong)id object;//default is content
+@property(nonatomic, assign)UInt32 soundID;//default is 1312
+@property(nonatomic, strong)NSString *soundName;
+@property(nonatomic, assign)BOOL vibrateOnMute;//default is YES
+@property(nonatomic, assign)BOOL showDetailOrHideWhenClickLongText;//default is YES showDetail
+
++(instancetype)defaultMaker;
+
+@end
+
+//add observer for this notification to handle tap event and get the 'object' above
+extern NSString *const EBBannerViewDidClickNotification;//监听点击弹窗的事件
+
+ 

+ 16 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBBannerViewController.h

@@ -0,0 +1,16 @@
+//
+//  EBBannerViewController.h
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/23.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface EBBannerViewController : UIViewController
+
++(void)setSupportedInterfaceOrientations:(UIInterfaceOrientationMask)orientations;
++(void)setStatusBarHidden:(BOOL)hidden;
+
+@end

+ 48 - 0
Jianbinglian/Lib(第三方库)/EBBannerView(前台通知栏)/EBCustomBannerView.h

@@ -0,0 +1,48 @@
+//
+//  EBCustomBannerView.h
+//  demo
+//
+//  Created by pikacode@qq.com on 2017/10/20.
+//  Copyright © 2017年 pikacode@qq.com. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef enum : NSUInteger {
+    EBCustomViewAppearModeTop,//default
+    EBCustomViewAppearModeLeft,
+    EBCustomViewAppearModeRight,
+    EBCustomViewAppearModeBottom,
+    EBCustomViewAppearModeCenter
+} EBCustomBannerViewAppearMode;
+
+@class EBCustomBannerViewMaker;
+@interface EBCustomBannerView : NSObject
+
+//make a custom view and show immediately,
++(instancetype)showCustomView:(UIView*)view block:(void(^)(EBCustomBannerViewMaker *make))block;
+
+//make a custom view and show later
++(instancetype)customView:(UIView*)view block:(void(^)(EBCustomBannerViewMaker *make))block;
+
+-(void)show;
+-(void)hide;
+
+@end
+
+@interface EBCustomBannerViewMaker : NSObject
+
+@property(nonatomic, assign)CGRect portraitFrame;//default is view.frame
+@property(nonatomic, assign)CGRect landscapeFrame;//default is portraitFrame
+@property(nonatomic, assign)UInt32 soundID;//default is 0
+@property(nonatomic, strong)NSString *soundName;
+@property(nonatomic, assign)NSTimeInterval animationDuration;//default is 0.3
+@property(nonatomic, assign)NSTimeInterval stayDuration;//default is 4.0, set 0 will not hide
+@property(nonatomic, assign)EBCustomBannerViewAppearMode portraitMode;//default is top
+@property(nonatomic, assign)EBCustomBannerViewAppearMode landscapeMode;//default is top
+
+@property(nonatomic, strong)NSArray<NSNumber*>*centerModeDurations;//default is @[@0.3, @0.2, @0.1];
+
+@property(nonatomic, assign)BOOL vibrateOnMute;//default is YES
+
+@end

+ 62 - 0
Jianbinglian/Lib(第三方库)/FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.h

@@ -0,0 +1,62 @@
+// The MIT License (MIT)
+//
+// Copyright (c) 2015-2016 forkingdog ( https://github.com/forkingdog )
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+#import <UIKit/UIKit.h>
+
+/// "UINavigation+FDFullscreenPopGesture" extends UINavigationController's swipe-
+/// to-pop behavior in iOS 7+ by supporting fullscreen pan gesture. Instead of
+/// screen edge, you can now swipe from any place on the screen and the onboard
+/// interactive pop transition works seamlessly.
+///
+/// Adding the implementation file of this category to your target will
+/// automatically patch UINavigationController with this feature.
+@interface UINavigationController (FDFullscreenPopGesture)
+
+/// The gesture recognizer that actually handles interactive pop.
+@property (nonatomic, strong, readonly) UIPanGestureRecognizer *fd_fullscreenPopGestureRecognizer;
+
+/// A view controller is able to control navigation bar's appearance by itself,
+/// rather than a global way, checking "fd_prefersNavigationBarHidden" property.
+/// Default to YES, disable it if you don't want so.
+@property (nonatomic, assign) BOOL fd_viewControllerBasedNavigationBarAppearanceEnabled;
+
+@end
+
+/// Allows any view controller to disable interactive pop gesture, which might
+/// be necessary when the view controller itself handles pan gesture in some
+/// cases.
+@interface UIViewController (FDFullscreenPopGesture)
+
+/// Whether the interactive pop gesture is disabled when contained in a navigation
+/// stack.
+@property (nonatomic, assign) BOOL fd_interactivePopDisabled;
+
+/// Indicate this view controller prefers its navigation bar hidden or not,
+/// checked when view controller based navigation bar's appearance is enabled.
+/// Default to NO, bars are more likely to show.
+@property (nonatomic, assign) BOOL fd_prefersNavigationBarHidden;
+
+/// Max allowed initial distance to left edge when you begin the interactive pop
+/// gesture. 0 by default, which means it will ignore this limit.
+@property (nonatomic, assign) CGFloat fd_interactivePopMaxAllowedInitialDistanceToLeftEdge;
+
+@end

+ 280 - 0
Jianbinglian/Lib(第三方库)/FDFullscreenPopGesture/UINavigationController+FDFullscreenPopGesture.m

@@ -0,0 +1,280 @@
+// The MIT License (MIT)
+//
+// Copyright (c) 2015-2016 forkingdog ( https://github.com/forkingdog )
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+#import "UINavigationController+FDFullscreenPopGesture.h"
+#import <objc/runtime.h>
+
+@interface _FDFullscreenPopGestureRecognizerDelegate : NSObject <UIGestureRecognizerDelegate>
+
+@property (nonatomic, weak) UINavigationController *navigationController;
+
+@end
+
+@implementation _FDFullscreenPopGestureRecognizerDelegate
+
+- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
+{
+    // Ignore when no view controller is pushed into the navigation stack.
+    if (self.navigationController.viewControllers.count <= 1) {
+        return NO;
+    }
+    
+    // Ignore when the active view controller doesn't allow interactive pop.
+    UIViewController *topViewController = self.navigationController.viewControllers.lastObject;
+    if (topViewController.fd_interactivePopDisabled) {
+        return NO;
+    }
+    
+    // Ignore when the beginning location is beyond max allowed initial distance to left edge.
+    CGPoint beginningLocation = [gestureRecognizer locationInView:gestureRecognizer.view];
+    CGFloat maxAllowedInitialDistance = topViewController.fd_interactivePopMaxAllowedInitialDistanceToLeftEdge;
+    if (maxAllowedInitialDistance > 0 && beginningLocation.x > maxAllowedInitialDistance) {
+        return NO;
+    }
+
+    // Ignore pan gesture when the navigation controller is currently in transition.
+    if ([[self.navigationController valueForKey:@"_isTransitioning"] boolValue]) {
+        return NO;
+    }
+    
+    // Prevent calling the handler when the gesture begins in an opposite direction.
+    CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view];
+    if (translation.x <= 0) {
+        return NO;
+    }
+    
+    return YES;
+}
+
+@end
+
+typedef void (^_FDViewControllerWillAppearInjectBlock)(UIViewController *viewController, BOOL animated);
+
+@interface UIViewController (FDFullscreenPopGesturePrivate)
+
+@property (nonatomic, copy) _FDViewControllerWillAppearInjectBlock fd_willAppearInjectBlock;
+
+@end
+
+@implementation UIViewController (FDFullscreenPopGesturePrivate)
+
++ (void)load
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        Class class = [self class];
+        
+        SEL originalSelector = @selector(viewWillAppear:);
+        SEL swizzledSelector = @selector(fd_viewWillAppear:);
+        
+        Method originalMethod = class_getInstanceMethod(class, originalSelector);
+        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
+        
+        BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
+        if (success) {
+            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
+        } else {
+            method_exchangeImplementations(originalMethod, swizzledMethod);
+        }
+    });
+}
+
+- (void)fd_viewWillAppear:(BOOL)animated
+{
+    // Forward to primary implementation.
+    [self fd_viewWillAppear:animated];
+    
+    if (self.fd_willAppearInjectBlock) {
+        self.fd_willAppearInjectBlock(self, animated);
+    }
+}
+
+- (_FDViewControllerWillAppearInjectBlock)fd_willAppearInjectBlock
+{
+    return objc_getAssociatedObject(self, _cmd);
+}
+
+- (void)setFd_willAppearInjectBlock:(_FDViewControllerWillAppearInjectBlock)block
+{
+    objc_setAssociatedObject(self, @selector(fd_willAppearInjectBlock), block, OBJC_ASSOCIATION_COPY_NONATOMIC);
+}
+
+@end
+
+@implementation UINavigationController (FDFullscreenPopGesture)
+
++ (void)load
+{
+    // Inject "-pushViewController:animated:"
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        Class class = [self class];
+        
+        SEL originalSelector = @selector(pushViewController:animated:);
+        SEL swizzledSelector = @selector(fd_pushViewController:animated:);
+        
+        Method originalMethod = class_getInstanceMethod(class, originalSelector);
+        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
+        
+        BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
+        if (success) {
+            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
+        } else {
+            method_exchangeImplementations(originalMethod, swizzledMethod);
+        }
+    });
+}
+
+- (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated
+{
+    if (![self.interactivePopGestureRecognizer.view.gestureRecognizers containsObject:self.fd_fullscreenPopGestureRecognizer]) {
+        
+        // Add our own gesture recognizer to where the onboard screen edge pan gesture recognizer is attached to.
+        [self.interactivePopGestureRecognizer.view addGestureRecognizer:self.fd_fullscreenPopGestureRecognizer];
+
+        // Forward the gesture events to the private handler of the onboard gesture recognizer.
+        NSArray *internalTargets = [self.interactivePopGestureRecognizer valueForKey:@"targets"];
+        id internalTarget = [internalTargets.firstObject valueForKey:@"target"];
+        SEL internalAction = NSSelectorFromString(@"handleNavigationTransition:");
+        self.fd_fullscreenPopGestureRecognizer.delegate = self.fd_popGestureRecognizerDelegate;
+        [self.fd_fullscreenPopGestureRecognizer addTarget:internalTarget action:internalAction];
+
+        // Disable the onboard gesture recognizer.
+        self.interactivePopGestureRecognizer.enabled = NO;
+    }
+    
+    // Handle perferred navigation bar appearance.
+    [self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];
+    
+    // Forward to primary implementation.
+    if (![self.viewControllers containsObject:viewController]) {
+        [self fd_pushViewController:viewController animated:animated];
+    }
+}
+
+- (void)fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:(UIViewController *)appearingViewController
+{
+    if (!self.fd_viewControllerBasedNavigationBarAppearanceEnabled) {
+        return;
+    }
+    
+    __weak typeof(self) weakSelf = self;
+    _FDViewControllerWillAppearInjectBlock block = ^(UIViewController *viewController, BOOL animated) {
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (strongSelf) {
+            [strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHidden animated:animated];
+        }
+    };
+    
+    // Setup will appear inject block to appearing view controller.
+    // Setup disappearing view controller as well, because not every view controller is added into
+    // stack by pushing, maybe by "-setViewControllers:".
+    appearingViewController.fd_willAppearInjectBlock = block;
+    UIViewController *disappearingViewController = self.viewControllers.lastObject;
+    if (disappearingViewController && !disappearingViewController.fd_willAppearInjectBlock) {
+        disappearingViewController.fd_willAppearInjectBlock = block;
+    }
+}
+
+- (_FDFullscreenPopGestureRecognizerDelegate *)fd_popGestureRecognizerDelegate
+{
+    _FDFullscreenPopGestureRecognizerDelegate *delegate = objc_getAssociatedObject(self, _cmd);
+
+    if (!delegate) {
+        delegate = [[_FDFullscreenPopGestureRecognizerDelegate alloc] init];
+        delegate.navigationController = self;
+        
+        objc_setAssociatedObject(self, _cmd, delegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return delegate;
+}
+
+- (UIPanGestureRecognizer *)fd_fullscreenPopGestureRecognizer
+{
+    UIPanGestureRecognizer *panGestureRecognizer = objc_getAssociatedObject(self, _cmd);
+
+    if (!panGestureRecognizer) {
+        panGestureRecognizer = [[UIPanGestureRecognizer alloc] init];
+        panGestureRecognizer.maximumNumberOfTouches = 1;
+        
+        objc_setAssociatedObject(self, _cmd, panGestureRecognizer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return panGestureRecognizer;
+}
+
+- (BOOL)fd_viewControllerBasedNavigationBarAppearanceEnabled
+{
+    NSNumber *number = objc_getAssociatedObject(self, _cmd);
+    if (number) {
+        return number.boolValue;
+    }
+    self.fd_viewControllerBasedNavigationBarAppearanceEnabled = YES;
+    return YES;
+}
+
+- (void)setFd_viewControllerBasedNavigationBarAppearanceEnabled:(BOOL)enabled
+{
+    SEL key = @selector(fd_viewControllerBasedNavigationBarAppearanceEnabled);
+    objc_setAssociatedObject(self, key, @(enabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+@end
+
+@implementation UIViewController (FDFullscreenPopGesture)
+
+- (BOOL)fd_interactivePopDisabled
+{
+    return [objc_getAssociatedObject(self, _cmd) boolValue];
+}
+
+- (void)setFd_interactivePopDisabled:(BOOL)disabled
+{
+    objc_setAssociatedObject(self, @selector(fd_interactivePopDisabled), @(disabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+- (BOOL)fd_prefersNavigationBarHidden
+{
+    return [objc_getAssociatedObject(self, _cmd) boolValue];
+}
+
+- (void)setFd_prefersNavigationBarHidden:(BOOL)hidden
+{
+    objc_setAssociatedObject(self, @selector(fd_prefersNavigationBarHidden), @(hidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+
+- (CGFloat)fd_interactivePopMaxAllowedInitialDistanceToLeftEdge
+{
+#if CGFLOAT_IS_DOUBLE
+    return [objc_getAssociatedObject(self, _cmd) doubleValue];
+#else
+    return [objc_getAssociatedObject(self, _cmd) floatValue];
+#endif
+}
+
+- (void)setFd_interactivePopMaxAllowedInitialDistanceToLeftEdge:(CGFloat)distance
+{
+    SEL key = @selector(fd_interactivePopMaxAllowedInitialDistanceToLeftEdge);
+    objc_setAssociatedObject(self, key, @(MAX(0, distance)), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+@end

+ 244 - 0
Jianbinglian/Lib(第三方库)/JYRouter/JYRouter.h

@@ -0,0 +1,244 @@
+//
+//  JYRouter.h
+//  Job-Yang
+//
+//  Created by 杨权 on 16/9/22.
+//  Copyright © 2016年 Job-Yang. All rights reserved.
+//
+
+#import "Routable.h"
+
+@interface UINavigationController (Extensions)
+@end
+
+@interface JYRouter : Routable
+
+/**
+ 单例
+
+ @return JYRouter单例对象
+ */
++ (instancetype)router;
+
+/**
+ 获取一个新的Router对象
+
+ @return JYRouter对象
+ */
++ (instancetype)newRouter;
+
+/**
+ 设置自定义的Navigation,用于present时显示
+ 如果您想全局设置,请在AppDelegate 的didFinishLaunchingWithOptions方法中设置
+ [[JYRouter router] setCustomNavigationClass:[YourCustomNavigation class]];
+ 
+ @param navClass Navigation Class
+ */
+- (void)setCustomNavigationClass:(Class)navClass;
+
+/**
+ 判断该URL是否可以路由跳转
+
+ @param url url
+ @return 是否可以跳转
+ */
+- (BOOL)hasRouter:(NSString *)url;
+
+/**
+ 获取当前显示的VC
+
+ @return 当前显示的VC
+ */
+- (UIViewController *)currentVC;
+
+/**
+ 通过VC名称初始化VC
+
+ @param viewController VC名称
+ @return VC对象
+ */
+- (UIViewController *)controllerWithRouter:(NSString *)viewController;
+
+/**
+ 通过VC名称初始化VC,并params映射将指定的属性赋值
+
+ @param viewController VC名称
+ @param params 属性映射
+ @return VC对象
+ */
+- (UIViewController *)controllerWithRouter:(NSString *)viewController
+                                    params:(NSDictionary *)params;
+
+
+#pragma mark - Push
+
+/**
+ 通过VC名Push到指定的VC(默认显示push动画)
+
+ @param viewController VC名称
+ */
+- (void)push:(NSString *)viewController;
+
+/**
+ 通过VC名Push到指定的VC(是否显示push动画)
+
+ @param viewController VC名称
+ @param animated 是否显示动画
+ */
+- (void)push:(NSString *)viewController
+    animated:(BOOL)animated;
+
+/**
+ 通过VC名Push到指定的VC,并params映射将指定的属性赋值
+
+ @param viewController VC名称
+ @param animated 是否显示push动画
+ @param params 属性映射
+ */
+- (void)push:(NSString *)viewController
+    animated:(BOOL)animated
+      params:(NSDictionary *)params;
+
+
+/**
+ 通过VC名Push到指定的VC,并params映射将指定的属性赋值
+ 
+ @param viewController VC名称
+ @param animated 是否显示push动画
+ @param params 属性映射
+ @param completion 完成回调
+ */
+- (void)push:(NSString *)viewController
+    animated:(BOOL)animated
+      params:(NSDictionary *)params
+  completion:(void(^)())completion;
+
+#pragma mark - Present
+
+/**
+ 通过VC名Present到指定的VC(默认显示Present动画)
+
+ @param viewController VC名称
+ */
+- (void)present:(NSString *)viewController;
+
+/**
+ 通过VC名Present到指定的VC(是否显示Present动画)
+
+ @param viewController VC名称
+ @param animated 是否显示Present动画
+ */
+- (void)present:(NSString *)viewController
+       animated:(BOOL)animated;
+
+/**
+ 通过VC名Present指定的VC,并params映射将指定的属性赋值
+
+ @param viewController VC名称
+ @param animated 是否显示Present动画
+ @param params 属性映射
+ */
+- (void)present:(NSString *)viewController
+       animated:(BOOL)animated
+         params:(NSDictionary *)params;
+
+
+/**
+ 通过VC名Present指定的VC,并params映射将指定的属性赋值
+ 
+ @param viewController VC名称
+ @param animated 是否显示Present动画
+ @param params 属性映射
+ @param completion 完成回调
+ */
+- (void)present:(NSString *)viewController
+       animated:(BOOL)animated
+         params:(NSDictionary *)params
+     completion:(void(^)())completion;
+
+#pragma mark - Pop
+
+/**
+ Pop到上级VC(默认显示Pop动画)
+ */
+- (void)pop;
+
+/**
+ Pop到上级VC(是否显示Pop动画)
+ 
+ @param animated 是否显示Pop动画
+ */
+- (void)pop:(BOOL)animated;
+
+/**
+ Pop到根控制器(默认显示Pop动画)
+ */
+- (void)popToRoot;
+
+/**
+ Pop到根控制器(是否显示Pop动画)
+
+ @param animated 是否显示Pop动画
+ */
+- (void)popToRoot:(BOOL)animated;
+
+/**
+ Pop到根控制器(是否显示Pop动画)
+ 
+ @param animated 是否显示Pop动画
+ @param completion 完成回调
+ */
+- (void)popToRoot:(BOOL)animated
+               completion:(void(^)())completion;
+
+/**
+ 通过VC名Pop到指定的VC(默认显示Pop动画)
+
+ @param viewController VC名称
+ */
+- (void)popTo:(NSString *)viewController;
+
+/**
+ 通过VC名Pop到指定的VC(是否显示Pop动画)
+
+ @param viewController VC名称
+ @param animated 是否显示Pop动画
+ */
+- (void)popTo:(NSString *)viewController
+     animated:(BOOL)animated;
+
+/**
+ 通过VC名Pop到指定的VC(是否显示Pop动画)
+ 
+ @param viewController VC名称
+ @param animated 是否显示Pop动画
+ @param completion 完成回调
+ */
+- (void)popTo:(NSString *)viewController
+     animated:(BOOL)animated
+   completion:(void(^)())completion;
+
+#pragma mark - Dismiss
+
+/**
+ dismiss(默认显示Dismiss动画)
+ */
+- (void)dismiss;
+/**
+ dismiss(是否显示Dismiss动画)
+ 
+ @param animated 是否显示Dismiss动画
+ */
+- (void)dismiss:(BOOL)animated;
+
+/**
+ dismiss(是否显示Dismiss动画)
+ 
+ @param animated 是否显示Dismiss动画
+ @param completion 完成回调
+ */
+- (void)dismiss:(BOOL)animated
+     completion:(void(^)())completion;
+
+@end
+

+ 300 - 0
Jianbinglian/Lib(第三方库)/JYRouter/JYRouter.m

@@ -0,0 +1,300 @@
+//
+//  JYRouter.h
+//  Job-Yang
+//
+//  Created by 杨权 on 16/9/22.
+//  Copyright © 2016年 Job-Yang. All rights reserved.
+//
+
+#import "JYRouter.h"
+
+@implementation UINavigationController (Extensions)
+
+/**
+ 带完成回调的pushViewController
+
+ @param viewController 控制器
+ @param animated 是否开启动画
+ @param completion 完成回调
+ */
+- (void)pushViewController:(UIViewController *)viewController
+                  animated:(BOOL)animated
+                completion:(void(^)())completion {
+    [CATransaction begin];
+    [CATransaction setCompletionBlock:completion];
+    [self pushViewController:viewController animated:animated];
+    [CATransaction commit];
+}
+
+/**
+ 带完成回调的popToRootViewController
+ 
+ @param animated 是否开启动画
+ @param completion 完成回调
+ */
+- (void)popToRootViewController:(BOOL)animated
+                     completion:(void(^)())completion {
+    [CATransaction begin];
+    [CATransaction setCompletionBlock:completion];
+    [self popToRootViewControllerAnimated:animated];
+    [CATransaction commit];
+}
+
+/**
+ 带完成回调的popToViewController
+ 
+ @param viewController 控制器
+ @param animated 是否开启动画
+ @param completion 完成回调
+ */
+- (void)popToViewController:(UIViewController *)viewController
+                   animated:(BOOL)animated
+                 completion:(void(^)())completion {
+    [CATransaction begin];
+    [CATransaction setCompletionBlock:completion];
+    [self popToViewController:viewController animated:animated];
+    [CATransaction commit];
+}
+
+@end
+
+
+@interface JYRouter()
+@property (strong, nonatomic) Class navClass;
+@end
+
+@implementation JYRouter
+
++ (instancetype)router {
+    static JYRouter *_sharedRouter = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        _sharedRouter = [[JYRouter alloc] init];
+    });
+    return _sharedRouter;
+}
+
++ (instancetype)newRouter {
+    return [[self alloc] init];
+}
+
+- (void)setCustomNavigationClass:(Class)navClass {
+    if (![navClass isSubclassOfClass:[UINavigationController class]]) {
+        @throw [NSException exceptionWithName:@"NavClassTypeError"
+                                       reason:@"navClass must be UINavigationController class or Subclass of UINavigationController"
+                                     userInfo:nil];
+    }
+    self.navClass = navClass;
+}
+
+- (BOOL)hasRouter:(NSString *)url {
+    return [self.routes.allKeys containsObject:url];
+}
+
+- (UIViewController *)currentVC {
+    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
+    while (topController.presentedViewController) {
+        topController = topController.presentedViewController;
+    }
+    return topController;
+}
+
+- (UIViewController *)controllerWithRouter:(NSString *)viewController {
+    return [self controllerWithRouter:viewController
+                               params:nil];
+}
+
+- (UIViewController *)controllerWithRouter:(NSString *)viewController
+                                    params:(NSDictionary *)params {
+    
+    UPRouterOptions *options = [UPRouterOptions routerOptions];
+    
+    if (![self hasRouter:viewController]) {
+        [self map:viewController toController:[self JYClassFromString:viewController] withOptions:options];
+    }
+    RouterParams *extraParams = [self routerParamsForUrl:viewController extraParams:params];
+    
+    options.openClass = [self JYClassFromString:viewController];
+    extraParams.routerOptions = options;
+    
+    UIViewController *controller = [self controllerForRouterParams:extraParams];
+    [controller yy_modelSetWithDictionary:params];
+    
+    return controller;
+}
+
+- (void)push:(NSString *)viewController {
+    [self push:viewController animated:YES];
+}
+
+- (void)push:(NSString *)viewController animated:(BOOL)animated {
+    [self push:viewController animated:animated params:nil];
+}
+
+- (void)push:(NSString *)viewController animated:(BOOL)animated params:(NSDictionary *)params {
+    [self push:viewController animated:animated params:params completion:nil];
+}
+
+- (void)push:(NSString *)viewController animated:(BOOL)animated params:(NSDictionary *)params completion:(void(^)())completion {
+    [self open:viewController withOptions:nil animated:animated params:params completion:completion];
+}
+
+- (void)present:(NSString *)viewController {
+    [self present:viewController animated:YES];
+}
+
+- (void)present:(NSString *)viewController animated:(BOOL)animated {
+    [self present:viewController animated:animated params:nil];
+}
+
+- (void)present:(NSString *)viewController animated:(BOOL)animated params:(NSDictionary *)params {
+    [self present:viewController animated:animated params:params completion:nil];
+}
+
+- (void)present:(NSString *)viewController animated:(BOOL)animated params:(NSDictionary *)params completion:(void(^)())completion {
+    [self open:viewController withOptions:[[UPRouterOptions modal] withPresentationStyle:UIModalPresentationFormSheet] animated:animated params:params completion:completion];
+}
+
+- (void)present:(NSString *)viewController withOptions:(UPRouterOptions *)options animated:(BOOL)animated params:(NSDictionary *)params completion:(void(^)())completion {
+    [self open:viewController withOptions:options animated:animated params:params completion:completion];
+}
+
+- (void)pop {
+    [super pop];
+}
+
+- (void)pop:(BOOL)animated {
+    [super pop:animated];
+}
+
+- (void)popToRoot {
+    [self popToRoot:YES];
+}
+
+- (void)popToRoot:(BOOL)animated {
+    [self popToRoot:animated completion:nil];
+}
+
+- (void)popToRoot:(BOOL)animated completion:(void(^)())completion {
+    [self.navigationController popToRootViewController:animated completion:completion];
+}
+
+- (void)popTo:(NSString *)viewController {
+    [self popTo:viewController animated:YES];
+}
+
+- (void)popTo:(NSString *)viewController animated:(BOOL)animated  {
+    [self popTo:viewController animated:YES completion:nil];
+}
+
+- (void)popTo:(NSString *)viewController animated:(BOOL)animated completion:(void(^)())completion {
+    for (UIViewController *tempVC in self.navigationController.viewControllers) {
+        if ([NSStringFromClass([tempVC class]) isEqualToString:viewController]) {
+            [self.navigationController popToViewController:tempVC animated:animated completion:completion];
+            break;
+        }
+    }
+}
+
+- (void)dismiss {
+    [self dismiss:YES];
+}
+
+- (void)dismiss:(BOOL)animated {
+    [self dismiss:animated completion:nil];
+}
+
+- (void)dismiss:(BOOL)animated completion:(void(^)())completion {
+    [self.navigationController dismissViewControllerAnimated:animated completion:completion];
+}
+
+- (void)open:(NSString *)url withOptions:(UPRouterOptions *)options animated:(BOOL)animated params:(NSDictionary *)params completion:(void(^)())completion {
+    
+    if (![self hasRouter:url]) {
+        [self map:url toController:[self JYClassFromString:url] withOptions:options];
+    }
+    
+    RouterParams *extraParams = [self routerParamsForUrl:url extraParams:params];
+    if (!options) {
+        options = [UPRouterOptions routerOptions];
+    }
+    options.openClass = [self JYClassFromString:url];
+    extraParams.routerOptions = options;
+    
+    if (options.callback) {
+        RouterOpenCallback callback = options.callback;
+        callback([extraParams controllerParams]);
+        return;
+    }
+    
+    if (!self.navigationController) {
+        @throw [NSException exceptionWithName:@"NavigationControllerNotProvided"
+                                       reason:@"Router#navigationController has not been set to a UINavigationController instance"
+                                     userInfo:nil];
+    }
+    
+    UIViewController *controller = [self controllerForRouterParams:extraParams];
+    [controller yy_modelSetWithDictionary:params];
+    
+    
+    if ([options isModal]) {
+        if ([controller.class isSubclassOfClass:UINavigationController.class]) {
+            [self.navigationController presentViewController:controller
+                                                    animated:animated
+                                                  completion:completion];
+        }
+        else {
+            if (!self.navClass) {
+                self.navClass = [UINavigationController class];
+            }
+            UINavigationController *navigationController = [[self.navClass alloc] initWithRootViewController:controller];
+            navigationController.modalPresentationStyle = controller.modalPresentationStyle;
+            navigationController.modalTransitionStyle = controller.modalTransitionStyle;
+            
+            [self.navigationController presentViewController:navigationController
+                                                    animated:animated
+                                                  completion:completion];
+        }
+    }
+    else if (options.shouldOpenAsRootViewController) {
+        [self.navigationController setViewControllers:@[controller] animated:animated];
+    }
+    else {
+        [self.navigationController pushViewController:controller animated:animated completion:completion];
+    }
+}
+
+- (Class)JYClassFromString:(NSString *)className {
+    Class class = NSClassFromString(className);
+    if (!class) {
+        class = [self swiftClassFromString:className];
+    }
+    NSLog(@"class = %@",class);
+    return class;
+}
+
+- (Class)swiftClassFromString:(NSString *)className {
+    NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleExecutable"];
+    appName = [appName stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
+    NSString *classStringName = [NSString stringWithFormat:@"%@.%@", appName, className];
+    return NSClassFromString(classStringName);
+}
+
+- (UINavigationController *)navigationController {
+    return [self navigationControllerWithController:[UIApplication sharedApplication].delegate.window.rootViewController];
+}
+
+- (UINavigationController *)navigationControllerWithController:(UIViewController *)viewController {
+    if (viewController.presentedViewController) {
+        return [self navigationControllerWithController:viewController.presentedViewController];
+    }
+    else if ([viewController isKindOfClass:[UITabBarController class]]) {
+        UITabBarController *vc = (UITabBarController *)viewController;
+        return vc.selectedViewController;
+    }
+    else {
+        return (UINavigationController *)viewController;
+    }
+}
+
+@end

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