mine module done

FFIB лет %!s(int64=6): %!d(string=назад)
Родитель
Сommit
5daedc0660
31 измененных файлов с 325 добавлено и 249 удалено
  1. 12 4
      PaiAi/Paiai.xcodeproj/project.pbxproj
  2. BIN
      PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate
  3. 1 1
      PaiAi/Paiai/AppDelegate.swift
  4. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-contactUs.imageset/Contents.json
  5. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-contactUs.imageset/我的-客服 @3x.png
  6. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-score.imageset/Contents.json
  7. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-score.imageset/关于-用户协议 @3x.png
  8. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-userAgreement.imageset/Contents.json
  9. 0 0
      PaiAi/Paiai/Assets.xcassets/Mine/about-userAgreement.imageset/关于-用户协议 @3x.png
  10. 6 3
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/FeedbackRemoteAPI.swift
  11. 0 1
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/StatusResource.swift
  12. 3 1
      PaiAi/PaiaiDataKit/PresentLayer/mine/MineFeedbackViewModel.swift
  13. 0 1
      PaiAi/PaiaiDataKit/PresentLayer/mine/MineGroupViewModel.swift
  14. 0 1
      PaiAi/PaiaiDataKit/PresentLayer/mine/MineOrderViewModel.swift
  15. 24 0
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/GestureRecoginzier+NavigationBack.swift
  16. 2 17
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/NavigationBackDelegate.swift
  17. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/NavigationBackViewController.swift
  18. 19 0
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/UINavigationController+NavigationBack.swift
  19. 0 22
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/UIViewController+NavigationBack.swift
  20. 0 2
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBar/NavigationBarInteractivePopDeletegate.swift
  21. 5 5
      PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentExtension.swift
  22. 41 0
      PaiAi/PaiaiUIKit/Reusable/UIKit/WebViewController.swift
  23. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift
  24. 8 2
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift
  25. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningDelegate.swift
  26. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningProxy.swift
  27. 7 5
      PaiAi/Paiai_iOS/App/AppCoordinator.swift
  28. 133 141
      PaiAi/Paiai_iOS/App/Mine/Mine.storyboard
  29. 44 29
      PaiAi/Paiai_iOS/App/Mine/MineAboutViewController.swift
  30. 5 3
      PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift
  31. 11 7
      PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

+ 12 - 4
PaiAi/Paiai.xcodeproj/project.pbxproj

@@ -247,7 +247,7 @@
247 247
 		05C8D21021ED7B280001E847 /* UIApplication+Swizzle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D20F21ED7B270001E847 /* UIApplication+Swizzle.swift */; };
248 248
 		05C8D21221ED7B620001E847 /* UINavigationBar+FixSpace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21121ED7B620001E847 /* UINavigationBar+FixSpace.swift */; };
249 249
 		05C8D21421ED8B9B0001E847 /* NavigationBackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */; };
250
-		05C8D21921ED985C0001E847 /* UIViewController+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21821ED985C0001E847 /* UIViewController+NavigationBack.swift */; };
250
+		05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */; };
251 251
 		05C8D21B21ED9A020001E847 /* UIViewController+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */; };
252 252
 		05C8D21D21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */; };
253 253
 		05C8D22021EDD5F50001E847 /* NavigationBarInOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21F21EDD5F50001E847 /* NavigationBarInOut.swift */; };
@@ -256,6 +256,8 @@
256 256
 		05C8D22621EEE1EB0001E847 /* NavigationBarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22521EEE1EB0001E847 /* NavigationBarDelegate.swift */; };
257 257
 		05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */; };
258 258
 		05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */; };
259
+		05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C521FF010900A29A20 /* WebViewController.swift */; };
260
+		05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */; };
259 261
 		05E80E3021DF65D5006368C4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 05E80E2F21DF65D4006368C4 /* Assets.xcassets */; };
260 262
 /* End PBXBuildFile section */
261 263
 
@@ -499,7 +501,7 @@
499 501
 		05C8D20F21ED7B270001E847 /* UIApplication+Swizzle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Swizzle.swift"; sourceTree = "<group>"; };
500 502
 		05C8D21121ED7B620001E847 /* UINavigationBar+FixSpace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationBar+FixSpace.swift"; sourceTree = "<group>"; };
501 503
 		05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackViewController.swift; sourceTree = "<group>"; };
502
-		05C8D21821ED985C0001E847 /* UIViewController+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+NavigationBack.swift"; sourceTree = "<group>"; };
504
+		05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+NavigationBack.swift"; sourceTree = "<group>"; };
503 505
 		05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Navigation.swift"; sourceTree = "<group>"; };
504 506
 		05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInteractivePopDeletegate.swift; sourceTree = "<group>"; };
505 507
 		05C8D21F21EDD5F50001E847 /* NavigationBarInOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInOut.swift; sourceTree = "<group>"; };
@@ -508,6 +510,8 @@
508 510
 		05C8D22521EEE1EB0001E847 /* NavigationBarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarDelegate.swift; sourceTree = "<group>"; };
509 511
 		05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerProxy.swift; sourceTree = "<group>"; };
510 512
 		05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerDelegate.swift; sourceTree = "<group>"; };
513
+		05D3A3C521FF010900A29A20 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = "<group>"; };
514
+		05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GestureRecoginzier+NavigationBack.swift"; sourceTree = "<group>"; };
511 515
 		05E80E2F21DF65D4006368C4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
512 516
 		3864C06C1CAD27EC0048ADAD /* Swift-bridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swift-bridge.h"; sourceTree = "<group>"; };
513 517
 		420FDBEA1EA70A9600958CBD /* PhotoLocalStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoLocalStorage.swift; sourceTree = "<group>"; };
@@ -690,6 +694,7 @@
690 694
 				05130F6121C94C79004EF1BE /* PageViewController */,
691 695
 				05130F5F21C94C79004EF1BE /* SideViewController */,
692 696
 				A6CCC0731E793DD0004BCC9D /* WaterfallFlowLayout */,
697
+				05D3A3C521FF010900A29A20 /* WebViewController.swift */,
693 698
 			);
694 699
 			path = UIKit;
695 700
 			sourceTree = "<group>";
@@ -1145,7 +1150,8 @@
1145 1150
 			children = (
1146 1151
 				05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */,
1147 1152
 				0500C26421E8644E009A7013 /* NavigationBackDelegate.swift */,
1148
-				05C8D21821ED985C0001E847 /* UIViewController+NavigationBack.swift */,
1153
+				05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */,
1154
+				05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */,
1149 1155
 			);
1150 1156
 			path = NavigationBack;
1151 1157
 			sourceTree = "<group>";
@@ -1681,6 +1687,7 @@
1681 1687
 				05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */,
1682 1688
 				0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,
1683 1689
 				0513100721CA1B39004EF1BE /* UIViewController+UIBarButtonItem.swift in Sources */,
1690
+				05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,
1684 1691
 				053E126B21F5696E00A64893 /* Toast.swift in Sources */,
1685 1692
 				0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */,
1686 1693
 				057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,
@@ -1711,7 +1718,8 @@
1711 1718
 				0513109521CA3915004EF1BE /* QRCodeScanDelegate.swift in Sources */,
1712 1719
 				0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */,
1713 1720
 				053E126521F1718E00A64893 /* PageOption.swift in Sources */,
