@@ -8,7 +8,7 @@  | 
            ||
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                /* Begin PBXBuildFile section */  | 
            
| 10 | 10 | 
                 		0500C25E21E72E45009A7013 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 05E80E2F21DF65D4006368C4 /* Assets.xcassets */; };
               | 
            
| 11 | 
                -		0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0500C26421E8644E009A7013 /* NavigationBackDelegate.swift */; };
               | 
            |
| 11 | 
                +		0500C26521E8644E009A7013 /* NavigationBackItemDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */; };
               | 
            |
| 12 | 12 | 
                 		0505ACF921DF104500404071 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACF821DF104500404071 /* SystemConfiguration.framework */; };
               | 
            
| 13 | 13 | 
                 		0505ACFB21DF106000404071 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACFA21DF106000404071 /* libsqlite3.0.tbd */; };
               | 
            
| 14 | 14 | 
                 		0505ACFD21DF106F00404071 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACFC21DF106E00404071 /* libc++.tbd */; };
               | 
            
                @@ -38,7 +38,6 @@  | 
            ||
| 38 | 38 | 
                 		050D719B22531B860076CE06 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 050D719A22531B860076CE06 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
               | 
            
| 39 | 39 | 
                 		050D719D22531BA60076CE06 /* SQLite.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 050D719C22531BA60076CE06 /* SQLite.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
               | 
            
| 40 | 40 | 
                 		050D719E22531BBF0076CE06 /* Differentiator.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05130FBD21CA194B004EF1BE /* Differentiator.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
               | 
            
| 41 | 
                -		050D71A322545D550076CE06 /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 050D71A222545D550076CE06 /* NavigationController.swift */; };
               | 
            |
| 42 | 41 | 
                 		05130F4021C94B33004EF1BE /* PaiaiUIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 05130F3021C94B32004EF1BE /* PaiaiUIKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
               | 
            
| 43 | 42 | 
                 		05130F5721C94C12004EF1BE /* AlertAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05130F4F21C94C12004EF1BE /* AlertAnimator.swift */; };
               | 
            
| 44 | 43 | 
                 		05130F5921C94C12004EF1BE /* AlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05130F5121C94C12004EF1BE /* AlertViewController.swift */; };
               | 
            
                @@ -209,6 +208,7 @@  | 
            ||
| 209 | 208 | 
                 		0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */; };
               | 
            
| 210 | 209 | 
                 		0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */; };
               | 
            
| 211 | 210 | 
                 		0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */; };
               | 
            
| 211 | 
                +		058C33EE2272F7BE00A435E9 /* UINavigationController + NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058C33ED2272F7BE00A435E9 /* UINavigationController + NavigationBack.swift */; };
               | 
            |
| 212 | 212 | 
                 		058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */; };
               | 
            
| 213 | 213 | 
                 		058D0CA02249FCF6006CA488 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
               | 
            
| 214 | 214 | 
                 		058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
               | 
            
                @@ -219,6 +219,7 @@  | 
            ||
| 219 | 219 | 
                 		059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A521F7235D00FA64C2 /* AlertAction.swift */; };
               | 
            
| 220 | 220 | 
                 		059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A721F83B1600FA64C2 /* CenterCancelItem.swift */; };
               | 
            
| 221 | 221 | 
                 		059B58AA21F83B2E00FA64C2 /* CenterConfirmItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A921F83B2E00FA64C2 /* CenterConfirmItem.swift */; };
               | 
            
| 222 | 
                +		05AF61BF226EFAF700AD8E2F /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AF61BE226EFAF700AD8E2F /* NavigationBar.swift */; };
               | 
            |
| 222 | 223 | 
                 		05B2C5EF21D48133008063B3 /* HomeRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B2C5EE21D48133008063B3 /* HomeRemoteAPI.swift */; };
               | 
            
| 223 | 224 | 
                 		05B2C60621D60E97008063B3 /* DictionaryExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B2C60521D60E97008063B3 /* DictionaryExt.swift */; };
               | 
            
| 224 | 225 | 
                 		05B2C61D21D710C5008063B3 /* GroupRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B2C61C21D710C5008063B3 /* GroupRemoteAPI.swift */; };
               | 
            
                @@ -241,22 +242,16 @@  | 
            ||
| 241 | 242 | 
                 		05C71C0821DDBD55003E7CEE /* JSONCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C71C0721DDBD55003E7CEE /* JSONCode.swift */; };
               | 
            
| 242 | 243 | 
                 		05C8D21021ED7B280001E847 /* UIApplication+Swizzle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D20F21ED7B270001E847 /* UIApplication+Swizzle.swift */; };
               | 
            
| 243 | 244 | 
                 		05C8D21221ED7B620001E847 /* UINavigationBar+FixSpace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21121ED7B620001E847 /* UINavigationBar+FixSpace.swift */; };
               | 
            
| 244 | 
                -		05C8D21421ED8B9B0001E847 /* NavigationBackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */; };
               | 
            |
| 245 | 
                -		05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */; };
               | 
            |
| 246 | 245 | 
                 		05C8D21B21ED9A020001E847 /* UIViewController+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */; };
               | 
            
| 247 | 
                -		05C8D21D21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */; };
               | 
            |
| 248 | 
                -		05C8D22021EDD5F50001E847 /* NavigationBarInOutAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */; };
               | 
            |
| 249 | 
                -		05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */; };
               | 
            |
| 250 | 
                -		05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */; };
               | 
            |
| 251 | 246 | 
                 		05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */; };
               | 
            
| 252 | 247 | 
                 		05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */; };
               | 
            
| 253 | 248 | 
                 		05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C521FF010900A29A20 /* WebViewController.swift */; };
               | 
            
| 254 | 
                -		05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */; };
               | 
            |
| 255 | 249 | 
                 		05D3A3CD22000C3A00A29A20 /* GroupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */; };
               | 
            
| 256 | 250 | 
                 		05D3A3D02200288400A29A20 /* Storyboarded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CF2200288400A29A20 /* Storyboarded.swift */; };
               | 
            
| 257 | 251 | 
                 		05E80E3021DF65D5006368C4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 05E80E2F21DF65D4006368C4 /* Assets.xcassets */; };
               | 
            
| 258 | 252 | 
                 		05ED11C52251A90000FF3758 /* PhotoPurchaseRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05ED11C42251A90000FF3758 /* PhotoPurchaseRemoteAPI.swift */; };
               | 
            
| 259 | 253 | 
                 		05ED11C72252165700FF3758 /* Notification+wxPay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05ED11C62252165700FF3758 /* Notification+wxPay.swift */; };
               | 
            
| 254 | 
                +		05EE558B226F070B00E13460 /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05EE558A226F070B00E13460 /* NavigationController.swift */; };
               | 
            |
| 260 | 255 | 
                /* End PBXBuildFile section */  | 
            
| 261 | 256 | 
                 | 
            
| 262 | 257 | 
                /* Begin PBXContainerItemProxy section */  | 
            
                @@ -324,7 +319,7 @@  | 
            ||
| 324 | 319 | 
                 | 
            
| 325 | 320 | 
                /* Begin PBXFileReference section */  | 
            