1714
-				05C8D21921ED985C0001E847 /* UIViewController+NavigationBack.swift in Sources */,
1721
+				05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */,
1722
+				05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */,
1715 1723
 				05130F5A21C94C12004EF1BE /* PresentDisappearAnimatedTransitioning.swift in Sources */,
1716 1724
 				053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */,
1717 1725
 				053E126721F1719F00A64893 /* PageItem.swift in Sources */,

BIN
PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate


+ 1 - 1
PaiAi/Paiai/AppDelegate.swift

@@ -45,7 +45,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
45 45
             window?.rootViewController = nav
46 46
             window?.makeKeyAndVisible()
47 47
             
48
-            coordinator = AppCoordinator(rootViewController)
48
+            coordinator = AppCoordinator(rootViewController, navigationController: nav)
49 49
             
50 50
             nav.navigationBar.tintColor = UIColor.white
51 51
             nav.navigationBar.isTranslucent = false

PaiAi/Paiai/Assets.xcassets/MainPage/关于-联系我们.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Mine/about-contactUs.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/关于-联系我们.imageset/我的-客服 @3x.png → PaiAi/Paiai/Assets.xcassets/Mine/about-contactUs.imageset/我的-客服 @3x.png


PaiAi/Paiai/Assets.xcassets/MainPage/关于-用户协议 .imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Mine/about-score.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/关于-评分.imageset/关于-用户协议 @3x.png → PaiAi/Paiai/Assets.xcassets/Mine/about-score.imageset/关于-用户协议 @3x.png


PaiAi/Paiai/Assets.xcassets/MainPage/关于-评分.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Mine/about-userAgreement.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/关于-用户协议 .imageset/关于-用户协议 @3x.png → PaiAi/Paiai/Assets.xcassets/Mine/about-userAgreement.imageset/关于-用户协议 @3x.png


+ 6 - 3
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/FeedbackRemoteAPI.swift

@@ -9,9 +9,12 @@
9 9
 import Foundation
10 10
 import RxSwift
11 11
 
12
-struct FeedbackRemoteAPI {
13
-    func submit(text: String) -> Completable {
14
-        let resource = StatusResource(path: .feedback, parameter: ["user_id": "", "feedback": text])
12
+public struct FeedbackRemoteAPI {
13
+    
14
+    public init() {}
15
+    
16
+    public func submit(text: String) -> Completable {
17
+        let resource = StatusResource(path: .feedback, parameter: ["user_id": ShareUserId, "feedback": text])
15 18
         return resource.getStatus()
16 19
     }
17 20
 }

+ 0 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/StatusResource.swift

@@ -28,7 +28,6 @@ struct StatusResource: Resource {
28 28
     
29 29
     func getStatus() -> Completable {
30 30
         return NetworkApi.share.post(resource: self).flatMapCompletable({ (model) -> Completable in
31
-            print(model)
32 31
             if model.status == 200 {
33 32
                 return Completable.empty()
34 33
             } else {

+ 3 - 1
PaiAi/PaiaiDataKit/PresentLayer/mine/MineFeedbackViewModel.swift

@@ -17,6 +17,8 @@ class MineFeedbackViewModel {
17 17
     var api = FeedbackRemoteAPI()
18 18
     
19 19
     func submit(_ text: String) {
20
-        api.submit(text: text)
20
+        api.submit(text: text).subscribe(onCompleted: {
21
+            self.delegate?.back()
22
+        }).dispose()
21 23
     }
22 24
 }

+ 0 - 1
PaiAi/PaiaiDataKit/PresentLayer/mine/MineGroupViewModel.swift

@@ -60,7 +60,6 @@ public class MineGroupViewModel {
60 60
         repository.load(page: page)
61 61
             .asDriver(onErrorJustReturn: NetworkArrayData<GroupItem>.empty())
62 62
             .drive(onNext: {[weak self] (model) in
63
-                print(model)
64 63
                 guard let `self` = self else { return }
65 64
                 self._hasMoreData.onNext(model.hasMore)
66 65
                 self._isEmpty.accept(!model.data.isEmpty)

+ 0 - 1
PaiAi/PaiaiDataKit/PresentLayer/mine/MineOrderViewModel.swift

@@ -56,7 +56,6 @@ public class MineOrderViewModel {
56 56
         repository.load(page: page)
57 57
             .asDriver(onErrorJustReturn: NetworkArrayData<OrderItem>.empty())
58 58
             .drive(onNext: {[weak self] (model) in
59
-                print(model)
60 59
                 guard let `self` = self else { return }
61 60
                 self._hasMoreData.onNext(model.hasMore)
62 61
                 self._isEmpty.accept(!model.data.isEmpty)

+ 24 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/GestureRecoginzier+NavigationBack.swift

@@ -0,0 +1,24 @@
1
+//
2
+//  GestureRecoginzier+NavigationBack.swift
3
+//  PaiaiUIKit
4
+//
5
+//  Created by ffib on 2019/1/29.
6
+//  Copyright © 2019 yb. All rights reserved.
7
+//
8
+
9
+import UIKit
10
+
11
+public extension GestureRecognizerDelegate where Self: UIViewController & NavigationBackDelegate {
12
+    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
13
+                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
14
+        if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer,
15
+            gestureRecognizer.isKind(of: UIPanGestureRecognizer.self),
16
+            let pan = gestureRecognizer as? UIPanGestureRecognizer {
17
+            let point = pan.translation(in: self.view)
18
+            if point.x > 0 {
19
+                return true
20
+            }
21
+        }
22
+        return false
23
+    }
24
+}

+ 2 - 17
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/NavigationBackDelegate.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public protocol NavigationBackDelegate: class {
12 12
     func setupNavigationBackItem()
@@ -19,7 +19,7 @@ public extension NavigationBackDelegate where Self: UIViewController {
19 19
         btn.contentHorizontalAlignment = .left
20 20
         btn.frame = CGRect(x: 0, y: 0, width: 40 , height: 40)
21 21
         btn.setImage(UIImage(named: "navigation-back"), for: .normal)
22
-        btn.addTarget(self, action: #selector(backToViewController), for: .touchUpInside)
22
+        btn.addTarget(self, action: #selector(navigationController?.popViewController(animated:)), for: .touchUpInside)
23 23
         
24 24
         let backItem = UIBarButtonItem(customView: btn)
25 25
         let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
@@ -28,18 +28,3 @@ public extension NavigationBackDelegate where Self: UIViewController {
28 28
         navigationItem.leftBarButtonItems = [spaceItem, backItem]
29 29
     }
30 30
 }
31
-
32
-public extension GestureRecognizerDelegate where Self: UIViewController & NavigationBackDelegate {
33
-    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
34
-                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
35
-        if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer,
36
-            gestureRecognizer.isKind(of: UIPanGestureRecognizer.self),
37
-            let pan = gestureRecognizer as? UIPanGestureRecognizer {
38
-            let point = pan.translation(in: self.view)
39
-            if point.x > 0 {
40
-                return true
41
-            }
42
-        }
43
-        return false
44
-    }
45
-}

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/NavigationBackViewController.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public typealias NavigationBackViewController = NavigationBackDelegate & GestureRecognizerDelegate
12 12
  

+ 19 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/UINavigationController+NavigationBack.swift

@@ -0,0 +1,19 @@
1
+//
2
+//  UINavigationController+NavigationBack.swift
3
+//  PaiaiUIKit
4
+//
5
+//  Created by ffib on 2019/1/15.
6
+//  Copyright © 2019 yb. All rights reserved.
7
+//
8
+
9
+import UIKit
10
+
11
+public extension UINavigationController {
12
+    func pushViewController<T: UIViewController & NavigationBackViewController>(_ vc: T, animted: Bool = true) {
13
+        vc.setupNavigationBackItem()
14
+        pushViewController(vc, animated: animted)
15
+        guard let recognizer = interactivePopGestureRecognizer else { return }
16
+        recognizer.isEnabled = true
17
+        recognizer.setDelegate(vc)
18
+    }
19
+}

+ 0 - 22
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/UIViewController+NavigationBack.swift

@@ -1,22 +0,0 @@
1
-//
2
-//  UIViewController+NavigationBack.swift
3
-//  PaiaiUIKit
4
-//
5
-//  Created by ffib on 2019/1/15.
6
-//  Copyright © 2019 yb. All rights reserved.
7
-//
8
-
9
-import Foundation
10
-
11
-public extension UIViewController {
12
-    func pushViewController<T: UIViewController & NavigationBackViewController>(_ vc: T, animted: Bool = true) {
13
-        vc.setupNavigationBackItem()
14
-        navigationController?.pushViewController(vc, animated: animted)
15
-        vc.navigationController?.interactivePopGestureRecognizer?.setDelegate(vc)
16
-        vc.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
17
-    }
18
-    
19
-    @objc func backToViewController() {
20
-        popController(animated: true)
21
-    }
22
-}

+ 0 - 2
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBar/NavigationBarInteractivePopDeletegate.swift

@@ -41,6 +41,4 @@ extension UIViewController {
41 41
     func calculatePercentageOfOffsets(point: CGPoint) -> CGFloat {
42 42
         return point.x / view.bounds.width
43 43
     }
44
-    
45 44
 }
46
-

+ 5 - 5
PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentExtension.swift

@@ -8,8 +8,8 @@
8 8
 
9 9
 import Foundation
10 10
 
11
-extension GestureRecognizerDelegate where Self: UIViewController & PresentAnimatorDelegate {
12
-    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
11
+public extension GestureRecognizerDelegate where Self: UIViewController & PresentAnimatorDelegate {
12
+    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
13 13
                                   shouldReceive touch: UITouch) -> Bool {
14 14
         if touch.view == view {
15 15
             return true
@@ -18,14 +18,14 @@ extension GestureRecognizerDelegate where Self: UIViewController & PresentAnimat
18 18
     }
19 19
 }
20 20
 
21
-extension ViewControllerTransitioningDelegate where Self: UIViewController & PresentAnimatorDelegate {
22
-    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
21
+public extension ViewControllerTransitioningDelegate where Self: UIViewController & PresentAnimatorDelegate {
22
+    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
23 23
         let transitioning = PresentDisappearAnimatedTransitioning(animator: animator)
24 24
         transitioning.delegate = self
25 25
         return transitioning
26 26
     }
27 27
     
28
-    public func animationController(forPresented presented: UIViewController,
28
+    func animationController(forPresented presented: UIViewController,
29 29
                                     presenting: UIViewController, source: UIViewController)
30 30
         -> UIViewControllerAnimatedTransitioning? {
31 31
             let transitioning = PresentAppearAnimatedTransitioning(animator: animator)

+ 41 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/WebViewController.swift

@@ -0,0 +1,41 @@
1
+//
2
+//  WebViewController.swift
3
+//  PaiaiUIKit
4
+//
5
+//  Created by ffib on 2019/1/28.
6
+//  Copyright © 2019 yb. All rights reserved.
7
+//
8
+
9
+import UIKit
10
+import WebKit
11
+
12
+public class WebViewController: UIViewController {
13
+
14
+    public private(set) var path: String?
15
+    
16
+    lazy var webView: WKWebView = {
17
+        let webView = WKWebView()
18
+        webView.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height)
19
+        return webView
20
+    }()
21
+    
22
+    public init(title: String, path: String) {
23
+        super.init(nibName: nil, bundle: nil)
24
+        self.title = title
25
+        self.path = path
26
+    }
27
+    
28
+    required init?(coder aDecoder: NSCoder) {
29
+        fatalError("init(coder:) has not been implemented")
30
+    }
31
+    
32
+    override public func viewDidLoad() {
33
+        super.viewDidLoad()
34
+        view.backgroundColor = UIColor.white
35
+        view.addSubview(webView)
36
+        guard let url = URL(string: path ?? "") else { return }
37
+        webView.load(URLRequest(url: url))
38
+    }
39
+}
40
+
41
+extension WebViewController: NavigationBackViewController {}

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift

@@ -19,7 +19,7 @@ public protocol GestureRecognizerDelegate: class {
19 19
 public extension GestureRecognizerDelegate {
20 20
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
21 21
                            shouldReceive touch: UITouch) -> Bool {
22
-        return false
22
+        return true
23 23
     }
24 24
     
25 25
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,

+ 8 - 2
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift

@@ -16,8 +16,14 @@ class GestureRecognizerProxy: NSObject, UIGestureRecognizerDelegate {
16 16
     }
17 17
     
18 18
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
19
-        guard let delegate = delegate else { return false }
20
-        return delegate.gestureRecognizer(gestureRecognizer, shouldReceive: touch)
19
+        guard let d = delegate else { return false }
20
+        return d.gestureRecognizer(gestureRecognizer, shouldReceive: touch)
21
+    }
22
+    
23
+    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
24
+                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
25
+        guard let d = delegate else { return false }
26
+        return d.gestureRecognizer(gestureRecognizer, shouldRecognizeSimultaneouslyWith: otherGestureRecognizer)
21 27
     }
22 28
 }
23 29
 

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningDelegate.swift

@@ -8,7 +8,7 @@
8 8
 
9 9
 import Foundation
10 10
 
11
-public protocol ViewControllerTransitioningDelegate: class {
11
+public protocol ViewControllerTransitioningDelegate where Self: UIViewController {
12 12
     func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
13 13
     
14 14
     func animationController(forPresented presented: UIViewController,

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningProxy.swift

@@ -9,7 +9,7 @@
9 9
 import Foundation
10 10
 
11 11
 class ViewControllerTransitioningProxy: NSObject, UIViewControllerTransitioningDelegate {
12
-    weak var delegate: ViewControllerTransitioningDelegate?
12
+    var delegate: ViewControllerTransitioningDelegate?
13 13
     
14 14
     init(target: ViewControllerTransitioningDelegate) {
15 15
         delegate = target

+ 7 - 5
PaiAi/Paiai_iOS/App/AppCoordinator.swift

@@ -25,15 +25,17 @@ public final class AppCoordinator {
25 25
     
26 26
     var shareUserInfoViewModel = UserInfoViewModel()
27 27
     var containerViewController: ContainerViewController
28
+    var navigationController: UINavigationController
28 29
     
29 30
     fileprivate var coordinators = [CoordinatorKey: Coordinator]()
30 31
     
31
-    public init(_ containerVC: ContainerViewController) {
32
-        containerViewController = containerVC
32
+    public init(_ containerVC: ContainerViewController, navigationController: UINavigationController) {
33
+        self.containerViewController = containerVC
34
+        self.navigationController = navigationController
33 35
         containerViewController.delegate = self
34 36
         containerViewController.userInfo = shareUserInfoViewModel
35 37
         
36
-        self.containerViewController.loadViewIfNeeded()
38
+        containerViewController.loadViewIfNeeded()
37 39
         
38 40
         
39 41
         let homeVC = makeHomeViewController()
@@ -57,7 +59,7 @@ public final class AppCoordinator {
57 59
 extension AppCoordinator: ContainerViewControllerDelegate {
58 60
     func presentLogin() {
59 61
         let loginVC = makeLoginViewController()
60
-        containerViewController.navigationController?.addFullScreen(childViewController: loginVC)
62
+        navigationController.addFullScreen(childViewController: loginVC)
61 63
     }
62 64
     
63 65
     func presentMine() {
@@ -72,7 +74,7 @@ fileprivate extension AppCoordinator {
72 74
     func makeMineCoordinator() -> MineCoordinator {
73 75
         let mineVC = makeMineViewController()
74 76
         mineVC.userInfoViewModel = shareUserInfoViewModel
75
-        let mineCoordinator = MineCoordinator(mineVC, containerViewController: containerViewController)
77
+        let mineCoordinator = MineCoordinator(mineVC, navigationController: navigationController)
76 78
         
77 79
         return mineCoordinator
78 80
     }

+ 133 - 141
PaiAi/Paiai_iOS/App/Mine/Mine.storyboard

@@ -200,175 +200,166 @@
200 200
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Str-BX-Lky" userLabel="View-up">
201 201
                                 <rect key="frame" x="0.0" y="20" width="375" height="216"/>
202 202
                                 <subviews>
203
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">
204
-                                        <rect key="frame" x="117" y="38" width="140" height="140"/>
205
-                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
203
+                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">
204
+                                        <rect key="frame" x="117.5" y="38" width="140" height="140"/>
206 205
                                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
207 206
                                     </imageView>
208
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="npC-T1-7h9">
209
-                                        <rect key="frame" x="0.0" y="215.5" width="375" height="0.5"/>
210
-                                        <color key="backgroundColor" red="0.90588235294117647" green="0.90588235294117647" blue="0.90588235294117647" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
211
-                                        <constraints>
212
-                                            <constraint firstAttribute="height" constant="0.5" id="nzr-dW-ELC"/>
213
-                                        </constraints>
214
-                                    </view>
215 207
                                 </subviews>
216 208
                                 <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
217 209
                                 <constraints>
218
-                                    <constraint firstAttribute="bottom" secondItem="npC-T1-7h9" secondAttribute="bottom" id="pRQ-2f-mC5"/>
210
+                                    <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerX" secondItem="Str-BX-Lky" secondAttribute="centerX" id="5Hv-0h-6dw"/>
211
+                                    <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerY" secondItem="Str-BX-Lky" secondAttribute="centerY" id="ffl-F6-a1m"/>
219 212
                                     <constraint firstAttribute="height" constant="216" id="qV0-pB-Hya"/>
220
-                                    <constraint firstAttribute="trailing" secondItem="npC-T1-7h9" secondAttribute="trailing" id="qgp-rj-Xim"/>
221
-                                    <constraint firstItem="npC-T1-7h9" firstAttribute="leading" secondItem="Str-BX-Lky" secondAttribute="leading" id="rwW-jP-aMz"/>
222 213
                                 </constraints>
223 214
                             </view>
224
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="版本:1.0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">
225
-                                <rect key="frame" x="161" y="326" width="53" height="15"/>
226
-                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
227
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
228
-                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
229
-                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
230
-                                <nil key="highlightedColor"/>
231
-                            </label>
232
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Copyright@xfoto" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">
233
-                                <rect key="frame" x="146" y="327" width="82" height="12"/>
234
-                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
235
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
236
-                                <fontDescription key="fontDescription" type="system" pointSize="10"/>
237
-                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
238
-                                <nil key="highlightedColor"/>
239
-                            </label>
240 215
                             <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjC-jQ-LOw" userLabel="View-down">
241 216
                                 <rect key="frame" x="-4" y="236" width="383" height="431"/>
242 217
                                 <subviews>
243
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bc2-xm-kqy">
218
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mae-VW-ed0" userLabel="Contact Us View">
244 219
                                         <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
245
-                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
220
+                                        <subviews>
221
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-contactUs" translatesAutoresizingMaskIntoConstraints="NO" id="pVB-Uy-xXH">
222
+                                                <rect key="frame" x="16" y="8" width="32" height="32"/>
223
+                                            </imageView>
224
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系我们" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CYk-cu-pHl">
225
+                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
226
+                                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
227
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
228
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
229
+                                                <nil key="highlightedColor"/>
230
+                                            </label>
231
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="MgR-ta-3jg">
232
+                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
233
+                                            </imageView>
234
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L1g-sb-a5F">
235
+                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
236
+                                            </button>
237
+                                        </subviews>
238
+                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
246 239
                                         <constraints>
247
-                                            <constraint firstAttribute="height" constant="48" id="dUM-cx-mcg"/>
240
+                                            <constraint firstItem="L1g-sb-a5F" firstAttribute="top" secondItem="mae-VW-ed0" secondAttribute="top" id="Ed3-hb-G04"/>
241
+                                            <constraint firstAttribute="trailing" secondItem="L1g-sb-a5F" secondAttribute="trailing" id="MIe-EG-igO"/>
242
+                                            <constraint firstAttribute="height" constant="48" id="PV0-Cp-bDh"/>
243
+                                            <constraint firstAttribute="trailing" secondItem="MgR-ta-3jg" secondAttribute="trailing" constant="10" id="Q57-4S-ScE"/>
244
+                                            <constraint firstItem="pVB-Uy-xXH" firstAttribute="centerY" secondItem="mae-VW-ed0" secondAttribute="centerY" id="b8r-oD-lev"/>
245
+                                            <constraint firstItem="CYk-cu-pHl" firstAttribute="centerY" secondItem="mae-VW-ed0" secondAttribute="centerY" id="dY3-5f-FtW"/>
246
+                                            <constraint firstItem="L1g-sb-a5F" firstAttribute="leading" secondItem="mae-VW-ed0" secondAttribute="leading" id="opM-NR-KZp"/>
247
+                                            <constraint firstItem="CYk-cu-pHl" firstAttribute="leading" secondItem="pVB-Uy-xXH" secondAttribute="trailing" constant="14" id="rbD-xv-H9b"/>
248
+                                            <constraint firstItem="pVB-Uy-xXH" firstAttribute="leading" secondItem="mae-VW-ed0" secondAttribute="leading" constant="16" id="tjz-M3-idT"/>
249
+                                            <constraint firstItem="MgR-ta-3jg" firstAttribute="centerY" secondItem="mae-VW-ed0" secondAttribute="centerY" id="xBY-9U-DXI"/>
250
+                                            <constraint firstAttribute="bottom" secondItem="L1g-sb-a5F" secondAttribute="bottom" id="ygQ-9N-YQv"/>
248 251
                                         </constraints>
249
-                                        <connections>
250
-                                            <action selector="contactUs:" destination="P7c-Sd-BXp" eventType="touchUpInside" id="8Ev-Oz-oSg"/>
251
-                                        </connections>
252
-                                    </button>
253
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="MgR-ta-3jg">
254
-                                        <rect key="frame" x="349" y="6" width="24" height="36"/>
255
-                                    </imageView>
256
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系我们" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CYk-cu-pHl">
257
-                                        <rect key="frame" x="62" y="14" width="66" height="20"/>
258
-                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
259
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
260
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
261
-                                        <nil key="highlightedColor"/>
262
-                                    </label>
263
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="关于-联系我们" translatesAutoresizingMaskIntoConstraints="NO" id="pVB-Uy-xXH">
264
-                                        <rect key="frame" x="16" y="8" width="32" height="32"/>
265
-                                    </imageView>
266
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kL5-iA-2wt">
252
+                                    </view>
253
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EVY-h5-0pO" userLabel="Score View">
267 254
                                         <rect key="frame" x="0.0" y="48" width="383" height="48"/>
268
-                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
269
-                                        <constraints>
270
-                                            <constraint firstAttribute="height" constant="48" id="hWI-j6-a3r"/>
271
-                                        </constraints>
272
-                                        <connections>
273
-                                            <action selector="giveFen" destination="P7c-Sd-BXp" eventType="touchUpInside" id="Mhu-Cp-5xa"/>
274
-                                        </connections>
275
-                                    </button>
276
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="u4d-zF-dTA">
277
-                                        <rect key="frame" x="349" y="54" width="24" height="36"/>
278
-                                    </imageView>
279
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="给我评分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Sh6-Re-Ry3">
280
-                                        <rect key="frame" x="62" y="62" width="66" height="20"/>
281
-                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
282
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
283
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
284
-                                        <nil key="highlightedColor"/>
285
-                                    </label>
286
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="关于-评分" translatesAutoresizingMaskIntoConstraints="NO" id="Nm2-xx-B3w">
287
-                                        <rect key="frame" x="16" y="56" width="32" height="32"/>
288
-                                    </imageView>
289
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ibz-oi-jAe">
290
-                                        <rect key="frame" x="0.0" y="96" width="383" height="48"/>
291
-                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
292
-                                        <constraints>
293
-                                            <constraint firstAttribute="height" constant="48" id="rIP-jA-Fo4"/>
294
-                                        </constraints>
295
-                                        <connections>
296
-                                            <action selector="userAgreement:" destination="P7c-Sd-BXp" eventType="touchUpInside" id="nSF-oE-Pbk"/>
297
-                                        </connections>
298
-                                    </button>
299
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="YSe-Bt-0NL">
300
-                                        <rect key="frame" x="349" y="102" width="24" height="36"/>
301
-                                    </imageView>
302
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="用户协议" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kxq-PT-sYi">
303
-                                        <rect key="frame" x="62" y="110" width="66" height="20"/>
304
-                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
305
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
306
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
307
-                                        <nil key="highlightedColor"/>
308
-                                    </label>
309
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="关于-用户协议 " translatesAutoresizingMaskIntoConstraints="NO" id="CK4-vq-4yz">
310
-                                        <rect key="frame" x="16" y="104" width="32" height="32"/>
311
-                                    </imageView>
312
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UVV-rB-BFU">
313
-                                        <rect key="frame" x="62" y="95.5" width="321" height="0.5"/>
314
-                                        <color key="backgroundColor" red="0.90588235289999997" green="0.90588235289999997" blue="0.90588235289999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
255
+                                        <subviews>
256
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-score" translatesAutoresizingMaskIntoConstraints="NO" id="0O4-xB-jPJ">
257
+                                                <rect key="frame" x="16" y="8" width="32" height="32"/>
258
+                                            </imageView>
259
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="给我评分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAf-2j-KJO">
260
+                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
261
+                                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
262
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
263
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
264
+                                                <nil key="highlightedColor"/>
265
+                                            </label>
266
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="vLw-Zd-Mis">
267
+                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
268
+                                            </imageView>
269
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FIE-jb-ZGu">
270
+                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
271
+                                            </button>
272
+                                        </subviews>
273
+                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
315 274
                                         <constraints>
316
-                                            <constraint firstAttribute="height" constant="0.5" id="A4X-Nh-oXs"/>
275
+                                            <constraint firstItem="vLw-Zd-Mis" firstAttribute="centerY" secondItem="EVY-h5-0pO" secondAttribute="centerY" id="1E7-1z-kZ7"/>
276
+                                            <constraint firstItem="0O4-xB-jPJ" firstAttribute="centerY" secondItem="EVY-h5-0pO" secondAttribute="centerY" id="ALT-hh-MTM"/>
277
+                                            <constraint firstItem="FIE-jb-ZGu" firstAttribute="leading" secondItem="EVY-h5-0pO" secondAttribute="leading" id="D6N-Si-qSV"/>
278
+                                            <constraint firstItem="JAf-2j-KJO" firstAttribute="centerY" secondItem="EVY-h5-0pO" secondAttribute="centerY" id="KPu-br-EtQ"/>
279
+                                            <constraint firstItem="FIE-jb-ZGu" firstAttribute="top" secondItem="EVY-h5-0pO" secondAttribute="top" id="b5a-HR-UrD"/>
280
+                                            <constraint firstItem="0O4-xB-jPJ" firstAttribute="leading" secondItem="EVY-h5-0pO" secondAttribute="leading" constant="16" id="cMg-7o-zGG"/>
281
+                                            <constraint firstAttribute="trailing" secondItem="vLw-Zd-Mis" secondAttribute="trailing" constant="10" id="dMD-tt-A3K"/>
282
+                                            <constraint firstAttribute="height" constant="48" id="fsu-NH-yPo"/>
283
+                                            <constraint firstAttribute="bottom" secondItem="FIE-jb-ZGu" secondAttribute="bottom" id="jvn-QK-tPP"/>
284
+                                            <constraint firstAttribute="trailing" secondItem="FIE-jb-ZGu" secondAttribute="trailing" id="rKv-jZ-8C3"/>
285
+                                            <constraint firstItem="JAf-2j-KJO" firstAttribute="leading" secondItem="0O4-xB-jPJ" secondAttribute="trailing" constant="14" id="zGg-au-jbn"/>
317 286
                                         </constraints>
318 287
                                     </view>
319
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8wT-3F-YEB">
320
-                                        <rect key="frame" x="62" y="47.5" width="321" height="0.5"/>
321
-                                        <color key="backgroundColor" red="0.90588235289999997" green="0.90588235289999997" blue="0.90588235289999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
288
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hN9-6g-QCB" userLabel="User Agreement View">
289
+                                        <rect key="frame" x="0.0" y="96" width="383" height="48"/>
290
+                                        <subviews>
291
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-userAgreement" translatesAutoresizingMaskIntoConstraints="NO" id="u6G-8X-fqc">
292
+                                                <rect key="frame" x="16" y="8" width="32" height="32"/>
293
+                                            </imageView>
294
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="用户协议" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="COm-64-2lk">
295
+                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
296
+                                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
297
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
298
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
299
+                                                <nil key="highlightedColor"/>
300
+                                            </label>
301
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="列表箭头" translatesAutoresizingMaskIntoConstraints="NO" id="mhJ-Uj-tdj">
302
+                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
303
+                                            </imageView>
304
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VGv-oO-leT">
305
+                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
306
+                                            </button>
307
+                                        </subviews>
308
+                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
322 309
                                         <constraints>
323
-                                            <constraint firstAttribute="height" constant="0.5" id="z9x-v3-pPw"/>
310
+                                            <constraint firstAttribute="bottom" secondItem="VGv-oO-leT" secondAttribute="bottom" id="0aT-Bt-dMd"/>
311
+                                            <constraint firstItem="u6G-8X-fqc" firstAttribute="leading" secondItem="hN9-6g-QCB" secondAttribute="leading" constant="16" id="624-Sr-wFs"/>
312
+                                            <constraint firstAttribute="trailing" secondItem="mhJ-Uj-tdj" secondAttribute="trailing" constant="10" id="EuA-km-rpD"/>
313
+                                            <constraint firstItem="VGv-oO-leT" firstAttribute="leading" secondItem="hN9-6g-QCB" secondAttribute="leading" id="OEU-mG-OlU"/>
314
+                                            <constraint firstAttribute="height" constant="48" id="OcV-Pt-Pdy"/>
315
+                                            <constraint firstAttribute="trailing" secondItem="VGv-oO-leT" secondAttribute="trailing" id="RGF-b4-y2h"/>
316
+                                            <constraint firstItem="COm-64-2lk" firstAttribute="centerY" secondItem="hN9-6g-QCB" secondAttribute="centerY" id="Uku-vk-bBm"/>
317
+                                            <constraint firstItem="COm-64-2lk" firstAttribute="leading" secondItem="u6G-8X-fqc" secondAttribute="trailing" constant="14" id="k2Q-Gl-cvs"/>
318
+                                            <constraint firstItem="u6G-8X-fqc" firstAttribute="centerY" secondItem="hN9-6g-QCB" secondAttribute="centerY" id="mCV-Uh-zpC"/>
319
+                                            <constraint firstItem="VGv-oO-leT" firstAttribute="top" secondItem="hN9-6g-QCB" secondAttribute="top" id="quD-eC-apC"/>
320
+                                            <constraint firstItem="mhJ-Uj-tdj" firstAttribute="centerY" secondItem="hN9-6g-QCB" secondAttribute="centerY" id="z8z-9u-ZAm"/>
324 321
                                         </constraints>
325 322
                                     </view>
326 323
                                 </subviews>
327 324
                                 <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
328 325
                                 <constraints>
329
-                                    <constraint firstItem="8wT-3F-YEB" firstAttribute="bottom" secondItem="bc2-xm-kqy" secondAttribute="bottom" id="65g-jn-hcT"/>
330
-                                    <constraint firstAttribute="trailing" secondItem="8wT-3F-YEB" secondAttribute="trailing" id="6JQ-JS-Ip1"/>
331
-                                    <constraint firstItem="Nm2-xx-B3w" firstAttribute="leading" secondItem="kL5-iA-2wt" secondAttribute="leading" constant="16" id="84L-jD-Pw8"/>
332
-                                    <constraint firstItem="u4d-zF-dTA" firstAttribute="trailing" secondItem="kL5-iA-2wt" secondAttribute="trailing" constant="-10" id="COq-GW-r7X"/>
333
-                                    <constraint firstItem="CK4-vq-4yz" firstAttribute="centerY" secondItem="ibz-oi-jAe" secondAttribute="centerY" id="CjC-5P-Asn"/>
334
-                                    <constraint firstItem="CYk-cu-pHl" firstAttribute="centerY" secondItem="pVB-Uy-xXH" secondAttribute="centerY" id="Dls-Sb-Shh"/>
335
-                                    <constraint firstAttribute="trailing" secondItem="UVV-rB-BFU" secondAttribute="trailing" id="GMD-4v-LKH"/>
336
-                                    <constraint firstItem="kL5-iA-2wt" firstAttribute="top" secondItem="bc2-xm-kqy" secondAttribute="bottom" id="HFK-QN-Bvm"/>
337
-                                    <constraint firstItem="kxq-PT-sYi" firstAttribute="centerY" secondItem="CK4-vq-4yz" secondAttribute="centerY" id="Heg-aa-ECd"/>
338
-                                    <constraint firstItem="u4d-zF-dTA" firstAttribute="centerY" secondItem="kL5-iA-2wt" secondAttribute="centerY" id="Iak-6n-Gud"/>
339
-                                    <constraint firstItem="kL5-iA-2wt" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Jgh-wt-u9c"/>
340
-                                    <constraint firstAttribute="trailing" secondItem="kL5-iA-2wt" secondAttribute="trailing" id="Jwz-vj-QMP"/>
341
-                                    <constraint firstItem="bc2-xm-kqy" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="NOF-oM-tG3"/>
342
-                                    <constraint firstAttribute="trailing" secondItem="ibz-oi-jAe" secondAttribute="trailing" id="Nuv-y4-nkd"/>
343
-                                    <constraint firstItem="UVV-rB-BFU" firstAttribute="bottom" secondItem="kL5-iA-2wt" secondAttribute="bottom" id="OtG-7N-4wa"/>
344
-                                    <constraint firstItem="UVV-rB-BFU" firstAttribute="leading" secondItem="Sh6-Re-Ry3" secondAttribute="leading" id="Pdb-aN-6A1"/>
345
-                                    <constraint firstItem="bc2-xm-kqy" firstAttribute="top" secondItem="bjC-jQ-LOw" secondAttribute="top" id="VaL-tC-Yca"/>
346
-                                    <constraint firstItem="pVB-Uy-xXH" firstAttribute="leading" secondItem="bc2-xm-kqy" secondAttribute="leading" constant="16" id="ZJr-HC-Ewa"/>
347
-                                    <constraint firstItem="pVB-Uy-xXH" firstAttribute="centerY" secondItem="bc2-xm-kqy" secondAttribute="centerY" id="bb6-Xu-bu5"/>
348
-                                    <constraint firstItem="YSe-Bt-0NL" firstAttribute="trailing" secondItem="ibz-oi-jAe" secondAttribute="trailing" constant="-10" id="blI-SI-Sre"/>
349
-                                    <constraint firstItem="ibz-oi-jAe" firstAttribute="top" secondItem="kL5-iA-2wt" secondAttribute="bottom" id="gpD-T1-aQn"/>
350
-                                    <constraint firstItem="MgR-ta-3jg" firstAttribute="centerY" secondItem="bc2-xm-kqy" secondAttribute="centerY" id="hhY-tM-Yro"/>
351
-                                    <constraint firstItem="ibz-oi-jAe" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="hko-xh-GEk"/>
352
-                                    <constraint firstAttribute="trailing" secondItem="bc2-xm-kqy" secondAttribute="trailing" id="j9a-UG-jWX"/>
353
-                                    <constraint firstItem="Sh6-Re-Ry3" firstAttribute="leading" secondItem="Nm2-xx-B3w" secondAttribute="trailing" constant="14" id="jaA-Ms-RwN"/>
354
-                                    <constraint firstItem="8wT-3F-YEB" firstAttribute="leading" secondItem="CYk-cu-pHl" secondAttribute="leading" id="neI-9C-tLD"/>
355
-                                    <constraint firstItem="CK4-vq-4yz" firstAttribute="leading" secondItem="ibz-oi-jAe" secondAttribute="leading" constant="16" id="owu-tC-JjZ"/>
356
-                                    <constraint firstItem="CYk-cu-pHl" firstAttribute="leading" secondItem="pVB-Uy-xXH" secondAttribute="trailing" constant="14" id="rAe-Y2-twj"/>
357
-                                    <constraint firstItem="YSe-Bt-0NL" firstAttribute="centerY" secondItem="ibz-oi-jAe" secondAttribute="centerY" id="rIX-lQ-ZRW"/>
358
-                                    <constraint firstItem="MgR-ta-3jg" firstAttribute="trailing" secondItem="bc2-xm-kqy" secondAttribute="trailing" constant="-10" id="rej-aa-eUr"/>
359
-                                    <constraint firstItem="Sh6-Re-Ry3" firstAttribute="centerY" secondItem="Nm2-xx-B3w" secondAttribute="centerY" id="ubQ-U7-gLQ"/>
360
-                                    <constraint firstItem="Nm2-xx-B3w" firstAttribute="centerY" secondItem="kL5-iA-2wt" secondAttribute="centerY" id="vGp-DO-BSU"/>
361
-                                    <constraint firstItem="kxq-PT-sYi" firstAttribute="leading" secondItem="CK4-vq-4yz" secondAttribute="trailing" constant="14" id="x9l-O0-sX8"/>
326
+                                    <constraint firstItem="mae-VW-ed0" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="25m-1u-PlX"/>
327
+                                    <constraint firstAttribute="trailing" secondItem="EVY-h5-0pO" secondAttribute="trailing" id="Cl6-If-4fD"/>
328
+                                    <constraint firstItem="EVY-h5-0pO" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Cmx-5f-fSM"/>
329
+                                    <constraint firstItem="EVY-h5-0pO" firstAttribute="top" secondItem="mae-VW-ed0" secondAttribute="bottom" id="Kg3-vC-Ohr"/>
330
+                                    <constraint firstAttribute="trailing" secondItem="mae-VW-ed0" secondAttribute="trailing" id="Qtq-6O-uU3"/>
331
+                                    <constraint firstItem="hN9-6g-QCB" firstAttribute="top" secondItem="EVY-h5-0pO" secondAttribute="bottom" id="SCp-cp-eDW"/>
332
+                                    <constraint firstItem="hN9-6g-QCB" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Ufj-Mi-XEY"/>
333
+                                    <constraint firstAttribute="trailing" secondItem="hN9-6g-QCB" secondAttribute="trailing" id="YLN-9T-LED"/>
334
+                                    <constraint firstItem="mae-VW-ed0" firstAttribute="top" secondItem="bjC-jQ-LOw" secondAttribute="top" id="qXw-XK-Fq0"/>
362 335
                                 </constraints>
363 336
                             </view>
337
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Copyright@pai.ai" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">
338
+                                <rect key="frame" x="146.5" y="649" width="82" height="12"/>
339
+                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
340
+                                <fontDescription key="fontDescription" type="system" pointSize="10"/>
341
+                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
342
+                                <nil key="highlightedColor"/>
343
+                            </label>
344
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本:1.0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">
345
+                                <rect key="frame" x="161" y="628.5" width="53" height="14.5"/>
346
+                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
347
+                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
348
+                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
349
+                                <nil key="highlightedColor"/>
350
+                            </label>
364 351
                         </subviews>
365 352
                         <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
366 353
                         <constraints>
367 354
                             <constraint firstItem="bjC-jQ-LOw" firstAttribute="leading" secondItem="gzV-sh-iNN" secondAttribute="leadingMargin" constant="-20" id="4XL-Mn-Bda"/>
368 355
                             <constraint firstAttribute="bottom" secondItem="bjC-jQ-LOw" secondAttribute="bottom" id="7cS-3o-xis"/>
369 356
                             <constraint firstItem="bjC-jQ-LOw" firstAttribute="centerX" secondItem="szY-tb-XAT" secondAttribute="centerX" id="B1z-7x-Vdk"/>
357
+                            <constraint firstItem="inH-WZ-fdD" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="BGs-5i-uoA"/>
358
+                            <constraint firstItem="bEV-QT-Egq" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="CGs-tu-a6G"/>
359
+                            <constraint firstItem="szY-tb-XAT" firstAttribute="bottom" secondItem="inH-WZ-fdD" secondAttribute="bottom" constant="6" id="XIG-RN-kfd"/>
370 360
                             <constraint firstItem="bjC-jQ-LOw" firstAttribute="top" secondItem="Str-BX-Lky" secondAttribute="bottom" id="dKZ-iN-vPM"/>
371 361
                             <constraint firstItem="szY-tb-XAT" firstAttribute="trailing" secondItem="Str-BX-Lky" secondAttribute="trailing" id="fpg-jU-lLU"/>
362
+                            <constraint firstItem="inH-WZ-fdD" firstAttribute="top" secondItem="bEV-QT-Egq" secondAttribute="bottom" constant="6" id="gQZ-xs-1i5"/>
372 363
                             <constraint firstItem="Str-BX-Lky" firstAttribute="top" secondItem="szY-tb-XAT" secondAttribute="top" id="n5h-V7-STS"/>
373 364
                             <constraint firstAttribute="trailingMargin" secondItem="bjC-jQ-LOw" secondAttribute="trailing" constant="-20" id="wJd-7K-65L"/>
374 365
                             <constraint firstItem="Str-BX-Lky" firstAttribute="leading" secondItem="szY-tb-XAT" secondAttribute="leading" id="x2e-5M-bfE"/>
@@ -377,14 +368,15 @@
377 368
                     </view>
378 369
                     <navigationItem key="navigationItem" id="plF-EP-Z5g"/>
379 370
                     <connections>
380
-                        <outlet property="scoreBtn" destination="kL5-iA-2wt" id="zao-TW-Rnn"/>
381
-                        <outlet property="scoreLabel" destination="Sh6-Re-Ry3" id="hBp-gS-PEs"/>
371
+                        <outlet property="contactUsBtn" destination="L1g-sb-a5F" id="t0g-Wx-dry"/>
372
+                        <outlet property="scoreBtn" destination="FIE-jb-ZGu" id="nmA-Dz-Bwe"/>
373
+                        <outlet property="userAgreementBtn" destination="VGv-oO-leT" id="Dzs-He-hds"/>
382 374
                         <outlet property="versionLabel" destination="bEV-QT-Egq" id="uQ9-IF-ImJ"/>
383 375
                     </connections>
384 376
                 </viewController>
385 377
                 <placeholder placeholderIdentifier="IBFirstResponder" id="i5Y-H4-CYK" userLabel="First Responder" sceneMemberID="firstResponder"/>
386 378
             </objects>
387
-            <point key="canvasLocation" x="144" y="926.53673163418296"/>
379
+            <point key="canvasLocation" x="143.19999999999999" y="926.08695652173924"/>
388 380
         </scene>
389 381
         <!--Mine Order View Controller-->
390 382
         <scene sceneID="3e4-t5-KsN">
@@ -632,10 +624,10 @@
632 624
     </scenes>
633 625
     <resources>
634 626
         <image name="Logo" width="140" height="140"/>
627
+        <image name="about-contactUs" width="32" height="32"/>
628
+        <image name="about-score" width="32" height="32"/>
629
+        <image name="about-userAgreement" width="32" height="32"/>
635 630
         <image name="navigation-background" width="12" height="132"/>
636
-        <image name="关于-用户协议 " width="32" height="32"/>
637
-        <image name="关于-联系我们" width="32" height="32"/>
638
-        <image name="关于-评分" width="32" height="32"/>
639 631
         <image name="列表箭头" width="24" height="36"/>
640 632
         <image name="注销切图" width="32" height="32"/>
641 633
         <image name="默认头像" width="240" height="240"/>

+ 44 - 29
PaiAi/Paiai_iOS/App/Mine/MineAboutViewController.swift

@@ -9,51 +9,66 @@
9 9
 import UIKit
10 10
 import PaiaiDataKit
11 11
 import PaiaiUIKit
12
+import RxSwift
12 13
 
13
-struct AboutWebModel {
14
-    
15
-}
16 14
 
17 15
 final class MineAboutViewController: UIViewController {
18 16
 
19
-    // MARK: Storyboard property
20
-    @IBOutlet var versionLabel: UILabel!
17
+    @IBOutlet weak var contactUsBtn: UIButton!
21 18
     @IBOutlet weak var scoreBtn: UIButton!
22
-    @IBOutlet weak var scoreLabel: UILabel!
23
-
19
+    @IBOutlet weak var userAgreementBtn: UIButton!
20
+    @IBOutlet var versionLabel: UILabel!
21
+    
22
+    private var disposeBag = DisposeBag()
23
+    
24 24
     // MARK: view function
25 25
     override func viewDidLoad() {
26 26
         super.viewDidLoad()
27
-
27
+        
28 28
 //        scoreLabel.text = UserDefaults.Account.bool(forKey: .isAudit) ? "敬请期待" : "给我评分"
29 29
 //        scoreBtn.isEnabled = !(UserDefaults.Account.bool(forKey: .isAudit))
30
+        title = "关于"
30 31
         versionLabel.text = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
32
+        bindGestures()
31 33
     }
34
+}
32 35
 
33
-    override func viewWillAppear(_ animated: Bool) {
34
-        super.viewWillAppear(true)
35
-//        titleWithbackBar = "关于"
36
+fileprivate extension MineAboutViewController {
37
+    func bindGestures() {
38
+        bindGestureToContactUsAction()
39
+        bindGestureToScoreAction()
40
+        bindGestureToUserAgreementAction()
36 41
     }
37
-
38
-    // MARK: Storyboard  button function
39
-    @IBAction func giveFen() {
40
-        guard let url = URL(string: "https://itunes.apple.com/cn/app/pai-aipaiai/id1163960351?mt=8") else {
41
-            return
42
-        }
43
-        UIApplication.shared.openURL(url)
42
+    
43
+    func bindGestureToContactUsAction() {
44
+        contactUsBtn.rx.tap
45
+            .asObservable()
46
+            .subscribe { (_) in
47
+                let webVC = WebViewController(title: "联系我们",
48
+                                              path: "https://pai.ai/page/contact_us")
49
+                self.pushViewController(webVC)
50
+            }.disposed(by: disposeBag)
44 51
     }
45
-    @IBAction func contactUs(_ sender: UIButton) {
46
-//        let about = UIStoryboard.mine.instantiateController(AboutWebViewController.self)
47
-//        about.url = "http://xfoto.com.cn/page/contact_us"
48
-//        about.title = "联系我们"
49
-//        navigationController?.pushViewController(about, animated: true)
52
+    
53
+    func bindGestureToScoreAction() {
54
+        scoreBtn.rx.tap
55
+            .asObservable()
56
+            .subscribe { (_) in
57
+                guard let url = URL(string: "https://itunes.apple.com/cn/app/pai-aipaiai/id1163960351?mt=8") else {
58
+                    return
59
+                }
60
+                UIApplication.shared.open(url, options: [:], completionHandler: nil)
61
+            }.disposed(by: disposeBag)
50 62
     }
51
-
52
-    @IBAction func userAgreement(_ sender: UIButton) {
53
-//        let about = UIStoryboard.mine.instantiateController(AboutWebViewController.self)
54
-//        about.url = "http://xfoto.com.cn/page/user_agreement"
55
-//        about.title = "用户协议"
56
-//        navigationController?.pushViewController(about, animated: true)
63
+    
64
+    func bindGestureToUserAgreementAction() {
65
+        userAgreementBtn.rx.tap
66
+            .asObservable()
67
+            .subscribe { (_) in
68
+                let webVC = WebViewController(title: "用户协议",
69
+                                              path: "https://pai.ai/page/user_agreement")
70
+                self.pushViewController(webVC)
71
+            }.disposed(by: disposeBag)
57 72
     }
58 73
 }
59 74
 

+ 5 - 3
PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift

@@ -13,12 +13,12 @@ import PaiaiUIKit
13 13
 class MineCoordinator: Coordinator {
14 14
     
15 15
     let mineViewController: MineViewController
16
-    let containerViewController: ContainerViewController
16
+    let navigationController: UINavigationController
17 17
 //    let shareUserInfoViewModel
18 18
     
19
-    init(_ mineViewController: MineViewController, containerViewController: ContainerViewController) {
19
+    init(_ mineViewController: MineViewController, containerViewController: UINavigationController) {
20 20
         self.mineViewController = mineViewController
21
-        self.containerViewController = containerViewController
21
+        self.navigationController = navigationController
22 22
         self.mineViewController.delegate = self
23 23
     }
24 24
     
@@ -39,6 +39,7 @@ extension MineCoordinator: MineViewControllerDelegate {
39 39
         switch item {
40 40
         case .group:
41 41
             let vc = makeMineGroupViewController()
42
+            navigationController
42 43
             containerViewController.pushViewController(vc)
43 44
         case .order:
44 45
             let vc = makeMineOrderViewController()
@@ -77,6 +78,7 @@ fileprivate extension MineCoordinator {
77 78
     
78 79
     func makeMineFeedbackViewController() -> MineFeedbackViewController {
79 80
         let vc = UIStoryboard.mine.instantiateController(MineFeedbackViewController.self)
81
+        vc.feedbackAPI = FeedbackRemoteAPI()
80 82
         return vc
81 83
     }
82 84
     

+ 11 - 7
PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

@@ -19,20 +19,24 @@ final class MineFeedbackViewController: UIViewController {
19 19
     @IBOutlet var sendBtn: UIButton!
20 20
     fileprivate let disposeBag = DisposeBag()
21 21
     
22
-//    var viewModel: MineFeedbackViewModel!
22
+    var feedbackAPI: FeedbackRemoteAPI!
23
+    
23 24
     // MARK: view function
24 25
     override func viewDidLoad() {
25 26
         super.viewDidLoad()
27
+        title = "意见反馈"
26 28
         textView.placeholder = "您的建议是我们前进的动力"
27
-        configurationRx()
28
-    }
29
-    
30
-    func configurationRx() {
31
-        
29
+        bindTextViewToSendBtn()
32 30
     }
33 31
 
34 32
     @IBAction func sendFeedBack() {
35
-//        viewModel.submit(content)
33
+        feedbackAPI.submit(text: textView.text).subscribe(onCompleted: {[weak self] in
34
+            guard let `self` = self else { return }
35
+            self.popController()
36
+            Toast.show(message: "感谢您的建议")
37
+        }) { (error) in
38
+            
39
+        }.disposed(by: disposeBag)
36 40
     }
37 41
 
38 42
     @IBAction func tap() {