| 326 | 321 | 
                 		045F01541DED33DC00B80C87 /* Paiai.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Paiai.entitlements; sourceTree = "<group>"; };
               | 
            
| 327 | 
                -		0500C26421E8644E009A7013 /* NavigationBackDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackDelegate.swift; sourceTree = "<group>"; };
               | 
            |
| 322 | 
                +		0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackItemDelegate.swift; sourceTree = "<group>"; };
               | 
            |
| 328 | 323 | 
                 		0505ACF821DF104500404071 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
               | 
            
| 329 | 324 | 
                 		0505ACFA21DF106000404071 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
               | 
            
| 330 | 325 | 
                 		0505ACFC21DF106E00404071 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
               | 
            
                @@ -345,7 +340,6 @@  | 
            ||
| 345 | 340 | 
                 		050D719822531B780076CE06 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = "<group>"; };
               | 
            
| 346 | 341 | 
                 		050D719A22531B860076CE06 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = "<group>"; };
               | 
            
| 347 | 342 | 
                 		050D719C22531BA60076CE06 /* SQLite.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SQLite.framework; path = Carthage/Build/iOS/SQLite.framework; sourceTree = "<group>"; };
               | 
            
| 348 | 
                -		050D71A222545D550076CE06 /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = "<group>"; };
               | 
            |
| 349 | 343 | 
                 		050E210F21B8CE8A008E1352 /* AppCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 350 | 344 | 
                 		050E211121B8F2D4008E1352 /* HomeCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 351 | 345 | 
                 		050E211321B8F39C008E1352 /* MineCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MineCoordinator.swift; sourceTree = "<group>"; };
               | 
            
                @@ -468,6 +462,7 @@  | 
            ||
| 468 | 462 | 
                 		0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentAnimatorDelegate.swift; sourceTree = "<group>"; };
               | 
            
| 469 | 463 | 
                 		0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentExtension.swift; sourceTree = "<group>"; };
               | 
            
| 470 | 464 | 
                 		0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentViewController.swift; sourceTree = "<group>"; };
               | 
            
| 465 | 
                +		058C33ED2272F7BE00A435E9 /* UINavigationController + NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController + NavigationBack.swift"; sourceTree = "<group>"; };
               | 
            |
| 471 | 466 | 
                 		058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorKey.swift; sourceTree = "<group>"; };
               | 
            
| 472 | 467 | 
                 		0594845721B528FE00074EFC /* Interfaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = "<group>"; };
               | 
            
| 473 | 468 | 
                 		059AA5D921BA1A2000485188 /* MessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCoordinator.swift; sourceTree = "<group>"; };
               | 
            
                @@ -478,6 +473,7 @@  | 
            ||
| 478 | 473 | 
                 		059B58A721F83B1600FA64C2 /* CenterCancelItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterCancelItem.swift; sourceTree = "<group>"; };
               | 
            
| 479 | 474 | 
                 		059B58A921F83B2E00FA64C2 /* CenterConfirmItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterConfirmItem.swift; sourceTree = "<group>"; };
               | 
            
| 480 | 475 | 
                 		05A0E8A821C782D700EAB9A2 /* CreateGroupViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupViewModel.swift; sourceTree = "<group>"; };
               | 
            
| 476 | 
                +		05AF61BE226EFAF700AD8E2F /* NavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = "<group>"; };
               | 
            |
| 481 | 477 | 
                 		05B2C5EE21D48133008063B3 /* HomeRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRemoteAPI.swift; sourceTree = "<group>"; };
               | 
            
| 482 | 478 | 
                 		05B2C60521D60E97008063B3 /* DictionaryExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryExt.swift; sourceTree = "<group>"; };
               | 
            
| 483 | 479 | 
                 		05B2C61C21D710C5008063B3 /* GroupRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupRemoteAPI.swift; sourceTree = "<group>"; };
               | 
            
                @@ -500,22 +496,16 @@  | 
            ||
| 500 | 496 | 
                 		05C71C0721DDBD55003E7CEE /* JSONCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONCode.swift; sourceTree = "<group>"; };
               | 
            
| 501 | 497 | 
                 		05C8D20F21ED7B270001E847 /* UIApplication+Swizzle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Swizzle.swift"; sourceTree = "<group>"; };
               | 
            
| 502 | 498 | 
                 		05C8D21121ED7B620001E847 /* UINavigationBar+FixSpace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationBar+FixSpace.swift"; sourceTree = "<group>"; };
               | 
            
| 503 | 
                -		05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackViewController.swift; sourceTree = "<group>"; };
               | 
            |
| 504 | 
                -		05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+NavigationBack.swift"; sourceTree = "<group>"; };
               | 
            |
| 505 | 499 | 
                 		05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Navigation.swift"; sourceTree = "<group>"; };
               | 
            
| 506 | 
                -		05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInteractivePopDeletegate.swift; sourceTree = "<group>"; };
               | 
            |
| 507 | 
                -		05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInOutAnimator.swift; sourceTree = "<group>"; };
               | 
            |
| 508 | 
                -		05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInteractiveViewController.swift; sourceTree = "<group>"; };
               | 
            |
| 509 | 
                -		05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarPushAndPopDelegate.swift; sourceTree = "<group>"; };
               | 
            |
| 510 | 500 | 
                 		05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerProxy.swift; sourceTree = "<group>"; };
               | 
            
| 511 | 501 | 
                 		05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerDelegate.swift; sourceTree = "<group>"; };
               | 
            
| 512 | 502 | 
                 		05D3A3C521FF010900A29A20 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = "<group>"; };
               | 
            
| 513 | 
                -		05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GestureRecoginzier+NavigationBack.swift"; sourceTree = "<group>"; };
               | 
            |
| 514 | 503 | 
                 		05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 515 | 504 | 
                 		05D3A3CF2200288400A29A20 /* Storyboarded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storyboarded.swift; sourceTree = "<group>"; };
               | 
            
| 516 | 505 | 
                 		05E80E2F21DF65D4006368C4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
               | 
            
| 517 | 506 | 
                 		05ED11C42251A90000FF3758 /* PhotoPurchaseRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoPurchaseRemoteAPI.swift; sourceTree = "<group>"; };
               | 
            
| 518 | 507 | 
                 		05ED11C62252165700FF3758 /* Notification+wxPay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+wxPay.swift"; sourceTree = "<group>"; };
               | 
            
| 508 | 
                +		05EE558A226F070B00E13460 /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = "<group>"; };
               | 
            |
| 519 | 509 | 
                 		3864C06C1CAD27EC0048ADAD /* Swift-bridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swift-bridge.h"; sourceTree = "<group>"; };
               | 
            
| 520 | 510 | 
                 		42CF50451EC0526C00D23E9F /* MineGroupViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineGroupViewModel.swift; sourceTree = "<group>"; };
               | 
            
| 521 | 511 | 
                 		42CF50471EC052B200D23E9F /* MineOrderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineOrderViewModel.swift; sourceTree = "<group>"; };
               | 
            
                @@ -648,7 +638,8 @@  | 
            ||
| 648 | 638 | 
                 		050D71A122545CE20076CE06 /* NavigationController */ = {
               | 
            
| 649 | 639 | 
                isa = PBXGroup;  | 
            
| 650 | 640 | 
                children = (  | 
            
| 651 | 
                - 050D71A222545D550076CE06 /* NavigationController.swift */,  | 
            |
| 641 | 
                + 05AF61BE226EFAF700AD8E2F /* NavigationBar.swift */,  | 
            |
| 642 | 
                + 05EE558A226F070B00E13460 /* NavigationController.swift */,  | 
            |
| 652 | 643 | 
                );  | 
            
| 653 | 644 | 
                path = NavigationController;  | 
            
| 654 | 645 | 
                sourceTree = "<group>";  | 
            
                @@ -679,11 +670,10 @@  | 
            ||
| 679 | 670 | 
                 		05130F4D21C94B72004EF1BE /* UIKit */ = {
               | 
            
| 680 | 671 | 
                isa = PBXGroup;  | 
            
| 681 | 672 | 
                children = (  | 
            
| 673 | 
                + 058C33EC2272F79800A435E9 /* NavigationBack */,  | 
            |
| 682 | 674 | 
                050D71A122545CE20076CE06 /* NavigationController */,  | 
            
| 683 | 675 | 
                055BB53F220AEA4E009548AA /* Nibless */,  | 
            
| 684 | 676 | 
                0584FD7A21FABA0300FA1E3E /* Present */,  | 
            
| 685 | 
                - 05C8D21E21EDD5A80001E847 /* NavigationBar */,  | 
            |
| 686 | 
                - 05C8D21721ED911D0001E847 /* NavigationBack */,  | 
            |
| 687 | 677 | 
                0513108921CA3914004EF1BE /* QR */,  | 
            
| 688 | 678 | 
                05130F4E21C94C12004EF1BE /* AlertViewController */,  | 
            
| 689 | 679 | 
                05130F6121C94C79004EF1BE /* PageViewController */,  | 
            
                @@ -1054,6 +1044,15 @@  | 
            ||
| 1054 | 1044 | 
                path = Present;  | 
            
| 1055 | 1045 | 
                sourceTree = "<group>";  | 
            
| 1056 | 1046 | 
                };  | 
            
| 1047 | 
                +		058C33EC2272F79800A435E9 /* NavigationBack */ = {
               | 
            |
| 1048 | 
                + isa = PBXGroup;  | 
            |
| 1049 | 
                + children = (  | 
            |
| 1050 | 
                + 0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */,  | 
            |
| 1051 | 
                + 058C33ED2272F7BE00A435E9 /* UINavigationController + NavigationBack.swift */,  | 
            |
| 1052 | 
                + );  | 
            |
| 1053 | 
                + path = NavigationBack;  | 
            |
| 1054 | 
                + sourceTree = "<group>";  | 
            |
| 1055 | 
                + };  | 
            |
| 1057 | 1056 | 
                 		059B58A021F7183100FA64C2 /* AlertAction */ = {
               | 
            
| 1058 | 1057 | 
                isa = PBXGroup;  | 
            
| 1059 | 1058 | 
                children = (  | 
            
                @@ -1142,28 +1141,6 @@  | 
            ||
| 1142 | 1141 | 
                path = ViewControllerTransitioningDelegate;  | 
            
| 1143 | 1142 | 
                sourceTree = "<group>";  | 
            
| 1144 | 1143 | 
                };  | 
            
| 1145 | 
                -		05C8D21721ED911D0001E847 /* NavigationBack */ = {
               | 
            |
| 1146 | 
                - isa = PBXGroup;  | 
            |
| 1147 | 
                - children = (  | 
            |
| 1148 | 
                - 05C8D21321ED8B9B0001E847 /* NavigationBackViewController.swift */,  | 
            |
| 1149 | 
                - 0500C26421E8644E009A7013 /* NavigationBackDelegate.swift */,  | 
            |
| 1150 | 
                - 05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */,  | 
            |
| 1151 | 
                - 05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */,  | 
            |
| 1152 | 
                - );  | 
            |
| 1153 | 
                - path = NavigationBack;  | 
            |
| 1154 | 
                - sourceTree = "<group>";  | 
            |
| 1155 | 
                - };  | 
            |
| 1156 | 
                -		05C8D21E21EDD5A80001E847 /* NavigationBar */ = {
               | 
            |
| 1157 | 
                - isa = PBXGroup;  | 
            |
| 1158 | 
                - children = (  | 
            |
| 1159 | 
                - 05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */,  | 
            |
| 1160 | 
                - 05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */,  | 
            |
| 1161 | 
                - 05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */,  | 
            |
| 1162 | 
                - 05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */,  | 
            |
| 1163 | 
                - );  | 
            |
| 1164 | 
                - path = NavigationBar;  | 
            |
| 1165 | 
                - sourceTree = "<group>";  | 
            |
| 1166 | 
                - };  | 
            |
| 1167 | 1144 | 
                 		05C8D22C21EF0F8E0001E847 /* NavigationControllerDelegate */ = {
               | 
            
| 1168 | 1145 | 
                isa = PBXGroup;  | 
            
| 1169 | 1146 | 
                children = (  | 
            
                @@ -1276,8 +1253,8 @@  | 
            ||
| 1276 | 1253 | 
                 		6CEBD0F61CA8D680004DBDE0 = {
               | 
            
| 1277 | 1254 | 
                isa = PBXGroup;  | 
            
| 1278 | 1255 | 
                children = (  | 
            
| 1279 | 
                - 050D719C22531BA60076CE06 /* SQLite.framework */,  | 
            |
| 1280 | 1256 | 
                050D719A22531B860076CE06 /* RxSwift.framework */,  | 
            
| 1257 | 
                + 050D719C22531BA60076CE06 /* SQLite.framework */,  | 
            |
| 1281 | 1258 | 
                050D719822531B780076CE06 /* RxCocoa.framework */,  | 
            
| 1282 | 1259 | 
                050D719622531B650076CE06 /* PullToRefresh.framework */,  | 
            
| 1283 | 1260 | 
                050D719422531B520076CE06 /* ObjectMapper.framework */,  | 
            
                @@ -1491,7 +1468,6 @@  | 
            ||
| 1491 | 1468 | 
                 				TargetAttributes = {
               | 
            
| 1492 | 1469 | 
                 					05130F2D21C94B32004EF1BE = {
               | 
            
| 1493 | 1470 | 
                CreatedOnToolsVersion = 10.1;  | 
            
| 1494 | 
                - DevelopmentTeam = Q38447SL4M;  | 
            |
| 1495 | 1471 | 
                LastSwiftMigration = 1020;  | 
            
| 1496 | 1472 | 
                ProvisioningStyle = Automatic;  | 
            
| 1497 | 1473 | 
                };  | 
            
                @@ -1509,7 +1485,6 @@  | 
            ||
| 1509 | 1485 | 
                };  | 
            
| 1510 | 1486 | 
                 					6CEBD0FE1CA8D680004DBDE0 = {
               | 
            
| 1511 | 1487 | 
                CreatedOnToolsVersion = 7.3;  | 
            
| 1512 | 
                - DevelopmentTeam = Q38447SL4M;  | 
            |
| 1513 | 1488 | 
                LastSwiftMigration = 1020;  | 
            
| 1514 | 1489 | 
                ProvisioningStyle = Automatic;  | 
            
| 1515 | 1490 | 
                 						SystemCapabilities = {
               | 
            
                @@ -1627,8 +1602,6 @@  | 
            ||
| 1627 | 1602 | 
                isa = PBXSourcesBuildPhase;  | 
            
| 1628 | 1603 | 
                buildActionMask = 2147483647;  | 
            
| 1629 | 1604 | 
                files = (  | 
            
| 1630 | 
                - 05C8D21D21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift in Sources */,  | 
            |
| 1631 | 
                - 05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */,  | 
            |
| 1632 | 1605 | 
                05130FFD21CA1B39004EF1BE /* HardwareAuthorization.swift in Sources */,  | 
            
| 1633 | 1606 | 
                05130FFE21CA1B39004EF1BE /* WaterfallFlowLayout.swift in Sources */,  | 
            
| 1634 | 1607 | 
                05130FFF21CA1B39004EF1BE /* WaterfallFlowConfiguration.swift in Sources */,  | 
            
                @@ -1637,19 +1610,18 @@  | 
            ||
| 1637 | 1610 | 
                059B58AA21F83B2E00FA64C2 /* CenterConfirmItem.swift in Sources */,  | 
            
| 1638 | 1611 | 
                05C5285E21FEB03F0090ECB5 /* ViewControllerTransitioningProxy.swift in Sources */,  | 
            
| 1639 | 1612 | 
                057317A421F5C6C0009B2FCE /* BottomCancelItem.swift in Sources */,  | 
            
| 1640 | 
                - 05C8D22021EDD5F50001E847 /* NavigationBarInOutAnimator.swift in Sources */,  | 
            |
| 1641 | 1613 | 
                0513100121CA1B39004EF1BE /* CGPointExt.swift in Sources */,  | 
            
| 1642 | 1614 | 
                0584FD7521F9C70D00FA1E3E /* SideAnimator.swift in Sources */,  | 
            
| 1643 | 1615 | 
                0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */,  | 
            
| 1644 | 1616 | 
                059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */,  | 
            
| 1617 | 
                + 058C33EE2272F7BE00A435E9 /* UINavigationController + NavigationBack.swift in Sources */,  | 
            |
| 1645 | 1618 | 
                059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */,  | 
            
| 1646 | 1619 | 
                0513109821CA3915004EF1BE /* QRCodeScanResult.swift in Sources */,  | 
            
| 1647 | 1620 | 
                0513100221CA1B39004EF1BE /* CGSizeExt.swift in Sources */,  | 
            
| 1648 | 
                - 05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */,  | 
            |
| 1649 | 1621 | 
                0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,  | 
            
| 1650 | 1622 | 
                0513100721CA1B39004EF1BE /* UIViewController+UIBarButtonItem.swift in Sources */,  | 
            
| 1651 | 1623 | 
                05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,  | 
            
| 1652 | 
                - 0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */,  | 
            |
| 1624 | 
                + 0500C26521E8644E009A7013 /* NavigationBackItemDelegate.swift in Sources */,  | 
            |
| 1653 | 1625 | 
                057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,  | 
            
| 1654 | 1626 | 
                0513106021CA1E53004EF1BE /* UIStoryboardExt.swift in Sources */,  | 
            
| 1655 | 1627 | 
                059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */,  | 
            
                @@ -1662,6 +1634,7 @@  | 
            ||
| 1662 | 1634 | 
                0513109B21CA3915004EF1BE /* QRCodeConfiguration.swift in Sources */,  | 
            
| 1663 | 1635 | 
                055BB541220AEA62009548AA /* NiblessView.swift in Sources */,  | 
            
| 1664 | 1636 | 
                0513101021CA1B39004EF1BE /* UIViewControllerExt.swift in Sources */,  | 
            
| 1637 | 
                + 05AF61BF226EFAF700AD8E2F /* NavigationBar.swift in Sources */,  | 
            |
| 1665 | 1638 | 
                0513101221CA1B39004EF1BE /* UITextFieldExt.swift in Sources */,  | 
            
| 1666 | 1639 | 
                05C0CEF921F8567C00993DE2 /* AlertView.swift in Sources */,  | 
            
| 1667 | 1640 | 
                0513108021CA3907004EF1BE /* ActionSheetView.swift in Sources */,  | 
            
                @@ -1671,21 +1644,18 @@  | 
            ||
| 1671 | 1644 | 
                0513101921CA1B39004EF1BE /* UIImageExt.swift in Sources */,  | 
            
| 1672 | 1645 | 
                05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */,  | 
            
| 1673 | 1646 | 
                05D3A3D02200288400A29A20 /* Storyboarded.swift in Sources */,  | 
            
| 1674 | 
                - 050D71A322545D550076CE06 /* NavigationController.swift in Sources */,  | 
            |
| 1675 | 1647 | 
                05C0CEFB21F85A7700993DE2 /* ActionSheetController.swift in Sources */,  | 
            
| 1676 | 
                - 05C8D21421ED8B9B0001E847 /* NavigationBackViewController.swift in Sources */,  | 
            |
| 1677 | 1648 | 
                0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */,  | 
            
| 1678 | 1649 | 
                05C8D21B21ED9A020001E847 /* UIViewController+Navigation.swift in Sources */,  | 
            
| 1679 | 1650 | 
                0513109521CA3915004EF1BE /* QRCodeScanDelegate.swift in Sources */,  | 
            
| 1680 | 1651 | 
                0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */,  | 
            
| 1681 | 1652 | 
                053E126521F1718E00A64893 /* PageOption.swift in Sources */,  | 
            
| 1682 | 
                - 05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */,  | 
            |
| 1683 | 
                - 05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */,  | 
            |
| 1684 | 1653 | 
                05130F5A21C94C12004EF1BE /* PresentDisappearAnimatedTransitioning.swift in Sources */,  | 
            
| 1685 | 1654 | 
                053E126721F1719F00A64893 /* PageItem.swift in Sources */,  | 
            
| 1686 | 1655 | 
                053E127821F5B6E400A64893 /* AlertController.swift in Sources */,  | 
            
| 1687 | 1656 | 
                05C5285621FE98F50090ECB5 /* GestureRecognizerProxy.swift in Sources */,  | 
            
| 1688 | 1657 | 
                05130F5921C94C12004EF1BE /* AlertViewController.swift in Sources */,  | 
            
| 1658 | 
                + 05EE558B226F070B00E13460 /* NavigationController.swift in Sources */,  | 
            |
| 1689 | 1659 | 
                0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */,  | 
            
| 1690 | 1660 | 
                0513109721CA3915004EF1BE /* QRCodeScanner.swift in Sources */,  | 
            
| 1691 | 1661 | 
                05130F5E21C94C12004EF1BE /* PresentAppearAnimatedTransitioning.swift in Sources */,  | 
            
                @@ -1930,7 +1900,7 @@  | 
            ||
| 1930 | 1900 | 
                CODE_SIGN_STYLE = Automatic;  | 
            
| 1931 | 1901 | 
                CURRENT_PROJECT_VERSION = 1;  | 
            
| 1932 | 1902 | 
                DEFINES_MODULE = YES;  | 
            
| 1933 | 
                - DEVELOPMENT_TEAM = Q38447SL4M;  | 
            |
| 1903 | 
                + DEVELOPMENT_TEAM = RSJ4N8U2LM;  | 
            |
| 1934 | 1904 | 
                DYLIB_COMPATIBILITY_VERSION = 1;  | 
            
| 1935 | 1905 | 
                DYLIB_CURRENT_VERSION = 1;  | 
            
| 1936 | 1906 | 
                DYLIB_INSTALL_NAME_BASE = "@rpath";  | 
            
                @@ -1950,7 +1920,7 @@  | 
            ||
| 1950 | 1920 | 
                SKIP_INSTALL = YES;  | 
            
| 1951 | 1921 | 
                SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;  | 
            
| 1952 | 1922 | 
                SWIFT_VERSION = 5.0;  | 
            
| 1953 | 
                - TARGETED_DEVICE_FAMILY = "1,2";  | 
            |
| 1923 | 
                + TARGETED_DEVICE_FAMILY = 1;  | 
            |
| 1954 | 1924 | 
                VERSIONING_SYSTEM = "apple-generic";  | 
            
| 1955 | 1925 | 
                VERSION_INFO_PREFIX = "";  | 
            
| 1956 | 1926 | 
                };  | 
            
                @@ -1970,7 +1940,7 @@  | 
            ||
| 1970 | 1940 | 
                CURRENT_PROJECT_VERSION = 1;  | 
            
| 1971 | 1941 | 
                DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";  | 
            
| 1972 | 1942 | 
                DEFINES_MODULE = YES;  | 
            
| 1973 | 
                - DEVELOPMENT_TEAM = Q38447SL4M;  | 
            |
| 1943 | 
                + DEVELOPMENT_TEAM = RSJ4N8U2LM;  | 
            |
| 1974 | 1944 | 
                DYLIB_COMPATIBILITY_VERSION = 1;  | 
            
| 1975 | 1945 | 
                DYLIB_CURRENT_VERSION = 1;  | 
            
| 1976 | 1946 | 
                DYLIB_INSTALL_NAME_BASE = "@rpath";  | 
            
                @@ -1988,7 +1958,7 @@  | 
            ||
| 1988 | 1958 | 
                PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";  | 
            
| 1989 | 1959 | 
                SKIP_INSTALL = YES;  | 
            
| 1990 | 1960 | 
                SWIFT_VERSION = 5.0;  | 
            
| 1991 | 
                - TARGETED_DEVICE_FAMILY = "1,2";  | 
            |
| 1961 | 
                + TARGETED_DEVICE_FAMILY = 1;  | 
            |
| 1992 | 1962 | 
                VERSIONING_SYSTEM = "apple-generic";  | 
            
| 1993 | 1963 | 
                VERSION_INFO_PREFIX = "";  | 
            
| 1994 | 1964 | 
                };  | 
            
                @@ -2311,7 +2281,7 @@  | 
            ||
| 2311 | 2281 | 
                "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";  | 
            
| 2312 | 2282 | 
                CODE_SIGN_STYLE = Automatic;  | 
            
| 2313 | 2283 | 
                DEFINES_MODULE = YES;  | 
            
| 2314 | 
                - DEVELOPMENT_TEAM = Q38447SL4M;  | 
            |
| 2284 | 
                + DEVELOPMENT_TEAM = RSJ4N8U2LM;  | 
            |
| 2315 | 2285 | 
                ENABLE_BITCODE = NO;  | 
            
| 2316 | 2286 | 
                FRAMEWORK_SEARCH_PATHS = (  | 
            
| 2317 | 2287 | 
                "$(inherited)",  | 
            
                @@ -2337,7 +2307,7 @@  | 
            ||
| 2337 | 2307 | 
                );  | 
            
| 2338 | 2308 | 
                MACH_O_TYPE = mh_execute;  | 
            
| 2339 | 2309 | 
                ONLY_ACTIVE_ARCH = YES;  | 
            
| 2340 | 
                - OTHER_LDFLAGS = "";  | 
            |
| 2310 | 
                + OTHER_LDFLAGS = "-all_load";  | 
            |
| 2341 | 2311 | 
                OTHER_SWIFT_FLAGS = "-DDEBUG";  | 
            
| 2342 | 2312 | 
                PRODUCT_BUNDLE_IDENTIFIER = com.PaiAi.PaiAi;  | 
            
| 2343 | 2313 | 
                PRODUCT_NAME = "$(TARGET_NAME)";  | 
            
                @@ -2363,7 +2333,7 @@  | 
            ||
| 2363 | 2333 | 
                CODE_SIGN_STYLE = Automatic;  | 
            
| 2364 | 2334 | 
                DEBUG_INFORMATION_FORMAT = dwarf;  | 
            
| 2365 | 2335 | 
                DEFINES_MODULE = YES;  | 
            
| 2366 | 
                - DEVELOPMENT_TEAM = Q38447SL4M;  | 
            |
| 2336 | 
                + DEVELOPMENT_TEAM = RSJ4N8U2LM;  | 
            |
| 2367 | 2337 | 
                FRAMEWORK_SEARCH_PATHS = (  | 
            
| 2368 | 2338 | 
                "$(inherited)",  | 
            
| 2369 | 2339 | 
                "$(PROJECT_DIR)/Paiai",  | 
            
                @@ -2387,7 +2357,7 @@  | 
            ||
| 2387 | 2357 | 
                );  | 
            
| 2388 | 2358 | 
                MACH_O_TYPE = mh_execute;  | 
            
| 2389 | 2359 | 
                ONLY_ACTIVE_ARCH = YES;  | 
            
| 2390 | 
                - OTHER_LDFLAGS = "";  | 
            |
| 2360 | 
                + OTHER_LDFLAGS = "-all_load";  | 
            |
| 2391 | 2361 | 
                OTHER_SWIFT_FLAGS = "";  | 
            
| 2392 | 2362 | 
                PRODUCT_BUNDLE_IDENTIFIER = com.PaiAi.PaiAi;  | 
            
| 2393 | 2363 | 
                PRODUCT_NAME = "$(TARGET_NAME)";  | 
            
                @@ -2,4 +2,16 @@  | 
            ||
| 2 | 2 | 
                <Bucket  | 
            
| 3 | 3 | 
                type = "1"  | 
            
| 4 | 4 | 
                version = "2.0">  | 
            
| 5 | 
                + <Breakpoints>  | 
            |
| 6 | 
                + <BreakpointProxy  | 
            |
| 7 | 
                + BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">  | 
            |
| 8 | 
                + <BreakpointContent  | 
            |
| 9 | 
                + shouldBeEnabled = "Yes"  | 
            |
| 10 | 
                + ignoreCount = "0"  | 
            |
| 11 | 
                + continueAfterRunningActions = "No"  | 
            |
| 12 | 
                + scope = "0"  | 
            |
| 13 | 
                + stopOnStyle = "0">  | 
            |
| 14 | 
                + </BreakpointContent>  | 
            |
| 15 | 
                + </BreakpointProxy>  | 
            |
| 16 | 
                + </Breakpoints>  | 
            |
| 5 | 17 | 
                </Bucket>  | 
            
                @@ -7,9 +7,10 @@  | 
            ||
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import UIKit  | 
            
| 10 | 
                -import Paiai_iOS  | 
            |
| 11 | 10 | 
                import PaiaiUIKit  | 
            
| 12 | 11 | 
                import PaiaiDataKit  | 
            
| 12 | 
                +import Paiai_iOS  | 
            |
| 13 | 
                +  | 
            |
| 13 | 14 | 
                 | 
            
| 14 | 15 | 
                let WXAppid = "wx4e22a0c8ae6d766d"  | 
            
| 15 | 16 | 
                let WXSecret = "636ac848016c593575d11143c55c8333"  | 
            
                @@ -32,19 +33,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
               | 
            ||
| 32 | 33 | 
                         -> Bool {
               | 
            
| 33 | 34 | 
                registerAppConfiguration()  | 
            
| 34 | 35 | 
                let rootViewController = ContainerViewController()  | 
            
| 35 | 
                - let nav = UINavigationController(rootViewController: rootViewController)  | 
            |
| 36 | 
                + let nav = NavigationController(rootViewController: rootViewController)  | 
            |
| 36 | 37 | 
                 | 
            
| 37 | 
                - rootViewController.setupNavigationBarPushAndPopDelegate()  | 
            |
| 38 | 38 | 
                window = UIWindow(frame: UIScreen.main.bounds)  | 
            
| 39 | 39 | 
                window?.rootViewController = nav  | 
            
| 40 | 40 | 
                window?.makeKeyAndVisible()  | 
            
| 41 | 41 | 
                 | 
            
| 42 | 42 | 
                coordinator = AppCoordinator(rootViewController, navigationController: nav)  | 
            
| 43 | 43 | 
                 | 
            
| 44 | 
                - nav.navigationBar.tintColor = UIColor.white  | 
            |
| 45 | 
                - nav.navigationBar.isTranslucent = false  | 
            |
| 44 | 
                + nav.navigationBar.tintColor = UIColor.white  | 
            |
| 46 | 45 | 
                nav.navigationBar.setBackgroundImage(UIImage.Navigation.background, for: .default)  | 
            
| 47 | 46 | 
                nav.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white.cgColor]  | 
            
| 47 | 
                + nav.navigationBar.shadowImage = UIImage()  | 
            |
| 48 | 48 | 
                return true  | 
            
| 49 | 49 | 
                }  | 
            
| 50 | 50 | 
                 | 
            
                @@ -14,9 +14,9 @@ struct NetWorkCache {
               | 
            ||
| 14 | 14 | 
                     init() { }
               | 
            
| 15 | 15 | 
                 | 
            
| 16 | 16 | 
                     func saveCache(_ task: URLSessionTask, params: [String: AnyObject], data: Data) {
               | 
            
| 17 | 
                -        guard let request = task.originalRequest, let url = request.url?.absoluteString else {
               | 
            |
| 18 | 
                - return  | 
            |
| 19 | 
                - }  | 
            |
| 17 | 
                +//        guard let request = task.originalRequest, let url = request.url?.absoluteString else {
               | 
            |
| 18 | 
                +// return  | 
            |
| 19 | 
                +// }  | 
            |
| 20 | 20 | 
                // let cacheRequest = Alamofire.request(url, method: .get, parameters: params)  | 
            
| 21 | 21 | 
                // cacheRequest.cancel()  | 
            
| 22 | 22 | 
                // let cacheRespone = CachedURLResponse(response: task.response!, data: data)  | 
            
                @@ -24,9 +24,9 @@ struct NetWorkCache {
               | 
            ||
| 24 | 24 | 
                }  | 
            
| 25 | 25 | 
                 | 
            
| 26 | 26 | 
                     func getCache(_ task: URLSessionTask, params: [String: AnyObject]) -> [String: AnyObject]? {
               | 
            
| 27 | 
                -        guard let request = task.originalRequest, let url = request.url?.absoluteString else {
               | 
            |
| 28 | 
                - return nil  | 
            |
| 29 | 
                - }  | 
            |
| 27 | 
                +//        guard let request = task.originalRequest, let url = request.url?.absoluteString else {
               | 
            |
| 28 | 
                +// return nil  | 
            |
| 29 | 
                +// }  | 
            |
| 30 | 30 | 
                // let cacheRequest = Alamofire.request(url, method: .get, parameters: params).request  | 
            
| 31 | 31 | 
                // let cache = URLCache.shared.cachedResponse(for: cacheRequest!)  | 
            
| 32 | 32 | 
                 //        guard let data = cache?.data else {
               | 
            
                @@ -17,12 +17,12 @@ struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
               | 
            ||
| 17 | 17 | 
                     init() {}
               | 
            
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                     func login() -> Single<UserInfo> {
               | 
            
| 20 | 
                -// #if (arch(i386) || arch(x86_64))  | 
            |
| 20 | 
                + #if (arch(i386) || arch(x86_64))  | 
            |
| 21 | 21 | 
                         return Single.create(subscribe: { (observer) in
               | 
            
| 22 | 22 | 
                observer(.success(UserInfo(json: ["user_id": "fiDz2Ms" as AnyObject, "userName": "郑剑飞" as AnyObject, "photoPath": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJibSYLgvXpMakvD9FaCqfiaWqcMiaiaz905YxWPuO4hy8F2lGheV7kVr9vKKXFgmL1S5s4QJgxwuwtVw/132" as AnyObject])))  | 
            
| 23 | 23 | 
                return Disposables.create()  | 
            
| 24 | 24 | 
                })  | 
            
| 25 | 
                -// #else  | 
            |
| 25 | 
                + #else  | 
            |
| 26 | 26 | 
                loginWithWeChat()  | 
            
| 27 | 27 | 
                         return addWXLoginDidFinish().flatMap({
               | 
            
| 28 | 28 | 
                return self.getWXToken(param: $0)  | 
            
                @@ -33,7 +33,7 @@ struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
               | 
            ||
| 33 | 33 | 
                         }).do(onSuccess: { res in
               | 
            
| 34 | 34 | 
                print(res)  | 
            
| 35 | 35 | 
                })  | 
            
| 36 | 
                -// #endif  | 
            |
| 36 | 
                + #endif  | 
            |
| 37 | 37 | 
                }  | 
            
| 38 | 38 | 
                 | 
            
| 39 | 39 | 
                     fileprivate func loginWithWeChat() {
               | 
            
                @@ -1,24 +0,0 @@  | 
            ||
| 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 | 
                -}  | 
            
                @@ -1,5 +1,5 @@  | 
            ||
| 1 | 1 | 
                //  | 
            
| 2 | 
                -// NavigationBackDelegate.swift  | 
            |
| 2 | 
                +// NavigationBackItemDelegate.swift  | 
            |
| 3 | 3 | 
                // PaiaiUIKit  | 
            
| 4 | 4 | 
                //  | 
            
| 5 | 5 | 
                // Created by ffib on 2019/1/11.  | 
            
                @@ -8,14 +8,13 @@  | 
            ||
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import Foundation  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 
                -public protocol NavigationBackDelegate: class {
               | 
            |
| 11 | 
                +public protocol NavigationBackViewController e: class {
               | 
            |
| 12 | 12 | 
                func setupNavigationBackItem()  | 
            
| 13 | 13 | 
                }  | 
            
| 14 | 14 | 
                 | 
            
| 15 | 
                -public extension NavigationBackDelegate where Self: UIViewController {
               | 
            |
| 15 | 
                +public extension NavigationBackViewController where Self: UIViewController {
               | 
            |
| 16 | 16 | 
                     func setupNavigationBackItem() {
               | 
            
| 17 | 17 | 
                let btn = UIButton(type: .system)  | 
            
| 18 | 
                -  | 
            |
| 19 | 18 | 
                btn.contentHorizontalAlignment = .left  | 
            
| 20 | 19 | 
                btn.frame = CGRect(x: 0, y: 0, width: 40 , height: 40)  | 
            
| 21 | 20 | 
                btn.setImage(UIImage(named: "navigation-back"), for: .normal)  | 
            
                @@ -1,12 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// NavigationBackViewController.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 typealias NavigationBackViewController = NavigationBackDelegate & GestureRecognizerDelegate  | 
            |
| 12 | 
                -  | 
            
                @@ -0,0 +1,16 @@  | 
            ||
| 1 | 
                +//  | 
            |
| 2 | 
                +// UINavigationController + NavigationBack.swift  | 
            |
| 3 | 
                +// PaiaiUIKit  | 
            |
| 4 | 
                +//  | 
            |
| 5 | 
                +// Created by ffib on 2019/4/26.  | 
            |
| 6 | 
                +// Copyright © 2019 FFIB. All rights reserved.  | 
            |
| 7 | 
                +//  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +import Foundation  | 
            |
| 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 | 
                + }  | 
            |
| 16 | 
                +}  | 
            
                @@ -1,18 +0,0 @@  | 
            ||
| 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 | 
                - (vc as? NavigationBarPushAndPopDelegate)?.setupNavigationBarPushAndPopDelegate()  | 
            |
| 15 | 
                - pushViewController(vc, animated: animted)  | 
            |
| 16 | 
                - (vc as? NavigationBarInteractivePopDeletegate)?.setupNavigationBarInteractivePopDelegate()  | 
            |
| 17 | 
                - }  | 
            |
| 18 | 
                -}  | 
            
                @@ -1,77 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// NavigationBarInOutAnimator.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 protocol NavigationBarInOutAnimator: class {
               | 
            |
| 12 | 
                -    var navigationView: UIView { get }
               | 
            |
| 13 | 
                - func navigationBarFadeIn(percentage: CGFloat)  | 
            |
| 14 | 
                - func navigationBarFadeOut(percentage: CGFloat)  | 
            |
| 15 | 
                - func navigationBarFadeAndMoveIn(percentage: CGFloat)  | 
            |
| 16 | 
                - func navigationBarFadeAndMoveOut(percentage: CGFloat)  | 
            |
| 17 | 
                - func navigationBarFadeOutWithPercentage(_ percentage: CGFloat)  | 
            |
| 18 | 
                - func navigationBarFadeInWithPercentage(_ percentage: CGFloat)  | 
            |
| 19 | 
                -}  | 
            |
| 20 | 
                -  | 
            |
| 21 | 
                -public extension NavigationBarInOutAnimator where Self: UIViewController & NavigationBarPushAndPopDelegate {
               | 
            |
| 22 | 
                -    func navigationBarFadeIn(percentage: CGFloat) {
               | 
            |
| 23 | 
                - UIView.animate(withDuration: TimeInterval(0.3 * percentage),  | 
            |
| 24 | 
                -                       animations: {
               | 
            |
| 25 | 
                - self.navigationView.alpha = 1  | 
            |
| 26 | 
                - }, completion: nil)  | 
            |
| 27 | 
                - }  | 
            |
| 28 | 
                -  | 
            |
| 29 | 
                -    func navigationBarFadeOut(percentage: CGFloat) {
               | 
            |
| 30 | 
                - UIView.animate(withDuration: TimeInterval(0.3 * percentage),  | 
            |
| 31 | 
                -                       animations: {
               | 
            |
| 32 | 
                - self.navigationView.alpha = 0  | 
            |
| 33 | 
                - }, completion: nil)  | 
            |
| 34 | 
                - }  | 
            |
| 35 | 
                -  | 
            |
| 36 | 
                -    func navigationBarFadeAndMoveIn(percentage: CGFloat) {
               | 
            |
| 37 | 
                -// setNavigationBar()  | 
            |
| 38 | 
                -// navigationController?.navigationBar.layoutIfNeeded()  | 
            |
| 39 | 
                -  | 
            |
| 40 | 
                -// let originX = navigationView.center.x  | 
            |
| 41 | 
                -// navigationView.center.x = UIScreen.main.bounds.width  | 
            |
| 42 | 
                -  | 
            |
| 43 | 
                - UIView.animate(withDuration: TimeInterval(0.3 * percentage),  | 
            |
| 44 | 
                -                       animations: {
               | 
            |
| 45 | 
                - self.navigationView.alpha = 1  | 
            |
| 46 | 
                - self.navigationView.center.x = UIScreen.main.bounds.width / 2  | 
            |
| 47 | 
                -        }, completion: { flag in
               | 
            |
| 48 | 
                -//            if flag {
               | 
            |
| 49 | 
                - self.setNavigationBar()  | 
            |
| 50 | 
                -// }  | 
            |
| 51 | 
                -            print("move in \(flag)")
               | 
            |
| 52 | 
                - })  | 
            |
| 53 | 
                - }  | 
            |
| 54 | 
                -  | 
            |
| 55 | 
                -    func navigationBarFadeAndMoveOut(percentage: CGFloat) {
               | 
            |
| 56 | 
                - print(self.navigationView.center)  | 
            |
| 57 | 
                - UIView.animate(withDuration: TimeInterval(0.3 * percentage),  | 
            |
| 58 | 
                -                       animations: {
               | 
            |
| 59 | 
                - self.navigationView.alpha = 0  | 
            |
| 60 | 
                - self.navigationView.center.x = UIScreen.main.bounds.width  | 
            |
| 61 | 
                -        }, completion: { flag in
               | 
            |
| 62 | 
                -//            if flag {
               | 
            |
| 63 | 
                - self.navigationView.removeFromSuperview()  | 
            |
| 64 | 
                -// }  | 
            |
| 65 | 
                -            print("move out \(flag)")
               | 
            |
| 66 | 
                - })  | 
            |
| 67 | 
                - }  | 
            |
| 68 | 
                -  | 
            |
| 69 | 
                -    func navigationBarFadeOutWithPercentage(_ percentage: CGFloat) {
               | 
            |
| 70 | 
                - navigationView.alpha = 1 * (1 - 1.1 * percentage)  | 
            |
| 71 | 
                - navigationView.center.x = UIScreen.main.bounds.width / 2 * (1 + 1.1 * percentage)  | 
            |
| 72 | 
                - }  | 
            |
| 73 | 
                -  | 
            |
| 74 | 
                -    func navigationBarFadeInWithPercentage(_ percentage: CGFloat) {
               | 
            |
| 75 | 
                - navigationView.alpha = 1 * percentage  | 
            |
| 76 | 
                - }  | 
            |
| 77 | 
                -}  | 
            
                @@ -1,63 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// NavigationBarInteractivePopDeletegate.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 protocol NavigationBarInteractivePopDeletegate: class {
               | 
            |
| 12 | 
                - func setupNavigationBarInteractivePopDelegate()  | 
            |
| 13 | 
                -}  | 
            |
| 14 | 
                -  | 
            |
| 15 | 
                -public extension NavigationBarInteractivePopDeletegate where Self: UIViewController & NavigationBarInOutAnimator {
               | 
            |
| 16 | 
                -    func setupNavigationBarInteractivePopDelegate() {
               | 
            |
| 17 | 
                -        guard let nav = navigationController else { return }
               | 
            |
| 18 | 
                - nav.interactivePopGestureRecognizer?.addTarget(self, action: #selector(interactivePopAnimation(gesture:)))  | 
            |
| 19 | 
                - }  | 
            |
| 20 | 
                -}  | 
            |
| 21 | 
                -  | 
            |
| 22 | 
                -extension UIViewController {
               | 
            |
| 23 | 
                -    @objc func interactivePopAnimation(gesture: UIPanGestureRecognizer) {
               | 
            |
| 24 | 
                -        guard let `self` =  self as? (NavigationBarInOutAnimator & UIViewController) else { return }
               | 
            |
| 25 | 
                - let point = gesture.translation(in: view)  | 
            |
| 26 | 
                - let percentage = calculatePercentageOfOffsets(point: point)  | 
            |
| 27 | 
                -  | 
            |
| 28 | 
                - /// naivgationController == nil popped viewController  | 
            |
| 29 | 
                - /// navigationController?.visibleViewController == self pop to viewController  | 
            |
| 30 | 
                -  | 
            |
| 31 | 
                - let percentageAnimation: ((CGFloat) -> Void)  | 
            |
| 32 | 
                - let fadeInAnimation: ((CGFloat) -> Void)  | 
            |
| 33 | 
                - let fadeOutAnimation: ((CGFloat) -> Void)  | 
            |
| 34 | 
                -  | 
            |
| 35 | 
                -        if navigationController == nil {
               | 
            |
| 36 | 
                - percentageAnimation = self.navigationBarFadeOutWithPercentage  | 
            |
| 37 | 
                - fadeInAnimation = self.navigationBarFadeAndMoveIn  | 
            |
| 38 | 
                - fadeOutAnimation = self.navigationBarFadeAndMoveOut  | 
            |
| 39 | 
                -        } else if navigationController?.visibleViewController == self {
               | 
            |
| 40 | 
                - percentageAnimation = self.navigationBarFadeInWithPercentage  | 
            |
| 41 | 
                - fadeInAnimation = self.navigationBarFadeIn  | 
            |
| 42 | 
                - fadeOutAnimation = self.navigationBarFadeOut  | 
            |
| 43 | 
                -        } else {
               | 
            |
| 44 | 
                - return  | 
            |
| 45 | 
                - }  | 
            |
| 46 | 
                -  | 
            |
| 47 | 
                - percentageAnimation(percentage)  | 
            |
| 48 | 
                -  | 
            |
| 49 | 
                -        guard gesture.state == .ended else { return }
               | 
            |
| 50 | 
                -  | 
            |
| 51 | 
                - if (percentage > 0.5 && navigationController == nil) ||  | 
            |
| 52 | 
                -            (percentage < 0.5 && navigationController?.visibleViewController == self) {
               | 
            |
| 53 | 
                - fadeOutAnimation(1 - percentage)  | 
            |
| 54 | 
                - } else if (percentage < 0.5 && navigationController == nil) ||  | 
            |
| 55 | 
                -            (percentage > 0.5 && navigationController?.visibleViewController == self) {
               | 
            |
| 56 | 
                - fadeInAnimation(percentage)  | 
            |
| 57 | 
                - }  | 
            |
| 58 | 
                - }  | 
            |
| 59 | 
                -  | 
            |
| 60 | 
                -    private func calculatePercentageOfOffsets(point: CGPoint) -> CGFloat {
               | 
            |
| 61 | 
                - return point.x / view.bounds.width  | 
            |
| 62 | 
                - }  | 
            |
| 63 | 
                -}  | 
            
                @@ -1,12 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// NavigationBarInteractiveViewController.swift  | 
            |
| 3 | 
                -// PaiaiUIKit  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by ffib on 2019/1/16.  | 
            |
| 6 | 
                -// Copyright © 2019 yb. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import Foundation  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -public typealias NavigationBarInteractiveViewController = NavigationBarInteractivePopDeletegate & NavigationBarPushAndPopDelegate & NavigationBarInOutAnimator & NavigationControllerDelegate  | 
            |
| 12 | 
                -  | 
            
                @@ -1,49 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// NavigationBarPushAndPopDelegate.swift  | 
            |
| 3 | 
                -// PaiaiUIKit  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by ffib on 2019/1/16.  | 
            |
| 6 | 
                -// Copyright © 2019 yb. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import Foundation  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -public protocol NavigationBarPushAndPopDelegate: class {
               | 
            |
| 12 | 
                - func setupNavigationBarPushAndPopDelegate()  | 
            |
| 13 | 
                - func setNavigationBar()  | 
            |
| 14 | 
                -}  | 
            |
| 15 | 
                -  | 
            |
| 16 | 
                -public extension NavigationBarPushAndPopDelegate where Self: UIViewController & NavigationControllerDelegate {
               | 
            |
| 17 | 
                -    func setupNavigationBarPushAndPopDelegate() {
               | 
            |
| 18 | 
                - navigationController?.setDelegate(self)  | 
            |
| 19 | 
                - }  | 
            |
| 20 | 
                -  | 
            |
| 21 | 
                -    func setNavigationBar() {}
               | 
            |
| 22 | 
                -}  | 
            |
| 23 | 
                -  | 
            |
| 24 | 
                -public extension NavigationControllerDelegate where Self: UIViewController {
               | 
            |
| 25 | 
                -  | 
            |
| 26 | 
                - func navigationController(_ navigationController: UINavigationController,  | 
            |
| 27 | 
                - animationControllerFor operation: UINavigationController.Operation,  | 
            |
| 28 | 
                - from fromVC: UIViewController,  | 
            |
| 29 | 
                -                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
               | 
            |
| 30 | 
                -  | 
            |
| 31 | 
                -        if operation == .push {
               | 
            |
| 32 | 
                - (toVC as? NavigationBarInOutAnimator)?.navigationBarFadeAndMoveIn(percentage: 1)  | 
            |
| 33 | 
                - (fromVC as? NavigationBarInOutAnimator)?.navigationBarFadeOut(percentage: 1)  | 
            |
| 34 | 
                -        } else {
               | 
            |
| 35 | 
                - (toVC as? NavigationBarInOutAnimator)?.navigationBarFadeIn(percentage: 1)  | 
            |
| 36 | 
                - (fromVC as? NavigationBarInOutAnimator)?.navigationBarFadeAndMoveOut(percentage: 1)  | 
            |
| 37 | 
                - }  | 
            |
| 38 | 
                -  | 
            |
| 39 | 
                - return nil  | 
            |
| 40 | 
                - }  | 
            |
| 41 | 
                -  | 
            |
| 42 | 
                - func navigationController(_ navigationController: UINavigationController,  | 
            |
| 43 | 
                -                              didShow viewController: UIViewController, animated: Bool) {
               | 
            |
| 44 | 
                -        guard let recognizer = navigationController.interactivePopGestureRecognizer else { return }
               | 
            |
| 45 | 
                - recognizer.isEnabled = true  | 
            |
| 46 | 
                -        guard let vc = viewController as? GestureRecognizerDelegate else { return }
               | 
            |
| 47 | 
                - recognizer.setDelegate(vc)  | 
            |
| 48 | 
                - }  | 
            |
| 49 | 
                -}  | 
            
                @@ -0,0 +1,233 @@  | 
            ||
| 1 | 
                +//  | 
            |
| 2 | 
                +// NavigationBar.swift  | 
            |
| 3 | 
                +// PaiaiUIKit  | 
            |
| 4 | 
                +//  | 
            |
| 5 | 
                +// Created by ffib on 2019/4/23.  | 
            |
| 6 | 
                +// Copyright © 2019 FFIB. All rights reserved.  | 
            |
| 7 | 
                +//  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 
                +  | 
            |
| 11 | 
                +class NavigationBar: UINavigationBar {
               | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + private var currBgImage: UIImage?  | 
            |
| 14 | 
                + private var targetBgImage: UIImage?  | 
            |
| 15 | 
                + private var originShadowImage: UIImage?  | 
            |
| 16 | 
                +  | 
            |
| 17 | 
                + private var hasChangedBgImage: Bool = false  | 
            |
| 18 | 
                + private var hasChangedShadow: Bool = false  | 
            |
| 19 | 
                + private var titleView: UIView?  | 
            |
| 20 | 
                +  | 
            |
| 21 | 
                +    var needsInteractive: Bool {
               | 
            |
| 22 | 
                + return hasChangedBgImage || hasChangedShadow  | 
            |
| 23 | 
                + }  | 
            |
| 24 | 
                + var bounce: Bounce = .none  | 
            |
| 25 | 
                + var isPush: Bool = true  | 
            |
| 26 | 
                +  | 
            |
| 27 | 
                +    override var shadowImage: UIImage? {
               | 
            |
| 28 | 
                +        didSet {
               | 
            |
| 29 | 
                + originShadowImage = oldValue  | 
            |
| 30 | 
                + hasChangedShadow = true  | 
            |
| 31 | 
                + }  | 
            |
| 32 | 
                + }  | 
            |
| 33 | 
                +  | 
            |
| 34 | 
                +    lazy var fakeView: UIVisualEffectView = {
               | 
            |
| 35 | 
                + let v = UIVisualEffectView(effect: UIBlurEffect(style: .light))  | 
            |
| 36 | 
                + v.frame = getNavigationBarBounds()  | 
            |
| 37 | 
                + v.isUserInteractionEnabled = false  | 
            |
| 38 | 
                + v.autoresizingMask = [.flexibleWidth, .flexibleHeight]  | 
            |
| 39 | 
                +  | 
            |
| 40 | 
                + return v  | 
            |
| 41 | 
                + }()  | 
            |
| 42 | 
                +  | 
            |
| 43 | 
                +    lazy var backgroundImageView: UIImageView = {
               | 
            |
| 44 | 
                + let v = UIImageView()  | 
            |
| 45 | 
                + v.isUserInteractionEnabled = false  | 
            |
| 46 | 
                + v.frame = getNavigationBarBounds().offsetBy(dx: bounds.width, dy: 0)  | 
            |
| 47 | 
                +  | 
            |
| 48 | 
                + return v  | 
            |
| 49 | 
                + }()  | 
            |
| 50 | 
                +  | 
            |
| 51 | 
                +    lazy var shadowImageView: UIImageView = {
               | 
            |
| 52 | 
                + let v = UIImageView()  | 
            |
| 53 | 
                + v.frame = CGRect(x: 0, y: bounds.height, width: bounds.width, height: 0.5)  | 
            |
| 54 | 
                +  | 
            |
| 55 | 
                + return v  | 
            |
| 56 | 
                + }()  | 
            |
| 57 | 
                +  | 
            |
| 58 | 
                +    override init(frame: CGRect) {
               | 
            |
| 59 | 
                + super.init(frame: frame)  | 
            |
| 60 | 
                + }  | 
            |
| 61 | 
                +  | 
            |
| 62 | 
                +    required init?(coder aDecoder: NSCoder) {
               | 
            |
| 63 | 
                +        fatalError("init(coder:) has not been implemented")
               | 
            |
| 64 | 
                + }  | 
            |
| 65 | 
                +    override func setBackgroundImage(_ backgroundImage: UIImage?, for barMetrics: UIBarMetrics) {
               | 
            |
| 66 | 
                + currBgImage = self.backgroundImage(for: .default)  | 
            |
| 67 | 
                + targetBgImage = backgroundImage  | 
            |
| 68 | 
                + hasChangedBgImage = true  | 
            |
| 69 | 
                + }  | 
            |
| 70 | 
                +  | 
            |
| 71 | 
                +    override func setBackgroundImage(_ backgroundImage: UIImage?, for barPosition: UIBarPosition, barMetrics: UIBarMetrics) {
               | 
            |
| 72 | 
                + currBgImage = self.backgroundImage(for: .default)  | 
            |
| 73 | 
                + targetBgImage = backgroundImage  | 
            |
| 74 | 
                + hasChangedBgImage = true  | 
            |
| 75 | 
                + }  | 
            |
| 76 | 
                +  | 
            |
| 77 | 
                +    func setBackgroundImage() {
               | 
            |
| 78 | 
                + super.setBackgroundImage(targetBgImage, for: .any, barMetrics: .default)  | 
            |
| 79 | 
                + }  | 
            |
| 80 | 
                +  | 
            |
| 81 | 
                +    func getBarBackground() -> UIView? {
               | 
            |
| 82 | 
                + return value(forKeyPath: "_backgroundView") as? UIView  | 
            |
| 83 | 
                + }  | 
            |
| 84 | 
                +  | 
            |
| 85 | 
                +    func getContentView() -> UIView? {
               | 
            |
| 86 | 
                +        for v in subviews {
               | 
            |
| 87 | 
                +            if let ContentClass = NSClassFromString("_UINavigationBarContentView"), v.isKind(of: ContentClass) {
               | 
            |
| 88 | 
                + return v  | 
            |
| 89 | 
                + }  | 
            |
| 90 | 
                + }  | 
            |
| 91 | 
                + return nil  | 
            |
| 92 | 
                + }  | 
            |
| 93 | 
                +  | 
            |
| 94 | 
                +    func getShadowView() -> UIView? {
               | 
            |
| 95 | 
                +        guard let barBackground = getBarBackground() else { return nil }
               | 
            |
| 96 | 
                +        for v in barBackground.subviews {
               | 
            |
| 97 | 
                +            if (v.bounds.height == 0.5) {
               | 
            |
| 98 | 
                + return v  | 
            |
| 99 | 
                + }  | 
            |
| 100 | 
                + }  | 
            |
| 101 | 
                + return nil  | 
            |
| 102 | 
                + }  | 
            |
| 103 | 
                +  | 
            |
| 104 | 
                +    func getNavigationBarBounds() -> CGRect {
               | 
            |
| 105 | 
                + let statusHeight = UIApplication.shared.statusBarFrame.height  | 
            |
| 106 | 
                + return CGRect(x: 0, y: -statusHeight, width: bounds.width, height: bounds.height + statusHeight)  | 
            |
| 107 | 
                + }  | 
            |
| 108 | 
                +  | 
            |
| 109 | 
                +    override func value(forUndefinedKey key: String) -> Any? {
               | 
            |
| 110 | 
                + return nil  | 
            |
| 111 | 
                + }  | 
            |
| 112 | 
                +}  | 
            |
| 113 | 
                +  | 
            |
| 114 | 
                +/// NavigationBar transition  | 
            |
| 115 | 
                +extension NavigationBar {
               | 
            |
| 116 | 
                +    func constructViewHierarchy() {
               | 
            |
| 117 | 
                + setupShadowView()  | 
            |
| 118 | 
                + setupBackgroundImageView()  | 
            |
| 119 | 
                +  | 
            |
| 120 | 
                +        guard let barBackground = getBarBackground() else { return }
               | 
            |
| 121 | 
                +  | 
            |
| 122 | 
                + insertSubview(shadowImageView, aboveSubview: barBackground)  | 
            |
| 123 | 
                + insertSubview(backgroundImageView, aboveSubview: barBackground)  | 
            |
| 124 | 
                + insertSubview(fakeView, belowSubview: backgroundImageView)  | 
            |
| 125 | 
                + layoutIfNeeded()  | 
            |
| 126 | 
                + }  | 
            |
| 127 | 
                +  | 
            |
| 128 | 
                +    private func setupShadowView() {
               | 
            |
| 129 | 
                +        if let image = originShadowImage, image.size == CGSize.zero {
               | 
            |
| 130 | 
                + shadowImageView.image = image  | 
            |
| 131 | 
                +        } else {
               | 
            |
| 132 | 
                + shadowImageView.backgroundColor = UIColor(red: 0, green: 0, blue: 0,  | 
            |
| 133 | 
                + alpha: 77.0 / 255)  | 
            |
| 134 | 
                + }  | 
            |
| 135 | 
                +  | 
            |
| 136 | 
                + shadowImageView.alpha = originShadowImage == nil ? 1 : 0  | 
            |
| 137 | 
                + getShadowView()?.isHidden = true  | 
            |
| 138 | 
                + }  | 
            |
| 139 | 
                +  | 
            |
| 140 | 
                +    private func setupBackgroundImageView() {
               | 
            |
| 141 | 
                +        if isPush {
               | 
            |
| 142 | 
                + fakeView.alpha = 0  | 
            |
| 143 | 
                + backgroundImageView.image = targetBgImage  | 
            |
| 144 | 
                +        } else {
               | 
            |
| 145 | 
                + setBackgroundImage()  | 
            |
| 146 | 
                + fakeView.alpha = 1  | 
            |
| 147 | 
                + backgroundImageView.image = currBgImage  | 
            |
| 148 | 
                + }  | 
            |
| 149 | 
                + }  | 
            |
| 150 | 
                +  | 
            |
| 151 | 
                + /// interactivePopGestureRecognizer  | 
            |
| 152 | 
                +    func transitionAnimationWithPercent(_ percent: CGFloat) {
               | 
            |
| 153 | 
                +        switch bounce {
               | 
            |
| 154 | 
                + case .forward, .none:  | 
            |
| 155 | 
                + transitionShadowAnimationWithPercent(percent)  | 
            |
| 156 | 
                + transitionBackgroundAnimationWithPercent(percent)  | 
            |
| 157 | 
                + break  | 
            |
| 158 | 
                + case .backward:  | 
            |
| 159 | 
                + transitionShadowAnimationWithPercent(1 - percent)  | 
            |
| 160 | 
                + transitionBackgroundAnimationWithPercent(1 - percent)  | 
            |
| 161 | 
                + break  | 
            |
| 162 | 
                + }  | 
            |
| 163 | 
                + }  | 
            |
| 164 | 
                +  | 
            |
| 165 | 
                +    func transitionAnimation() {
               | 
            |
| 166 | 
                + transitionShadowAnimation()  | 
            |
| 167 | 
                + transitionBackgroundAnimation()  | 
            |
| 168 | 
                + }  | 
            |
| 169 | 
                +  | 
            |
| 170 | 
                +    private func transitionShadowAnimation() {
               | 
            |
| 171 | 
                +        guard hasChangedShadow else { return }
               | 
            |
| 172 | 
                + shadowImageView.alpha = originShadowImage == nil ? 0 : 1  | 
            |
| 173 | 
                +//        if originShadowImage == nil {
               | 
            |
| 174 | 
                +// shadowImageView.alpha = isInteractive ? (1 - percent) * 1 : 0  | 
            |
| 175 | 
                +//        } else {
               | 
            |
| 176 | 
                +// shadowImageView.alpha = isInteractive ? percent * 1 : 1  | 
            |
| 177 | 
                +// }  | 
            |
| 178 | 
                + }  | 
            |
| 179 | 
                +  | 
            |
| 180 | 
                +    private func transitionBackgroundAnimation() {
               | 
            |
| 181 | 
                +        guard hasChangedBgImage else { return }
               | 
            |
| 182 | 
                +        if isPush {
               | 
            |
| 183 | 
                + fakeView.alpha = 1  | 
            |
| 184 | 
                + backgroundImageView.frame.origin.x = 0  | 
            |
| 185 | 
                +        } else {
               | 
            |
| 186 | 
                + fakeView.alpha = 0  | 
            |
| 187 | 
                + backgroundImageView.frame.origin.x = bounds.width  | 
            |
| 188 | 
                + }  | 
            |
| 189 | 
                + }  | 
            |
| 190 | 
                +  | 
            |
| 191 | 
                +    private func transitionShadowAnimationWithPercent(_ percent: CGFloat) {
               | 
            |
| 192 | 
                +        guard hasChangedShadow else { return }
               | 
            |
| 193 | 
                + shadowImageView.alpha = originShadowImage == nil ? (1 - percent) * 1 : percent * 1  | 
            |
| 194 | 
                + }  | 
            |
| 195 | 
                +  | 
            |
| 196 | 
                +    private func transitionBackgroundAnimationWithPercent(_ percent: CGFloat) {
               | 
            |
| 197 | 
                +        guard hasChangedBgImage else { return }
               | 
            |
| 198 | 
                + fakeView.alpha = (1 - percent) * 1  | 
            |
| 199 | 
                + backgroundImageView.frame.origin.x = percent * bounds.width  | 
            |
| 200 | 
                + }  | 
            |
| 201 | 
                +  | 
            |
| 202 | 
                +    func clear() {
               | 
            |
| 203 | 
                +  | 
            |
| 204 | 
                +        if isPush && hasChangedBgImage { setBackgroundImage() }
               | 
            |
| 205 | 
                +  | 
            |
| 206 | 
                +        if !isPush && bounce == .backward && hasChangedBgImage {
               | 
            |
| 207 | 
                + targetBgImage = currBgImage  | 
            |
| 208 | 
                + setBackgroundImage()  | 
            |
| 209 | 
                + }  | 
            |
| 210 | 
                +  | 
            |
| 211 | 
                + getShadowView()?.isHidden = false  | 
            |
| 212 | 
                +  | 
            |
| 213 | 
                + fakeView.removeFromSuperview()  | 
            |
| 214 | 
                + shadowImageView.removeFromSuperview()  | 
            |
| 215 | 
                + backgroundImageView.removeFromSuperview()  | 
            |
| 216 | 
                +  | 
            |
| 217 | 
                + currBgImage = nil  | 
            |
| 218 | 
                + targetBgImage = nil  | 
            |
| 219 | 
                +  | 
            |
| 220 | 
                + hasChangedBgImage = false  | 
            |
| 221 | 
                + hasChangedShadow = false  | 
            |
| 222 | 
                +  | 
            |
| 223 | 
                + bounce = .none  | 
            |
| 224 | 
                + }  | 
            |
| 225 | 
                +}  | 
            |
| 226 | 
                +  | 
            |
| 227 | 
                +extension NavigationBar {
               | 
            |
| 228 | 
                +    enum Bounce {
               | 
            |
| 229 | 
                + case none  | 
            |
| 230 | 
                + case backward  | 
            |
| 231 | 
                + case forward  | 
            |
| 232 | 
                + }  | 
            |
| 233 | 
                +}  | 
            
                @@ -2,28 +2,110 @@  | 
            ||
| 2 | 2 | 
                // NavigationController.swift  | 
            
| 3 | 3 | 
                // PaiaiUIKit  | 
            
| 4 | 4 | 
                //  | 
            
| 5 | 
                -// Created by ffib on 2019/4/3.  | 
            |
| 6 | 
                -// Copyright © 2019 yb. All rights reserved.  | 
            |
| 5 | 
                +// Created by ffib on 2019/4/23.  | 
            |
| 6 | 
                +// Copyright © 2019 FFIB. All rights reserved.  | 
            |
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import UIKit  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 
                -class NavigationController: UINavigationController {
               | 
            |
| 11 | 
                +public class NavigationController: UINavigationController {
               | 
            |
| 12 | 12 | 
                 | 
            
| 13 | 
                +    override public init(rootViewController: UIViewController) {
               | 
            |
| 14 | 
                + super.init(navigationBarClass: NavigationBar.classForCoder(), toolbarClass: nil)  | 
            |
| 15 | 
                +// super.init(rootViewController: rootViewController)  | 
            |
| 16 | 
                +// navigationBar.delegate = self  | 
            |
| 17 | 
                + self.viewControllers = [rootViewController]  | 
            |
| 18 | 
                + }  | 
            |
| 19 | 
                +  | 
            |
| 20 | 
                +    required init?(coder aDecoder: NSCoder) {
               | 
            |
| 21 | 
                + super.init(coder: aDecoder)  | 
            |
| 22 | 
                + }  | 
            |
| 23 | 
                +  | 
            |
| 24 | 
                +    override public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
               | 
            |
| 25 | 
                + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)  | 
            |
| 26 | 
                + }  | 
            |
| 27 | 
                +  | 
            |
| 28 | 
                +    override public func viewDidLoad() {
               | 
            |
| 29 | 
                + super.viewDidLoad()  | 
            |
| 30 | 
                + delegate = self  | 
            |
| 31 | 
                + interactivePopGestureRecognizer?.delegate = self  | 
            |
| 32 | 
                + interactivePopGestureRecognizer?.isEnabled = true  | 
            |
| 33 | 
                +  | 
            |
| 34 | 
                +  | 
            |
| 35 | 
                + interactivePopGestureRecognizer?.addTarget(self,  | 
            |
| 36 | 
                + action: #selector(handlePop(gestureRecognizer:)))  | 
            |
| 37 | 
                + }  | 
            |
| 38 | 
                +  | 
            |
| 39 | 
                + @objc  | 
            |
| 40 | 
                +    private func handlePop(gestureRecognizer: UIPanGestureRecognizer) {
               | 
            |
| 41 | 
                +        guard let navBar = navigationBar as? NavigationBar else { return }
               | 
            |
| 42 | 
                +        if gestureRecognizer.state == .began { navBar.isPush = false }
               | 
            |
| 43 | 
                +  | 
            |
| 44 | 
                +        guard navBar.needsInteractive else { return }
               | 
            |
| 45 | 
                +  | 
            |
| 46 | 
                + let percent = gestureRecognizer.translation(in: view).x / view.bounds.width  | 
            |
| 47 | 
                +  | 
            |
| 48 | 
                +        if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
               | 
            |
| 49 | 
                + navBar.transitionAnimationWithPercent(percent)  | 
            |
| 50 | 
                + }  | 
            |
| 51 | 
                +  | 
            |
| 52 | 
                + guard gestureRecognizer.state == .ended  | 
            |
| 53 | 
                + || gestureRecognizer.state == .cancelled  | 
            |
| 54 | 
                + || gestureRecognizer.state == .failed,  | 
            |
| 55 | 
                +            let coordinator = transitionCoordinator else { return }
               | 
            |
| 56 | 
                +  | 
            |
| 57 | 
                + navBar.bounce = percent < 0.5 ? .backward : .forward  | 
            |
| 58 | 
                + let durationPercent = Double(percent < 0.5 ? coordinator.percentComplete : (1 - coordinator.percentComplete))  | 
            |
| 59 | 
                + UIView.animate(withDuration: coordinator.transitionDuration * durationPercent, delay: 0, usingSpringWithDamping: 1,  | 
            |
| 60 | 
                +                       initialSpringVelocity: coordinator.completionVelocity, options: [], animations: {
               | 
            |
| 61 | 
                + navBar.transitionAnimationWithPercent(1)  | 
            |
| 62 | 
                +        }) { _ in
               | 
            |
| 63 | 
                + navBar.clear()  | 
            |
| 64 | 
                + }  | 
            |
| 65 | 
                + }  | 
            |
| 13 | 66 | 
                }  | 
            
| 14 | 67 | 
                 | 
            
| 15 | 
                -//class NavigationController: UINavigationController {
               | 
            |
| 16 | 
                -//  | 
            |
| 17 | 
                -//    override func viewDidLoad() {
               | 
            |
| 18 | 
                -// super.viewDidLoad()  | 
            |
| 19 | 
                -//  | 
            |
| 20 | 
                -// // Do any additional setup after loading the view.  | 
            |
| 21 | 
                -// }  | 
            |
| 22 | 
                -//  | 
            |
| 23 | 
                -// func set  | 
            |
| 24 | 
                -//}  | 
            |
| 25 | 
                -//  | 
            |
| 26 | 
                -//  | 
            |
| 27 | 
                -//extension UIViewController {
               | 
            |
| 28 | 
                -// n  | 
            |
| 29 | 
                -//}  | 
            |
| 68 | 
                +extension NavigationController: UINavigationControllerDelegate {
               | 
            |
| 69 | 
                +  | 
            |
| 70 | 
                +    public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
               | 
            |
| 71 | 
                + (navigationBar as? NavigationBar)?.isPush = operation == .push  | 
            |
| 72 | 
                + return nil  | 
            |
| 73 | 
                + }  | 
            |
| 74 | 
                +  | 
            |
| 75 | 
                +    public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
               | 
            |
| 76 | 
                + guard let navBar = navigationBar as? NavigationBar,  | 
            |
| 77 | 
                +            navBar.needsInteractive else { return }
               | 
            |
| 78 | 
                +  | 
            |
| 79 | 
                + guard let coordinator = transitionCoordinator,  | 
            |
| 80 | 
                +            animated else {
               | 
            |
| 81 | 
                + navBar.setBackgroundImage()  | 
            |
| 82 | 
                + navBar.clear()  | 
            |
| 83 | 
                + return  | 
            |
| 84 | 
                + }  | 
            |
| 85 | 
                +  | 
            |
| 86 | 
                + navBar.constructViewHierarchy()  | 
            |
| 87 | 
                +  | 
            |
| 88 | 
                +        guard !coordinator.isInteractive else { return }
               | 
            |
| 89 | 
                +  | 
            |
| 90 | 
                +        coordinator.animate(alongsideTransition: { (transitionContext) in
               | 
            |
| 91 | 
                +            DispatchQueue.main.async {
               | 
            |
| 92 | 
                + UIView.beginAnimations(nil, context: nil)  | 
            |
| 93 | 
                + UIView.setAnimationCurve(transitionContext.completionCurve)  | 
            |
| 94 | 
                + UIView.setAnimationDuration(transitionContext.transitionDuration)  | 
            |
| 95 | 
                + navBar.transitionAnimation()  | 
            |
| 96 | 
                + UIView.commitAnimations()  | 
            |
| 97 | 
                + }  | 
            |
| 98 | 
                +        }, completion: { (transitionContext) in
               | 
            |
| 99 | 
                + navBar.clear()  | 
            |
| 100 | 
                + })  | 
            |
| 101 | 
                + }  | 
            |
| 102 | 
                +}  | 
            |
| 103 | 
                +  | 
            |
| 104 | 
                +extension NavigationController: UIGestureRecognizerDelegate {
               | 
            |
| 105 | 
                +    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
               | 
            |
| 106 | 
                +        if gestureRecognizer == interactivePopGestureRecognizer {
               | 
            |
| 107 | 
                + return viewControllers.count > 1  | 
            |
| 108 | 
                + }  | 
            |
| 109 | 
                + return true  | 
            |
| 110 | 
                + }  | 
            |
| 111 | 
                +}  | 
            
                @@ -72,7 +72,7 @@ open class PageViewController: UIViewController {
               | 
            ||
| 72 | 72 | 
                constructViewHierarchy()  | 
            
| 73 | 73 | 
                activateConstraints()  | 
            
| 74 | 74 | 
                setMenuGestureRecognizer()  | 
            
| 75 | 
                - setupNavigationBarInteractivePopDelegate()  | 
            |
| 75 | 
                +  | 
            |
| 76 | 76 | 
                }  | 
            
| 77 | 77 | 
                 | 
            
| 78 | 78 | 
                     open override func viewDidLayoutSubviews() {
               | 
            
                @@ -90,8 +90,8 @@ open class PageViewController: UIViewController {
               | 
            ||
| 90 | 90 | 
                }  | 
            
| 91 | 91 | 
                 | 
            
| 92 | 92 | 
                     private func constructViewHierarchy() {
               | 
            
| 93 | 
                + navigationItem.titleView = menuView  | 
            |
| 93 | 94 | 
                view.addSubview(scrollView)  | 
            
| 94 | 
                - navigationController?.navigationBar.addSubview(menuView)  | 
            |
| 95 | 95 | 
                menuView.addSubview(sliderView)  | 
            
| 96 | 96 | 
                }  | 
            
| 97 | 97 | 
                }  | 
            
                @@ -150,15 +150,12 @@ fileprivate extension PageViewController {
               | 
            ||
| 150 | 150 | 
                 | 
            
| 151 | 151 | 
                let left: NSLayoutConstraint  | 
            
| 152 | 152 | 
                             if let lastLabel = last {
               | 
            
| 153 | 
                - left = label.leftAnchor  | 
            |
| 154 | 
                - .constraint(equalTo: lastLabel.rightAnchor, constant: option.spacing)  | 
            |
| 153 | 
                + left = label.leftAnchor.constraint(equalTo: lastLabel.rightAnchor, constant: option.spacing)  | 
            |
| 155 | 154 | 
                             } else {
               | 
            
| 156 | 
                - left = label.leadingAnchor  | 
            |
| 157 | 
                - .constraint(equalTo: menuView.leadingAnchor)  | 
            |
| 155 | 
                + left = label.leadingAnchor.constraint(equalTo: menuView.leadingAnchor)  | 
            |
| 158 | 156 | 
                }  | 
            
| 159 | 157 | 
                 | 
            
| 160 | 
                - let centerY = label.centerYAnchor  | 
            |
| 161 | 
                - .constraint(equalTo: menuView.centerYAnchor)  | 
            |
| 158 | 
                + let centerY = label.centerYAnchor.constraint(equalTo: menuView.centerYAnchor)  | 
            |
| 162 | 159 | 
                 | 
            
| 163 | 160 | 
                             if i == 0 {
               | 
            
| 164 | 161 | 
                label.textColor = option.selectedColor  | 
            
                @@ -178,17 +175,16 @@ fileprivate extension PageViewController {
               | 
            ||
| 178 | 175 | 
                 | 
            
| 179 | 176 | 
                     func setSliderViewDetail() {
               | 
            
| 180 | 177 | 
                         guard let label = menuView.viewWithTag(baseTag) else { return }
               | 
            
| 181 | 
                - sliderConstraint = sliderView.centerXAnchor  | 
            |
| 182 | 
                - .constraint(equalTo: label.centerXAnchor)  | 
            |
| 178 | 
                + sliderConstraint = sliderView.centerXAnchor.constraint(equalTo: label.centerXAnchor)  | 
            |
| 183 | 179 | 
                 | 
            
| 184 | 
                - NSLayoutConstraint.activate([sliderConstraint!])  | 
            |
| 180 | 
                + NSLayoutConstraint.activate([sliderConstraint!,  | 
            |
| 181 | 
                + sliderView.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 6)])  | 
            |
| 185 | 182 | 
                }  | 
            
| 186 | 183 | 
                }  | 
            
| 187 | 184 | 
                 | 
            
| 188 | 185 | 
                /// layout  | 
            
| 189 | 186 | 
                 fileprivate extension PageViewController {
               | 
            
| 190 | 187 | 
                     func activateConstraints() {
               | 
            
| 191 | 
                - activateConstraintsMenuView()  | 
            |
| 192 | 188 | 
                activateConstraintsSliderView()  | 
            
| 193 | 189 | 
                activateConstraintsScrollView()  | 
            
| 194 | 190 | 
                }  | 
            
                @@ -206,18 +202,6 @@ fileprivate extension PageViewController {
               | 
            ||
| 206 | 202 | 
                NSLayoutConstraint.activate([width, height, top, leading, bottom, trailing])  | 
            
| 207 | 203 | 
                }  | 
            
| 208 | 204 | 
                 | 
            
| 209 | 
                -    func activateConstraintsMenuView() {
               | 
            |
| 210 | 
                -        guard let barContentView = navigationController?.navigationBar else {  return }
               | 
            |
| 211 | 
                -  | 
            |
| 212 | 
                - menuView.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 213 | 
                -  | 
            |
| 214 | 
                - NSLayoutConstraint.activate([  | 
            |
| 215 | 
                - menuView.topAnchor.constraint(equalTo: barContentView.topAnchor),  | 
            |
| 216 | 
                - menuView.bottomAnchor.constraint(equalTo: barContentView.bottomAnchor),  | 
            |
| 217 | 
                - menuView.centerXAnchor.constraint(equalTo: barContentView.centerXAnchor)  | 
            |
| 218 | 
                - ])  | 
            |
| 219 | 
                - }  | 
            |
| 220 | 
                -  | 
            |
| 221 | 205 | 
                     func activateConstraintsSliderView() {
               | 
            
| 222 | 206 | 
                 | 
            
| 223 | 207 | 
                sliderView.translatesAutoresizingMaskIntoConstraints = false  | 
            
                @@ -366,9 +350,3 @@ fileprivate extension PageViewController {
               | 
            ||
| 366 | 350 | 
                }  | 
            
| 367 | 351 | 
                }  | 
            
| 368 | 352 | 
                }  | 
            
| 369 | 
                -  | 
            |
| 370 | 
                -extension PageViewController: NavigationBarInteractiveViewController {    
               | 
            |
| 371 | 
                -    public var navigationView: UIView {
               | 
            |
| 372 | 
                - return menuView  | 
            |
| 373 | 
                - }  | 
            |
| 374 | 
                -}  | 
            
                @@ -86,5 +86,4 @@ extension GroupNameModificationViewController {
               | 
            ||
| 86 | 86 | 
                }  | 
            
| 87 | 87 | 
                }  | 
            
| 88 | 88 | 
                 | 
            
| 89 | 
                -  | 
            |
| 90 | 89 | 
                 extension GroupNameModificationViewController: NavigationBackViewController {}
               | 
            
                @@ -59,6 +59,7 @@ final class GroupViewController: UIViewController {
               | 
            ||
| 59 | 59 | 
                bundle: Bundle(identifier: "com.Paiai-iOS")),  | 
            
| 60 | 60 | 
                forCellWithReuseIdentifier: "photoCell")  | 
            
| 61 | 61 | 
                setup()  | 
            
| 62 | 
                + setNavigationBar()  | 
            |
| 62 | 63 | 
                binding()  | 
            
| 63 | 64 | 
                }  | 
            
| 64 | 65 | 
                 | 
            
                @@ -149,7 +150,7 @@ fileprivate extension GroupViewController {
               | 
            ||
| 149 | 150 | 
                }  | 
            
| 150 | 151 | 
                }  | 
            
| 151 | 152 | 
                 | 
            
| 152 | 
                -extension GroupViewController: NavigationBarInteractiveViewController {
               | 
            |
| 153 | 
                +extension GroupViewController {
               | 
            |
| 153 | 154 | 
                     var navigationView: UIView {
               | 
            
| 154 | 155 | 
                return navigationBarView  | 
            
| 155 | 156 | 
                }  | 
            
                @@ -157,14 +158,13 @@ extension GroupViewController: NavigationBarInteractiveViewController {
               | 
            ||
| 157 | 158 | 
                     func setNavigationBar() {
               | 
            
| 158 | 159 | 
                         guard navigationViewNotReady else { return }
               | 
            
| 159 | 160 | 
                setRightBarButtonItems()  | 
            
| 160 | 
                - construvtNaivgationViewHierarchy()  | 
            |
| 161 | 
                + constructNaivgationViewHierarchy()  | 
            |
| 161 | 162 | 
                activateConstraintsNavigation()  | 
            
| 162 | 
                -  | 
            |
| 163 | 163 | 
                navigationViewNotReady = false  | 
            
| 164 | 164 | 
                }  | 
            
| 165 | 165 | 
                 | 
            
| 166 | 
                -    private func construvtNaivgationViewHierarchy() {
               | 
            |
| 167 | 
                - navigationController?.navigationBar.addSubview(navigationBarView)  | 
            |
| 166 | 
                +    private func constructNaivgationViewHierarchy() {
               | 
            |
| 167 | 
                + navigationItem.titleView = navigationBarView  | 
            |
| 168 | 168 | 
                navigationBarView.addSubview(navigationBarViewImage)  | 
            
| 169 | 169 | 
                navigationBarView.addSubview(navigationBarViewTitle)  | 
            
| 170 | 170 | 
                }  | 
            
                @@ -172,7 +172,7 @@ extension GroupViewController: NavigationBarInteractiveViewController {
               | 
            ||
| 172 | 172 | 
                     private func setRightBarButtonItems() {
               | 
            
| 173 | 173 | 
                let item = UIBarButtonItem(images: [UIImage(named: "navigation-QR"),  | 
            
| 174 | 174 | 
                UIImage(named: "navigation-right")],  | 
            
| 175 | 
                - targets: [self, viewModel],  | 
            |
| 175 | 
                + targets: [self, viewModel!],  | 
            |
| 176 | 176 | 
                actions: [#selector(GroupViewController.presentGroupQR),  | 
            
| 177 | 177 | 
                #selector(GroupViewModel.navigateToGroupDetail)])  | 
            
| 178 | 178 | 
                 | 
            
                @@ -194,23 +194,10 @@ extension GroupViewController: NavigationBarInteractiveViewController {
               | 
            ||
| 194 | 194 | 
                 fileprivate extension GroupViewController {
               | 
            
| 195 | 195 | 
                 | 
            
| 196 | 196 | 
                     func activateConstraintsNavigation() {
               | 
            
| 197 | 
                - activateConstraintsNavigationBarView()  | 
            |
| 198 | 197 | 
                activateConstraintsNavigationBarViewImage()  | 
            
| 199 | 198 | 
                activateConstraintsNavigationBarViewTitle()  | 
            
| 200 | 199 | 
                }  | 
            
| 201 | 200 | 
                 | 
            
| 202 | 
                -    func activateConstraintsNavigationBarView() {
               | 
            |
| 203 | 
                -        guard let barContentView = navigationController?.navigationBar else {  return }
               | 
            |
| 204 | 
                -  | 
            |
| 205 | 
                - navigationBarView.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 206 | 
                -  | 
            |
| 207 | 
                - NSLayoutConstraint.activate([  | 
            |
| 208 | 
                - navigationBarView.topAnchor.constraint(equalTo: barContentView.topAnchor),  | 
            |
| 209 | 
                - navigationBarView.bottomAnchor.constraint(equalTo: barContentView.bottomAnchor),  | 
            |
| 210 | 
                - navigationBarView.centerXAnchor.constraint(equalTo: barContentView.centerXAnchor)  | 
            |
| 211 | 
                - ])  | 
            |
| 212 | 
                - }  | 
            |
| 213 | 
                -  | 
            |
| 214 | 201 | 
                     func activateConstraintsNavigationBarViewTitle() {
               | 
            
| 215 | 202 | 
                navigationBarViewTitle.translatesAutoresizingMaskIntoConstraints = false  | 
            
| 216 | 203 | 
                NSLayoutConstraint.activate([  | 
            
                @@ -24,7 +24,8 @@ final class ScanQRViewController: UIViewController {
               | 
            ||
| 24 | 24 | 
                     override func viewDidLoad() {
               | 
            
| 25 | 25 | 
                super.viewDidLoad()  | 
            
| 26 | 26 | 
                scanView.delegate = self  | 
            
| 27 | 
                - viewModel.join(code: "http://pai.ai/g/SpA5be3")  | 
            |
| 27 | 
                +// viewModel.join(code: "http://pai.ai/g/SpA5be3")  | 
            |
| 28 | 
                + setNavigationBar()  | 
            |
| 28 | 29 | 
                }  | 
            
| 29 | 30 | 
                 | 
            
| 30 | 31 | 
                     func setNavigationBar() {
               | 
            
                @@ -34,7 +35,7 @@ final class ScanQRViewController: UIViewController {
               | 
            ||
| 34 | 35 | 
                 | 
            
| 35 | 36 | 
                     override func viewWillAppear(_ animated: Bool) {
               | 
            
| 36 | 37 | 
                super.viewWillAppear(animated)  | 
            
| 37 | 
                - setNavigationBar()  | 
            |
| 38 | 
                +  | 
            |
| 38 | 39 | 
                }  | 
            
| 39 | 40 | 
                 | 
            
| 40 | 41 | 
                     override func viewWillDisappear(_ animated: Bool) {
               | 
            
                @@ -48,7 +48,7 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 48 | 48 | 
                setup()  | 
            
| 49 | 49 | 
                binding()  | 
            
| 50 | 50 | 
                setNavigationBar()  | 
            
| 51 | 
                - self.viewModel.reload()  | 
            |
| 51 | 
                + self.viewModel.reload()  | 
            |
| 52 | 52 | 
                }  | 
            
| 53 | 53 | 
                 | 
            
| 54 | 54 | 
                     private func setNavigationBar() {
               | 
            
                @@ -174,19 +174,6 @@ fileprivate extension MessageListViewController {
               | 
            ||
| 174 | 174 | 
                self.tableView.endRefreshing(at: .bottom)  | 
            
| 175 | 175 | 
                }  | 
            
| 176 | 176 | 
                }).disposed(by: disposeBag)  | 
            
| 177 | 
                -  | 
            |
| 178 | 
                - viewModel.hasMoreData  | 
            |
| 179 | 
                - .asDriver(onErrorJustReturn: true)  | 
            |
| 180 | 
                -            .drive(onNext: {[weak self] flag in
               | 
            |
| 181 | 
                -                guard let `self` = self else { return }
               | 
            |
| 182 | 
                -                if flag {
               | 
            |
| 183 | 
                -                    if self.tableView.bottomPullToRefresh == nil {
               | 
            |
| 184 | 
                - self.setupLoadingControl()  | 
            |
| 185 | 
                - }  | 
            |
| 186 | 
                -                } else {
               | 
            |
| 187 | 
                -// self.tableViewt  | 
            |
| 188 | 
                - }  | 
            |
| 189 | 
                - }).disposed(by: disposeBag)  | 
            |
| 190 | 177 | 
                }  | 
            
| 191 | 178 | 
                }  | 
            
| 192 | 179 | 
                 | 
            
                @@ -128,19 +128,6 @@ fileprivate extension MineGroupViewController {
               | 
            ||
| 128 | 128 | 
                self.tableView.endRefreshing(at: .bottom)  | 
            
| 129 | 129 | 
                }  | 
            
| 130 | 130 | 
                }).disposed(by: disposeBag)  | 
            
| 131 | 
                -  | 
            |
| 132 | 
                - viewModel.hasMoreData  | 
            |
| 133 | 
                - .asDriver(onErrorJustReturn: true)  | 
            |
| 134 | 
                -            .drive(onNext: {[weak self] flag in
               | 
            |
| 135 | 
                -                guard let `self` = self else { return }
               | 
            |
| 136 | 
                -                if flag {
               | 
            |
| 137 | 
                -                    if self.tableView.bottomPullToRefresh == nil {
               | 
            |
| 138 | 
                - self.setupLoadingControl()  | 
            |
| 139 | 
                - }  | 
            |
| 140 | 
                -                } else {
               | 
            |
| 141 | 
                - // self.tableViewt  | 
            |
| 142 | 
                - }  | 
            |
| 143 | 
                - }).disposed(by: disposeBag)  | 
            |
| 144 | 131 | 
                }  | 
            
| 145 | 132 | 
                }  | 
            
| 146 | 133 | 
                 | 
            
                @@ -111,19 +111,6 @@ fileprivate extension MineOrderViewController {
               | 
            ||
| 111 | 111 | 
                self.tableView.endRefreshing(at: .bottom)  | 
            
| 112 | 112 | 
                }  | 
            
| 113 | 113 | 
                }).disposed(by: disposeBag)  | 
            
| 114 | 
                -  | 
            |
| 115 | 
                - viewModel.hasMoreData  | 
            |
| 116 | 
                - .asDriver(onErrorJustReturn: true)  | 
            |
| 117 | 
                -            .drive(onNext: {[weak self] flag in
               | 
            |
| 118 | 
                -                guard let `self` = self else { return }
               | 
            |
| 119 | 
                -                if flag {
               | 
            |
| 120 | 
                -                    if self.tableView.bottomPullToRefresh == nil {
               | 
            |
| 121 | 
                - self.setupLoadingControl()  | 
            |
| 122 | 
                - }  | 
            |
| 123 | 
                -                } else {
               | 
            |
| 124 | 
                - // self.tableViewt  | 
            |
| 125 | 
                - }  | 
            |
| 126 | 
                - }).disposed(by: disposeBag)  | 
            |
| 127 | 114 | 
                }  | 
            
| 128 | 115 | 
                }  | 
            
| 129 | 116 | 
                 |