@@ -97,7 +97,6 @@  | 
            ||
| 97 | 97 | 
                 		0513102521CA1B67004EF1BE /* NetworkApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */; };
               | 
            
| 98 | 98 | 
                 		0513102621CA1B67004EF1BE /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34B1F7E4024009E4ED2 /* Resource.swift */; };
               | 
            
| 99 | 99 | 
                 		0513102821CA1B67004EF1BE /* NetWorkCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */; };
               | 
            
| 100 | 
                -		0513102921CA1B67004EF1BE /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0594845921B66DA500074EFC /* Result.swift */; };
               | 
            |
| 101 | 100 | 
                 		0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD61E70047E0006FEE0 /* HomeRepository.swift */; };
               | 
            
| 102 | 101 | 
                 		0513102C21CA1B67004EF1BE /* OrderRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAED1E70047E0006FEE0 /* OrderRepository.swift */; };
               | 
            
| 103 | 102 | 
                 		0513102D21CA1B67004EF1BE /* GroupPhotoRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */; };
               | 
            
                @@ -138,14 +137,10 @@  | 
            ||
| 138 | 137 | 
                 		0513106721CA290B004EF1BE /* DateExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543274721C68C1900C6388D /* DateExt.swift */; };
               | 
            
| 139 | 138 | 
                 		0513106921CA34D6004EF1BE /* GroupDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */; };
               | 
            
| 140 | 139 | 
                 		0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */; };
               | 
            
| 141 | 
                -		0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106D21CA3907004EF1BE /* FFAlertController.swift */; };
               | 
            |
| 142 | 140 | 
                 		0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106F21CA3907004EF1BE /* CancelAlertAction.swift */; };
               | 
            
| 143 | 
                -		0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */; };
               | 
            |
| 144 | 141 | 
                 		0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */; };
               | 
            
| 145 | 142 | 
                 		0513108021CA3907004EF1BE /* ActionSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107221CA3907004EF1BE /* ActionSheetView.swift */; };
               | 
            
| 146 | 143 | 
                 		0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */; };
               | 
            
| 147 | 
                -		0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107421CA3907004EF1BE /* FFSheetActionCell.swift */; };
               | 
            |
| 148 | 
                -		0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107521CA3907004EF1BE /* FFAlertLabel.swift */; };
               | 
            |
| 149 | 144 | 
                 		0513109321CA3915004EF1BE /* ColorQR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108A21CA3914004EF1BE /* ColorQR.swift */; };
               | 
            
| 150 | 145 | 
                 		0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */; };
               | 
            
| 151 | 146 | 
                 		0513109521CA3915004EF1BE /* QRCodeScanDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */; };
               | 
            
                @@ -166,7 +161,6 @@  | 
            ||
| 166 | 161 | 
                 		051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543276621C68C3300C6388D /* UIImageView+Kingfisher.swift */; };
               | 
            
| 167 | 162 | 
                 		051310B821CB6958004EF1BE /* UserInfoStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310B721CB6958004EF1BE /* UserInfoStore.swift */; };
               | 
            
| 168 | 163 | 
                 		051310C021CB6EF4004EF1BE /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310BF21CB6EF4004EF1BE /* UserInfo.swift */; };
               | 
            
| 169 | 
                -		0521145421F083F20047C55A /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
               | 
            |
| 170 | 164 | 
                 		052BF1C821E344020010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
               | 
            
| 171 | 165 | 
                 		052BF1C921E344280010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
               | 
            
| 172 | 166 | 
                 		0530951B221AB3EC00408D34 /* GroupDetailMemeberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0530951A221AB3EC00408D34 /* GroupDetailMemeberView.swift */; };
               | 
            
                @@ -174,11 +168,7 @@  | 
            ||
| 174 | 168 | 
                 		0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0535D6DA21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift */; };
               | 
            
| 175 | 169 | 
                 		053E126521F1718E00A64893 /* PageOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126421F1718E00A64893 /* PageOption.swift */; };
               | 
            
| 176 | 170 | 
                 		053E126721F1719F00A64893 /* PageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126621F1719F00A64893 /* PageItem.swift */; };
               | 
            
| 177 | 
                -		053E126921F171C500A64893 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
               | 
            |
| 178 | 
                -		053E126B21F5696E00A64893 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
               | 
            |
| 179 | 
                -		053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
               | 
            |
| 180 | 
                -		053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
               | 
            |
| 181 | 
                -		053E127521F5A72000A64893 /* DataError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* DataError.swift */; };
               | 
            |
| 171 | 
                +		053E127521F5A72000A64893 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* Error.swift */; };
               | 
            |
| 182 | 172 | 
                 		053E127821F5B6E400A64893 /* AlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127721F5B6E400A64893 /* AlertController.swift */; };
               | 
            
| 183 | 173 | 
                 		0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E7F321CB911200A42807 /* UserInfoViewModel.swift */; };
               | 
            
| 184 | 174 | 
                 		0543E80721D0CDFA00A42807 /* MineFeedbackViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80621D0CDFA00A42807 /* MineFeedbackViewModel.swift */; };
               | 
            
                @@ -186,7 +176,6 @@  | 
            ||
| 186 | 176 | 
                 		0543E80D21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80C21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift */; };
               | 
            
| 187 | 177 | 
                 		0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */; };
               | 
            
| 188 | 178 | 
                 		0546D9852242460700742939 /* OriginData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D9842242460700742939 /* OriginData.swift */; };
               | 
            
| 189 | 
                -		0546D98E2243782300742939 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D98D2243782300742939 /* ShareView.swift */; };
               | 
            |
| 190 | 179 | 
                 		054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */; };
               | 
            
| 191 | 180 | 
                 		054B6C46223F966A00939FE6 /* RxDataSources.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05130FC421CA1997004EF1BE /* RxDataSources.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
               | 
            
| 192 | 181 | 
                 		05594BFF2240BEDE002D4910 /* PhotoDetailListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05594BFE2240BEDE002D4910 /* PhotoDetailListViewModel.swift */; };
               | 
            
                @@ -217,6 +206,12 @@  | 
            ||
| 217 | 206 | 
                 		0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */; };
               | 
            
| 218 | 207 | 
                 		0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */; };
               | 
            
| 219 | 208 | 
                 		0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */; };
               | 
            
| 209 | 
                +		058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */; };
               | 
            |
| 210 | 
                +		058D0CA02249FCF6006CA488 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
               | 
            |
| 211 | 
                +		058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
               | 
            |
| 212 | 
                +		058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
               | 
            |
| 213 | 
                +		058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
               | 
            |
| 214 | 
                +		058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
               | 
            |
| 220 | 215 | 
                 		059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B589E21F7103100FA64C2 /* AlertItem.swift */; };
               | 
            
| 221 | 216 | 
                 		059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A521F7235D00FA64C2 /* AlertAction.swift */; };
               | 
            
| 222 | 217 | 
                 		059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A721F83B1600FA64C2 /* CenterCancelItem.swift */; };
               | 
            
                @@ -370,14 +365,10 @@  | 
            ||
| 370 | 365 | 
                 		0513106121CA22B5004EF1BE /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = "<group>"; };
               | 
            
| 371 | 366 | 
                 		0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 372 | 367 | 
                 		0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 373 | 
                -		0513106D21CA3907004EF1BE /* FFAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertController.swift; sourceTree = "<group>"; };
               | 
            |
| 374 | 368 | 
                 		0513106F21CA3907004EF1BE /* CancelAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CancelAlertAction.swift; sourceTree = "<group>"; };
               | 
            
| 375 | 
                -		0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertControllerRepresentable.swift; sourceTree = "<group>"; };
               | 
            |
| 376 | 369 | 
                 		0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DestructiveAlertAction.swift; sourceTree = "<group>"; };
               | 
            
| 377 | 370 | 
                 		0513107221CA3907004EF1BE /* ActionSheetView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetView.swift; sourceTree = "<group>"; };
               | 
            
| 378 | 371 | 
                 		0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmAlertAction.swift; sourceTree = "<group>"; };
               | 
            
| 379 | 
                -		0513107421CA3907004EF1BE /* FFSheetActionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFSheetActionCell.swift; sourceTree = "<group>"; };
               | 
            |
| 380 | 
                -		0513107521CA3907004EF1BE /* FFAlertLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertLabel.swift; sourceTree = "<group>"; };
               | 
            |
| 381 | 372 | 
                 		0513108A21CA3914004EF1BE /* ColorQR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorQR.swift; sourceTree = "<group>"; };
               | 
            
| 382 | 373 | 
                 		0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeMaskView.swift; sourceTree = "<group>"; };
               | 
            
| 383 | 374 | 
                 		0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeScanDelegate.swift; sourceTree = "<group>"; };
               | 
            
                @@ -403,7 +394,7 @@  | 
            ||
| 403 | 394 | 
                 		053E126A21F5696E00A64893 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = "<group>"; };
               | 
            
| 404 | 395 | 
                 		053E126C21F5767300A64893 /* ToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastAnimator.swift; sourceTree = "<group>"; };
               | 
            
| 405 | 396 | 
                 		053E126E21F5774700A64893 /* FadeToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FadeToastAnimator.swift; sourceTree = "<group>"; };
               | 
            
| 406 | 
                -		053E127421F5A72000A64893 /* DataError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataError.swift; sourceTree = "<group>"; };
               | 
            |
| 397 | 
                +		053E127421F5A72000A64893 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
               | 
            |
| 407 | 398 | 
                 		053E127721F5B6E400A64893 /* AlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertController.swift; sourceTree = "<group>"; };
               | 
            
| 408 | 399 | 
                 		0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupPhotoRepository.swift; sourceTree = "<group>"; };
               | 
            
| 409 | 400 | 
                 		0540C8B21F8CA07E0044FCC5 /* FileModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileModel.swift; sourceTree = "<group>"; };
               | 
            
                @@ -428,7 +419,6 @@  | 
            ||
| 428 | 419 | 
                 		0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailItem.swift; sourceTree = "<group>"; };
               | 
            
| 429 | 420 | 
                 		05468AF11F8B73A000B8F469 /* PhotoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoItem.swift; sourceTree = "<group>"; };
               | 
            
| 430 | 421 | 
                 		0546D9842242460700742939 /* OriginData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OriginData.swift; sourceTree = "<group>"; };
               | 
            
| 431 | 
                -		0546D98D2243782300742939 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
               | 
            |
| 432 | 422 | 
                 		054863661FA326CB00A39DA0 /* PhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoCell.swift; sourceTree = "<group>"; };
               | 
            
| 433 | 423 | 
                 		054863671FA326CB00A39DA0 /* PhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhotoCell.xib; sourceTree = "<group>"; };
               | 
            
| 434 | 424 | 
                 		054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailRemoteAPI.swift; sourceTree = "<group>"; };
               | 
            
                @@ -459,8 +449,8 @@  | 
            ||
| 459 | 449 | 
                 		0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentAnimatorDelegate.swift; sourceTree = "<group>"; };
               | 
            
| 460 | 450 | 
                 		0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentExtension.swift; sourceTree = "<group>"; };
               | 
            
| 461 | 451 | 
                 		0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentViewController.swift; sourceTree = "<group>"; };
               | 
            
| 452 | 
                +		058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorKey.swift; sourceTree = "<group>"; };
               | 
            |
| 462 | 453 | 
                 		0594845721B528FE00074EFC /* Interfaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = "<group>"; };
               | 
            
| 463 | 
                -		0594845921B66DA500074EFC /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
               | 
            |
| 464 | 454 | 
                 		059AA5D921BA1A2000485188 /* MessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCoordinator.swift; sourceTree = "<group>"; };
               | 
            
| 465 | 455 | 
                 		059AA62821BA855000485188 /* MessageRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRepository.swift; sourceTree = "<group>"; };
               | 
            
| 466 | 456 | 
                 		059AA62A21BA85B000485188 /* MessageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewModel.swift; sourceTree = "<group>"; };
               | 
            
                @@ -662,11 +652,9 @@  | 
            ||
| 662 | 652 | 
                children = (  | 
            
| 663 | 653 | 
                055BB53F220AEA4E009548AA /* Nibless */,  | 
            
| 664 | 654 | 
                0584FD7A21FABA0300FA1E3E /* Present */,  | 
            
| 665 | 
                - 0521145521F083FA0047C55A /* Toast */,  | 
            |
| 666 | 655 | 
                05C8D21E21EDD5A80001E847 /* NavigationBar */,  | 
            
| 667 | 656 | 
                05C8D21721ED911D0001E847 /* NavigationBack */,  | 
            
| 668 | 657 | 
                0513108921CA3914004EF1BE /* QR */,  | 
            
| 669 | 
                - 0513106C21CA3907004EF1BE /* Alert */,  | 
            |
| 670 | 658 | 
                05130F4E21C94C12004EF1BE /* AlertViewController */,  | 
            
| 671 | 659 | 
                05130F6121C94C79004EF1BE /* PageViewController */,  | 
            
| 672 | 660 | 
                05130F5F21C94C79004EF1BE /* SideViewController */,  | 
            
                @@ -806,6 +794,7 @@  | 
            ||
| 806 | 794 | 
                 		05130FBA21C9EE82004EF1BE /* App */ = {
               | 
            
| 807 | 795 | 
                isa = PBXGroup;  | 
            
| 808 | 796 | 
                children = (  | 
            
| 797 | 
                + 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */,  | 
            |
| 809 | 798 | 
                050E210F21B8CE8A008E1352 /* AppCoordinator.swift */,  | 
            
| 810 | 799 | 
                05087F6721B8F9530024A117 /* ContainerViewController.swift */,  | 
            
| 811 | 800 | 
                A69FFA791E7002970006FEE0 /* LoginViewController.swift */,  | 
            
                @@ -820,25 +809,6 @@  | 
            ||
| 820 | 809 | 
                path = App;  | 
            
| 821 | 810 | 
                sourceTree = "<group>";  | 
            
| 822 | 811 | 
                };  | 
            
| 823 | 
                -		0513106C21CA3907004EF1BE /* Alert */ = {
               | 
            |
| 824 | 
                - isa = PBXGroup;  | 
            |
| 825 | 
                - children = (  | 
            |
| 826 | 
                - 0513106D21CA3907004EF1BE /* FFAlertController.swift */,  | 
            |
| 827 | 
                - 0513106E21CA3907004EF1BE /* Views */,  | 
            |
| 828 | 
                - );  | 
            |
| 829 | 
                - path = Alert;  | 
            |
| 830 | 
                - sourceTree = "<group>";  | 
            |
| 831 | 
                - };  | 
            |
| 832 | 
                -		0513106E21CA3907004EF1BE /* Views */ = {
               | 
            |
| 833 | 
                - isa = PBXGroup;  | 
            |
| 834 | 
                - children = (  | 
            |
| 835 | 
                - 0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */,  | 
            |
| 836 | 
                - 0513107421CA3907004EF1BE /* FFSheetActionCell.swift */,  | 
            |
| 837 | 
                - 0513107521CA3907004EF1BE /* FFAlertLabel.swift */,  | 
            |
| 838 | 
                - );  | 
            |
| 839 | 
                - path = Views;  | 
            |
| 840 | 
                - sourceTree = "<group>";  | 
            |
| 841 | 
                - };  | 
            |
| 842 | 812 | 
                 		0513108921CA3914004EF1BE /* QR */ = {
               | 
            
| 843 | 813 | 
                isa = PBXGroup;  | 
            
| 844 | 814 | 
                children = (  | 
            
                @@ -895,8 +865,9 @@  | 
            ||
| 895 | 865 | 
                 		053E127221F5A6D400A64893 /* Resuable */ = {
               | 
            
| 896 | 866 | 
                isa = PBXGroup;  | 
            
| 897 | 867 | 
                children = (  | 
            
| 868 | 
                + 0521145521F083FA0047C55A /* Toast */,  | 
            |
| 898 | 869 | 
                053E127321F5A6E200A64893 /* Extension */,  | 
            
| 899 | 
                - 053E127421F5A72000A64893 /* DataError.swift */,  | 
            |
| 870 | 
                + 053E127421F5A72000A64893 /* Error.swift */,  | 
            |
| 900 | 871 | 
                );  | 
            
| 901 | 872 | 
                path = Resuable;  | 
            
| 902 | 873 | 
                sourceTree = "<group>";  | 
            
                @@ -1212,7 +1183,6 @@  | 
            ||
| 1212 | 1183 | 
                A69FFA9E1E7004700006FEE0 /* PhotoDetailCommentCell.swift */,  | 
            
| 1213 | 1184 | 
                05594C022240E94E002D4910 /* PhotoDetailImageCell.swift */,  | 
            
| 1214 | 1185 | 
                A69FFAA61E7004700006FEE0 /* ImageCell.swift */,  | 
            
| 1215 | 
                - 0546D98D2243782300742939 /* ShareView.swift */,  | 
            |
| 1216 | 1186 | 
                A69FFAA81E7004700006FEE0 /* ShareController.swift */,  | 
            
| 1217 | 1187 | 
                A69FFAA91E7004700006FEE0 /* PhotoPreviewViewController.swift */,  | 
            
| 1218 | 1188 | 
                A69FFB881E7018CC0006FEE0 /* PhotoDetail.storyboard */,  | 
            
                @@ -1346,7 +1316,6 @@  | 
            ||
| 1346 | 1316 | 
                children = (  | 
            
| 1347 | 1317 | 
                0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */,  | 
            
| 1348 | 1318 | 
                0505B34B1F7E4024009E4ED2 /* Resource.swift */,  | 
            
| 1349 | 
                - 0594845921B66DA500074EFC /* Result.swift */,  | 
            |
| 1350 | 1319 | 
                0594845721B528FE00074EFC /* Interfaces.swift */,  | 
            
| 1351 | 1320 | 
                A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */,  | 
            
| 1352 | 1321 | 
                );  | 
            
                @@ -1626,7 +1595,6 @@  | 
            ||
| 1626 | 1595 | 
                05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */,  | 
            
| 1627 | 1596 | 
                05130FFD21CA1B39004EF1BE /* HardwareAuthorization.swift in Sources */,  | 
            
| 1628 | 1597 | 
                0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */,  | 
            
| 1629 | 
                - 053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */,  | 
            |
| 1630 | 1598 | 
                05130FFE21CA1B39004EF1BE /* WaterfallFlowLayout.swift in Sources */,  | 
            
| 1631 | 1599 | 
                05130FFF21CA1B39004EF1BE /* WaterfallFlowConfiguration.swift in Sources */,  | 
            
| 1632 | 1600 | 
                055BB53E220AEA3B009548AA /* NiblessViewController.swift in Sources */,  | 
            
                @@ -1638,20 +1606,16 @@  | 
            ||
| 1638 | 1606 | 
                0513100121CA1B39004EF1BE /* CGPointExt.swift in Sources */,  | 
            
| 1639 | 1607 | 
                0584FD7521F9C70D00FA1E3E /* SideAnimator.swift in Sources */,  | 
            
| 1640 | 1608 | 
                0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */,  | 
            
| 1641 | 
                - 0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */,  | 
            |
| 1642 | 1609 | 
                0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */,  | 
            
| 1643 | 1610 | 
                059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */,  | 
            
| 1644 | 1611 | 
                059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */,  | 
            
| 1645 | 1612 | 
                0513109821CA3915004EF1BE /* QRCodeScanResult.swift in Sources */,  | 
            
| 1646 | 1613 | 
                0513100221CA1B39004EF1BE /* CGSizeExt.swift in Sources */,  | 
            
| 1647 | 
                - 053E126921F171C500A64893 /* ToastOption.swift in Sources */,  | 
            |
| 1648 | 1614 | 
                0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */,  | 
            
| 1649 | 
                - 0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */,  | 
            |
| 1650 | 1615 | 
                05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */,  | 
            
| 1651 | 1616 | 
                0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,  | 
            
| 1652 | 1617 | 
                0513100721CA1B39004EF1BE /* UIViewController+UIBarButtonItem.swift in Sources */,  | 
            
| 1653 | 1618 | 
                05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,  | 
            
| 1654 | 
                - 053E126B21F5696E00A64893 /* Toast.swift in Sources */,  | 
            |
| 1655 | 1619 | 
                0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */,  | 
            
| 1656 | 1620 | 
                057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,  | 
            
| 1657 | 1621 | 
                0513106021CA1E53004EF1BE /* UIStoryboardExt.swift in Sources */,  | 
            
                @@ -1684,7 +1648,6 @@  | 
            ||
| 1684 | 1648 | 
                05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */,  | 
            
| 1685 | 1649 | 
                05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */,  | 
            
| 1686 | 1650 | 
                05130F5A21C94C12004EF1BE /* PresentDisappearAnimatedTransitioning.swift in Sources */,  | 
            
| 1687 | 
                - 053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */,  | 
            |
| 1688 | 1651 | 
                053E126721F1719F00A64893 /* PageItem.swift in Sources */,  | 
            
| 1689 | 1652 | 
                053E127821F5B6E400A64893 /* AlertController.swift in Sources */,  | 
            
| 1690 | 1653 | 
                05C5285621FE98F50090ECB5 /* GestureRecognizerProxy.swift in Sources */,  | 
            
                @@ -1692,15 +1655,12 @@  | 
            ||
| 1692 | 1655 | 
                0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */,  | 
            
| 1693 | 1656 | 
                0513109721CA3915004EF1BE /* QRCodeScanner.swift in Sources */,  | 
            
| 1694 | 1657 | 
                05130F5E21C94C12004EF1BE /* PresentAppearAnimatedTransitioning.swift in Sources */,  | 
            
| 1695 | 
                - 0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */,  | 
            |
| 1696 | 1658 | 
                05130F5721C94C12004EF1BE /* AlertAnimator.swift in Sources */,  | 
            
| 1697 | 1659 | 
                0513109321CA3915004EF1BE /* ColorQR.swift in Sources */,  | 
            
| 1698 | 1660 | 
                0569F61822014B24000A75CA /* NavigationBarDelegate.swift in Sources */,  | 
            
| 1699 | 1661 | 
                05130F5C21C94C12004EF1BE /* ActionSheetAnimator.swift in Sources */,  | 
            
| 1700 | 1662 | 
                05130F5B21C94C12004EF1BE /* PresentAnimatable.swift in Sources */,  | 
            
| 1701 | 
                - 0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */,  | 
            |
| 1702 | 1663 | 
                05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */,  | 
            
| 1703 | 
                - 0521145421F083F20047C55A /* ToastView.swift in Sources */,  | 
            |
| 1704 | 1664 | 
                05C5285821FE995F0090ECB5 /* GestureRecognizerDelegate.swift in Sources */,  | 
            
| 1705 | 1665 | 
                05130F6321C94C7A004EF1BE /* SideViewController.swift in Sources */,  | 
            
| 1706 | 1666 | 
                05130F6421C94C7A004EF1BE /* PageViewController.swift in Sources */,  | 
            
                @@ -1711,6 +1671,11 @@  | 
            ||
| 1711 | 1671 | 
                isa = PBXSourcesBuildPhase;  | 
            
| 1712 | 1672 | 
                buildActionMask = 2147483647;  | 
            
| 1713 | 1673 | 
                files = (  | 
            
| 1674 | 
                + 058D0CA02249FCF6006CA488 /* Toast.swift in Sources */,  | 
            |
| 1675 | 
                + 058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */,  | 
            |
| 1676 | 
                + 058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */,  | 
            |
| 1677 | 
                + 058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */,  | 
            |
| 1678 | 
                + 058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */,  | 
            |
| 1714 | 1679 | 
                0513106521CA290B004EF1BE /* UserDefaultsExt.swift in Sources */,  | 
            
| 1715 | 1680 | 
                0513106621CA290B004EF1BE /* StringExt.swift in Sources */,  | 
            
| 1716 | 1681 | 
                0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */,  | 
            
                @@ -1730,7 +1695,6 @@  | 
            ||
| 1730 | 1695 | 
                0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */,  | 
            
| 1731 | 1696 | 
                05B2C63121D75A1B008063B3 /* ContentResource.swift in Sources */,  | 
            
| 1732 | 1697 | 
                057CA9CA21DCA70B00FB7D03 /* GroupRepository.swift in Sources */,  | 
            
| 1733 | 
                - 0513102921CA1B67004EF1BE /* Result.swift in Sources */,  | 
            |
| 1734 | 1698 | 
                05C0D9A421D28591000B7B2A /* UserInfoRemoteAPI.swift in Sources */,  | 
            
| 1735 | 1699 | 
                0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */,  | 
            
| 1736 | 1700 | 
                0535D6D921D32A89008D9403 /* WXUserInfoRemoteAPI.swift in Sources */,  | 
            
                @@ -1763,7 +1727,7 @@  | 
            ||
| 1763 | 1727 | 
                0513103F21CA1B67004EF1BE /* PhotoDetailViewModel.swift in Sources */,  | 
            
| 1764 | 1728 | 
                054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */,  | 
            
| 1765 | 1729 | 
                0513104021CA1B67004EF1BE /* MessageListViewModel.swift in Sources */,  | 
            
| 1766 | 
                - 053E127521F5A72000A64893 /* DataError.swift in Sources */,  | 
            |
| 1730 | 
                + 053E127521F5A72000A64893 /* Error.swift in Sources */,  | 
            |
| 1767 | 1731 | 
                05B2C61D21D710C5008063B3 /* GroupRemoteAPI.swift in Sources */,  | 
            
| 1768 | 1732 | 
                0513104121CA1B67004EF1BE /* MessageViewModel.swift in Sources */,  | 
            
| 1769 | 1733 | 
                0513104221CA1B67004EF1BE /* CreateGroupViewModel.swift in Sources */,  | 
            
                @@ -1785,7 +1749,6 @@  | 
            ||
| 1785 | 1749 | 
                isa = PBXSourcesBuildPhase;  | 
            
| 1786 | 1750 | 
                buildActionMask = 2147483647;  | 
            
| 1787 | 1751 | 
                files = (  | 
            
| 1788 | 
                - 0546D98E2243782300742939 /* ShareView.swift in Sources */,  | 
            |
| 1789 | 1752 | 
                051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */,  | 
            
| 1790 | 1753 | 
                05130FDD21CA1B04004EF1BE /* GroupViewController.swift in Sources */,  | 
            
| 1791 | 1754 | 
                05130FDF21CA1B04004EF1BE /* GroupMemberCell.swift in Sources */,  | 
            
                @@ -1811,6 +1774,7 @@  | 
            ||
| 1811 | 1774 | 
                05130FF021CA1B04004EF1BE /* MineOrderViewController.swift in Sources */,  | 
            
| 1812 | 1775 | 
                05130FF121CA1B04004EF1BE /* MineAboutViewController.swift in Sources */,  | 
            
| 1813 | 1776 | 
                05130FF721CA1B04004EF1BE /* PhotoDetailCommentCell.swift in Sources */,  | 
            
| 1777 | 
                + 058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */,  | 
            |
| 1814 | 1778 | 
                0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */,  | 
            
| 1815 | 1779 | 
                05130FF821CA1B04004EF1BE /* ImageCell.swift in Sources */,  | 
            
| 1816 | 1780 | 
                05130FF921CA1B04004EF1BE /* PhotoDetailViewController.swift in Sources */,  | 
            
                @@ -0,0 +1,21 @@  | 
            ||
| 1 | 
                +{
               | 
            |
| 2 | 
                + "images" : [  | 
            |
| 3 | 
                +    {
               | 
            |
| 4 | 
                + "idiom" : "universal",  | 
            |
| 5 | 
                + "scale" : "1x"  | 
            |
| 6 | 
                + },  | 
            |
| 7 | 
                +    {
               | 
            |
| 8 | 
                + "idiom" : "universal",  | 
            |
| 9 | 
                + "scale" : "2x"  | 
            |
| 10 | 
                + },  | 
            |
| 11 | 
                +    {
               | 
            |
| 12 | 
                + "idiom" : "universal",  | 
            |
| 13 | 
                + "filename" : "Logo@3x.png",  | 
            |
| 14 | 
                + "scale" : "3x"  | 
            |
| 15 | 
                + }  | 
            |
| 16 | 
                + ],  | 
            |
| 17 | 
                +  "info" : {
               | 
            |
| 18 | 
                + "version" : 1,  | 
            |
| 19 | 
                + "author" : "xcode"  | 
            |
| 20 | 
                + }  | 
            |
| 21 | 
                +}  | 
            
      
                @@ -1,21 +0,0 @@  | 
            ||
| 1 | 
                -{
               | 
            |
| 2 | 
                - "images" : [  | 
            |
| 3 | 
                -    {
               | 
            |
| 4 | 
                - "idiom" : "universal",  | 
            |
| 5 | 
                - "scale" : "1x"  | 
            |
| 6 | 
                - },  | 
            |
| 7 | 
                -    {
               | 
            |
| 8 | 
                - "idiom" : "universal",  | 
            |
| 9 | 
                - "scale" : "2x"  | 
            |
| 10 | 
                - },  | 
            |
| 11 | 
                -    {
               | 
            |
| 12 | 
                - "idiom" : "universal",  | 
            |
| 13 | 
                - "filename" : "FEED_λ_@3x.png",  | 
            |
| 14 | 
                - "scale" : "3x"  | 
            |
| 15 | 
                - }  | 
            |
| 16 | 
                - ],  | 
            |
| 17 | 
                -  "info" : {
               | 
            |
| 18 | 
                - "version" : 1,  | 
            |
| 19 | 
                - "author" : "xcode"  | 
            |
| 20 | 
                - }  | 
            |
| 21 | 
                -}  | 
            
                @@ -32,7 +32,7 @@ struct GroupRemoteAPI {
               | 
            ||
| 32 | 32 | 
                 | 
            
| 33 | 33 | 
                     func loadContent(page: Int) -> Single<NetworkArrayData<GroupItem>> {
               | 
            
| 34 | 34 | 
                let resource = ContentResource<NetworkArrayData<GroupItem>>(path: .groupList,  | 
            
| 35 | 
                - parameter: ["user_id": ShareUserId, "page": page],  | 
            |
| 35 | 
                + parameter: ["user_id": ShareUserId, "page": page, "num": 20],  | 
            |
| 36 | 36 | 
                parseJSON: parse)  | 
            
| 37 | 37 | 
                return resource.loadContent()  | 
            
| 38 | 38 | 
                }  | 
            
                @@ -31,7 +31,7 @@ struct MessageRemoteAPI {
               | 
            ||
| 31 | 31 | 
                 | 
            
| 32 | 32 | 
                     func loadMessageList(_ type: MessageType, page: Int) -> Single<NetworkArrayData<MessageListItem>> {
               | 
            
| 33 | 33 | 
                let resource = ContentResource<NetworkArrayData<MessageListItem>>(path: type.model.path,  | 
            
| 34 | 
                - parameter: ["user_id": ShareUserId, "page": page],  | 
            |
| 34 | 
                + parameter: ["user_id": ShareUserId, "page": page, "num": 20],  | 
            |
| 35 | 35 | 
                parseJSON: parseMessageList)  | 
            
| 36 | 36 | 
                return resource.loadContent()  | 
            
| 37 | 37 | 
                }  | 
            
                @@ -18,7 +18,8 @@ struct OrderRemoteAPI {
               | 
            ||
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                     func loadContent(page: Int) -> Single<NetworkArrayData<OrderItem>> {
               | 
            
| 20 | 20 | 
                let resource = ContentResource<NetworkArrayData<OrderItem>>(path: .orderList,  | 
            
| 21 | 
                - parameter: ["user_id": ShareUserId, "page": page],  | 
            |
| 21 | 
                + parameter: ["user_id": ShareUserId,  | 
            |
| 22 | 
                + "page": page, "num": 20],  | 
            |
| 22 | 23 | 
                parseJSON: parse)  | 
            
| 23 | 24 | 
                return resource.loadContent()  | 
            
| 24 | 25 | 
                }  | 
            
                @@ -6,14 +6,10 @@  | 
            ||
| 6 | 6 | 
                // Copyright © 2017年 yb. All rights reserved.  | 
            
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 
                -import Foundation  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 10 | 
                import Alamofire  | 
            
| 11 | 11 | 
                import RxSwift  | 
            
| 12 | 12 | 
                 | 
            
| 13 | 
                -struct ParseError: Error {}
               | 
            |
| 14 | 
                -  | 
            |
| 15 | 
                -//public typealias Request = Parsable & Resource  | 
            |
| 16 | 
                -  | 
            |
| 17 | 13 | 
                 class NetworkApi {
               | 
            
| 18 | 14 | 
                 | 
            
| 19 | 15 | 
                public static let share = NetworkApi()  | 
            
                @@ -83,13 +79,15 @@ class NetworkApi {
               | 
            ||
| 83 | 79 | 
                guard let json = json as? [String: AnyObject],  | 
            
| 84 | 80 | 
                let status = json["status"] as? Int,  | 
            
| 85 | 81 | 
                                             let data = resource.parse(json) else {
               | 
            
| 82 | 
                + Toast.show(message: "解析失败")  | 
            |
| 86 | 83 | 
                observer(.error(ParseError()))  | 
            
| 87 | 84 | 
                return  | 
            
| 88 | 85 | 
                }  | 
            
| 89 | 86 | 
                                         if status == 200 {
               | 
            
| 90 | 87 | 
                observer(.success(data))  | 
            
| 91 | 88 | 
                                         } else {
               | 
            
| 92 | 
                - observer(.error(InteractionError(id: status, errMessage: "")))  | 
            |
| 89 | 
                + Toast.show(message: (json["description"] as? String) ?? "")  | 
            |
| 90 | 
                + observer(.error(BusinessError(id: status)))  | 
            |
| 93 | 91 | 
                }  | 
            
| 94 | 92 | 
                 | 
            
| 95 | 93 | 
                case .failure(let error):  | 
            
                @@ -1,42 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// Result.swift  | 
            |
| 3 | 
                -// PaiAi  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by ffib on 2018/12/4.  | 
            |
| 6 | 
                -// Copyright © 2018 yb. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import Foundation  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -enum Result<A> {
               | 
            |
| 12 | 
                - case error(Error)  | 
            |
| 13 | 
                - case success(A)  | 
            |
| 14 | 
                -  | 
            |
| 15 | 
                -    init(_ value: A?, or: @autoclosure () -> Error) {
               | 
            |
| 16 | 
                -        if let x = value { self = .success(x) }
               | 
            |
| 17 | 
                -        else { self = .error(or()) }
               | 
            |
| 18 | 
                - }  | 
            |
| 19 | 
                -  | 
            |
| 20 | 
                -    func map<B>(_ f: (A) -> B) -> Result<B> {
               | 
            |
| 21 | 
                -        switch self {
               | 
            |
| 22 | 
                - case .error(let e): return .error(e)  | 
            |
| 23 | 
                - case .success(let x): return .success(f(x))  | 
            |
| 24 | 
                - }  | 
            |
| 25 | 
                - }  | 
            |
| 26 | 
                -  | 
            |
| 27 | 
                -    func flatMap<B>(_ f: (A) -> Result<B>) -> Result<B> {
               | 
            |
| 28 | 
                -        switch self {
               | 
            |
| 29 | 
                - case .error(let e): return .error(e)  | 
            |
| 30 | 
                - case .success(let x): return f(x)  | 
            |
| 31 | 
                - }  | 
            |
| 32 | 
                - }  | 
            |
| 33 | 
                -  | 
            |
| 34 | 
                -    func flatMap<B>(_ f: (A) -> B?, or e: Error) -> Result<B> {
               | 
            |
| 35 | 
                -        switch self {
               | 
            |
| 36 | 
                - case .error(let e): return .error(e)  | 
            |
| 37 | 
                - case .success(let x):  | 
            |
| 38 | 
                -            if let value = f(x) { return .success(value) }
               | 
            |
| 39 | 
                - return .error(e)  | 
            |
| 40 | 
                - }  | 
            |
| 41 | 
                - }  | 
            |
| 42 | 
                -}  | 
            
                @@ -25,12 +25,6 @@ struct StatusResource: Resource {
               | 
            ||
| 25 | 25 | 
                }  | 
            
| 26 | 26 | 
                 | 
            
| 27 | 27 | 
                     func getStatus() -> Completable {
               | 
            
| 28 | 
                -        return NetworkApi.share.post(resource: self).flatMapCompletable({ (model) -> Completable in
               | 
            |
| 29 | 
                -            if model.status == 200 {
               | 
            |
| 30 | 
                - return Completable.empty()  | 
            |
| 31 | 
                -            } else {
               | 
            |
| 32 | 
                - return Completable.error(InteractionError(id: model.status, errMessage: model.description))  | 
            |
| 33 | 
                - }  | 
            |
| 34 | 
                - })  | 
            |
| 28 | 
                + return NetworkApi.share.post(resource: self).asCompletable()  | 
            |
| 35 | 29 | 
                }  | 
            
| 36 | 30 | 
                }  | 
            
                @@ -28,6 +28,8 @@ public class MessageListViewModel {
               | 
            ||
| 28 | 28 | 
                private var _showMessage = PublishSubject<String>()  | 
            
| 29 | 29 | 
                private var items = BehaviorRelay<[MessageListItem]>(value: [])  | 
            
| 30 | 30 | 
                 | 
            
| 31 | 
                + public var messageReaded = BehaviorRelay<Bool>(value: false)  | 
            |
| 32 | 
                +  | 
            |
| 31 | 33 | 
                public weak var delegate: MessageListViewModelDelegate?  | 
            
| 32 | 34 | 
                 | 
            
| 33 | 35 | 
                     public var isEmpty: Observable<Bool> {
               | 
            
                @@ -55,6 +57,8 @@ public class MessageListViewModel {
               | 
            ||
| 55 | 57 | 
                     public init(type: MessageType) {
               | 
            
| 56 | 58 | 
                self.repository = MessageRepository()  | 
            
| 57 | 59 | 
                self.type = type  | 
            
| 60 | 
                +  | 
            |
| 61 | 
                + readed()  | 
            |
| 58 | 62 | 
                }  | 
            
| 59 | 63 | 
                 | 
            
| 60 | 64 | 
                     public func reload() {
               | 
            
                @@ -65,7 +69,6 @@ public class MessageListViewModel {
               | 
            ||
| 65 | 69 | 
                                 guard let `self` = self else { return }
               | 
            
| 66 | 70 | 
                self._hasMoreData.onNext(model.hasMore)  | 
            
| 67 | 71 | 
                self._isEmpty.accept(!model.data.isEmpty)  | 
            
| 68 | 
                -  | 
            |
| 69 | 72 | 
                self.items.accept(model.data)  | 
            
| 70 | 73 | 
                                 }, onDisposed: {[weak self] in
               | 
            
| 71 | 74 | 
                                     guard let `self` = self else { return }
               | 
            
                @@ -96,12 +99,7 @@ public class MessageListViewModel {
               | 
            ||
| 96 | 99 | 
                _items.remove(at: index)  | 
            
| 97 | 100 | 
                self.items.accept(_items)  | 
            
| 98 | 101 | 
                                 self._showMessage.onNext("删除成功")
               | 
            
| 99 | 
                -            }) { (error) in
               | 
            |
| 100 | 
                -                guard let error = error as? InteractionError else {
               | 
            |
| 101 | 
                - return  | 
            |
| 102 | 
                - }  | 
            |
| 103 | 
                - self._showMessage.onNext(error.errMessage)  | 
            |
| 104 | 
                - }.disposed(by: disposeBag)  | 
            |
| 102 | 
                + }).disposed(by: disposeBag)  | 
            |
| 105 | 103 | 
                }  | 
            
| 106 | 104 | 
                 | 
            
| 107 | 105 | 
                     public func removeAll() {
               | 
            
                @@ -109,17 +107,15 @@ public class MessageListViewModel {
               | 
            ||
| 109 | 107 | 
                             .subscribe(onCompleted: {[weak self] in
               | 
            
| 110 | 108 | 
                                 guard let `self` = self else { return }
               | 
            
| 111 | 109 | 
                self.items.accept([])  | 
            
| 110 | 
                + self._isEmpty.accept(false)  | 
            |
| 112 | 111 | 
                                 self._showMessage.onNext("删除成功")
               | 
            
| 113 | 
                -            }) { (error) in
               | 
            |
| 114 | 
                -                guard let error = error as? InteractionError else {
               | 
            |
| 115 | 
                - return  | 
            |
| 116 | 
                - }  | 
            |
| 117 | 
                - self._showMessage.onNext(error.errMessage)  | 
            |
| 118 | 
                - }.disposed(by: disposeBag)  | 
            |
| 112 | 
                + }).disposed(by: disposeBag)  | 
            |
| 119 | 113 | 
                }  | 
            
| 120 | 114 | 
                 | 
            
| 121 | 115 | 
                     public func readed() {
               | 
            
| 122 | 
                -  | 
            |
| 116 | 
                +        repository.readed(type).subscribe(onCompleted: {
               | 
            |
| 117 | 
                + self.messageReaded.accept(false)  | 
            |
| 118 | 
                + }).disposed(by: disposeBag)  | 
            |
| 123 | 119 | 
                }  | 
            
| 124 | 120 | 
                 | 
            
| 125 | 121 | 
                     public func didSelect(item: MessageListItem) {
               | 
            
                @@ -94,12 +94,7 @@ public class MineGroupViewModel {
               | 
            ||
| 94 | 94 | 
                _items.remove(at: index)  | 
            
| 95 | 95 | 
                self.items.accept(_items)  | 
            
| 96 | 96 | 
                                 self._showMessage.onNext("删除成功")
               | 
            
| 97 | 
                -            }) { (error) in
               | 
            |
| 98 | 
                -                guard let error = error as? InteractionError else {
               | 
            |
| 99 | 
                - return  | 
            |
| 100 | 
                - }  | 
            |
| 101 | 
                - self._showMessage.onNext(error.errMessage)  | 
            |
| 102 | 
                - }.disposed(by: disposeBag)  | 
            |
| 97 | 
                + }).disposed(by: disposeBag)  | 
            |
| 103 | 98 | 
                }  | 
            
| 104 | 99 | 
                 | 
            
| 105 | 100 | 
                     public func didSelect(_ item: GroupItem) {
               | 
            
                @@ -1,5 +1,5 @@  | 
            ||
| 1 | 1 | 
                //  | 
            
| 2 | 
                -// DataError.swift  | 
            |
| 2 | 
                +// Error.swift  | 
            |
| 3 | 3 | 
                // PaiaiDataKit  | 
            
| 4 | 4 | 
                //  | 
            
| 5 | 5 | 
                // Created by ffib on 2019/1/21.  | 
            
                @@ -8,7 +8,8 @@  | 
            ||
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import Foundation  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 
                -public struct InteractionError: Error {
               | 
            |
| 11 | 
                +public struct BusinessError: Error {
               | 
            |
| 12 | 12 | 
                public var id: Int  | 
            
| 13 | 
                - public var errMessage: String  | 
            |
| 14 | 13 | 
                }  | 
            
| 14 | 
                +  | 
            |
| 15 | 
                +public struct ParseError: Error {}
               | 
            
                @@ -6,7 +6,7 @@  | 
            ||
| 6 | 6 | 
                // Copyright © 2019 yb. All rights reserved.  | 
            
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 
                -import Foundation  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                 class FadeToastAnimator: ToastAnimator {
               | 
            
| 12 | 12 | 
                     func toastIn(in view: UIView, completion: ((Bool) -> Void)?) {
               | 
            
                @@ -6,7 +6,7 @@  | 
            ||
| 6 | 6 | 
                // Copyright © 2019 yb. All rights reserved.  | 
            
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 
                -import Foundation  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                private let globalInstance = Toast()  | 
            
| 12 | 12 | 
                 | 
            
                @@ -6,7 +6,7 @@  | 
            ||
| 6 | 6 | 
                // Copyright © 2019 yb. All rights reserved.  | 
            
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 
                -import Foundation  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                 public protocol ToastAnimator {
               | 
            
| 12 | 12 | 
                func toastIn(in view: UIView, completion: ((Bool) -> Void)?)  | 
            
                @@ -6,7 +6,7 @@  | 
            ||
| 6 | 6 | 
                // Copyright © 2019 yb. All rights reserved.  | 
            
| 7 | 7 | 
                //  | 
            
| 8 | 8 | 
                 | 
            
| 9 | 
                -import Foundation  | 
            |
| 9 | 
                +import UIKit  | 
            |
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                 public struct ToastOption {
               | 
            
| 12 | 12 | 
                var tintColor: UIColor = UIColor.white  | 
            
                @@ -8,7 +8,7 @@  | 
            ||
| 8 | 8 | 
                 | 
            
| 9 | 9 | 
                import UIKit  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 
                -class ToastView: NiblessView {
               | 
            |
| 11 | 
                +class ToastView: UIView {
               | 
            |
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                fileprivate var option: ToastOption  | 
            
| 14 | 14 | 
                fileprivate var toastType: Toast.ToastType  | 
            
                @@ -34,6 +34,11 @@ class ToastView: NiblessView {
               | 
            ||
| 34 | 34 | 
                initProperty()  | 
            
| 35 | 35 | 
                }  | 
            
| 36 | 36 | 
                 | 
            
| 37 | 
                + @available(*, unavailable, message: "Loading this view from a nib is unsupported")  | 
            |
| 38 | 
                +    public required init?(coder aDecoder: NSCoder) {
               | 
            |
| 39 | 
                +        fatalError("Loading this view from a nib is unsupported")
               | 
            |
| 40 | 
                + }  | 
            |
| 41 | 
                +  | 
            |
| 37 | 42 | 
                     private func initProperty() {
               | 
            
| 38 | 43 | 
                alpha = 0  | 
            
| 39 | 44 | 
                layer.cornerRadius = 5  | 
            
                @@ -40,6 +40,12 @@ public extension UIImage {
               | 
            ||
| 40 | 40 | 
                resizingMode: .stretch)  | 
            
| 41 | 41 | 
                }  | 
            
| 42 | 42 | 
                 | 
            
| 43 | 
                +        public static var right: UIImage? {
               | 
            |
| 44 | 
                + return UIImage(named: "navigation-right")?.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),  | 
            |
| 45 | 
                + resizingMode: .stretch)  | 
            |
| 46 | 
                + }  | 
            |
| 47 | 
                +  | 
            |
| 48 | 
                +  | 
            |
| 43 | 49 | 
                         public static var verticalPoints: UIImage? {
               | 
            
| 44 | 50 | 
                return UIImage(named: "navigation-vertical-points")?.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),  | 
            
| 45 | 51 | 
                resizingMode: .stretch)  | 
            
                @@ -90,9 +90,9 @@ extension UITextView: UITextViewDelegate {
               | 
            ||
| 90 | 90 | 
                /// Resize the placeholder UILabel to make sure it's in the same position as the UITextView text  | 
            
| 91 | 91 | 
                     private func resizePlaceholder() {
               | 
            
| 92 | 92 | 
                         if let placeholderLabel = viewWithTag(1000001) as! UILabel? {
               | 
            
| 93 | 
                - let labelX = self.textContainer.lineFragmentPadding  | 
            |
| 94 | 
                - let labelY = self.textContainerInset.top - 2  | 
            |
| 95 | 
                - let labelWidth = self.frame.width - (labelX * 2)  | 
            |
| 93 | 
                + let labelX = textContainer.lineFragmentPadding + textContainerInset.left  | 
            |
| 94 | 
                + let labelY = textContainerInset.top - 2  | 
            |
| 95 | 
                + let labelWidth = frame.width - (labelX * 2)  | 
            |
| 96 | 96 | 
                let labelHeight = placeholderLabel.frame.height  | 
            
| 97 | 97 | 
                 | 
            
| 98 | 98 | 
                placeholderLabel.frame = CGRect(x: labelX, y: labelY, width: labelWidth, height: labelHeight)  | 
            
                @@ -115,25 +115,6 @@ extension UITextView: UITextViewDelegate {
               | 
            ||
| 115 | 115 | 
                }  | 
            
| 116 | 116 | 
                }  | 
            
| 117 | 117 | 
                 | 
            
| 118 | 
                -  | 
            |
| 119 | 
                -extension UITextView {
               | 
            |
| 120 | 
                -  | 
            |
| 121 | 
                -    private struct AssociatedKeys {
               | 
            |
| 122 | 
                - static var adaptiveHeightKey = "UITextView.adaptiveHeightKey"  | 
            |
| 123 | 
                - }  | 
            |
| 124 | 
                -  | 
            |
| 125 | 
                -//    public var isAdaptiveHeight: Bool {
               | 
            |
| 126 | 
                -//        get {
               | 
            |
| 127 | 
                -//            return associatedObject(key: &AssociatedKeys.adaptiveHeightKey, initialiser: { () -> Bool in
               | 
            |
| 128 | 
                -// return false  | 
            |
| 129 | 
                -// })  | 
            |
| 130 | 
                -// }  | 
            |
| 131 | 
                -//        set {
               | 
            |
| 132 | 
                -// associateObject(key: &AssociatedKeys.adaptiveHeightKey, value: newValue)  | 
            |
| 133 | 
                -// }  | 
            |
| 134 | 
                -// }  | 
            |
| 135 | 
                -}  | 
            |
| 136 | 
                -  | 
            |
| 137 | 118 | 
                // scroll  | 
            
| 138 | 119 | 
                 extension UITextView {
               | 
            
| 139 | 120 | 
                 | 
            
                @@ -1,187 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// FFAlertController.swift  | 
            |
| 3 | 
                -// FFAlert  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by FFIB on 2017/11/13.  | 
            |
| 6 | 
                -// Copyright © 2017年 FFIB. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -//public enum FFAlertStyle {
               | 
            |
| 12 | 
                -// case actionSheet  | 
            |
| 13 | 
                -// case alert  | 
            |
| 14 | 
                -//}  | 
            |
| 15 | 
                -//  | 
            |
| 16 | 
                -//public class FFAlertController: UIViewController {
               | 
            |
| 17 | 
                -//  | 
            |
| 18 | 
                -//// private  | 
            |
| 19 | 
                -// private var transitionDelegate: FFTransitioning  | 
            |
| 20 | 
                -// private var alert: UIView & FFAlertRepresentable  | 
            |
| 21 | 
                -//  | 
            |
| 22 | 
                -// public var alertStyle: FFAlertStyle  | 
            |
| 23 | 
                -//    public var contentEdgeInsets: UIEdgeInsets {
               | 
            |
| 24 | 
                -//        get { return self.alert.contentEdgInsets }
               | 
            |
| 25 | 
                -//        set { alert.contentEdgInsets = newValue }
               | 
            |
| 26 | 
                -// }  | 
            |
| 27 | 
                -//  | 
            |
| 28 | 
                -//    public var attributedTitle: NSAttributedString? {
               | 
            |
| 29 | 
                -//        get { return self.alert.title }
               | 
            |
| 30 | 
                -//        set { self.alert.title = newValue }
               | 
            |
| 31 | 
                -// }  | 
            |
| 32 | 
                -//  | 
            |
| 33 | 
                -//    public var attributedMessage: NSAttributedString? {
               | 
            |
| 34 | 
                -//        get { return self.alert.message }
               | 
            |
| 35 | 
                -//        set { self.alert.message = newValue }
               | 
            |
| 36 | 
                -// }  | 
            |
| 37 | 
                -//  | 
            |
| 38 | 
                -//    public override var title: String? {
               | 
            |
| 39 | 
                -//        get { return attributedTitle?.string }
               | 
            |
| 40 | 
                -//        set { attributedTitle = NSAttributedString(string: newValue ?? "", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: UIColor.init(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)]) }
               | 
            |
| 41 | 
                -// }  | 
            |
| 42 | 
                -//  | 
            |
| 43 | 
                -//    public var message: String? {
               | 
            |
| 44 | 
                -//        get { return attributedMessage?.string }
               | 
            |
| 45 | 
                -//        set { attributedMessage = NSAttributedString(string: newValue ?? "", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.init(red: 0.6, green: 0.6, blue: 0.6, alpha: 1.0)]) }
               | 
            |
| 46 | 
                -// }  | 
            |
| 47 | 
                -//  | 
            |
| 48 | 
                -//    private var alertActions: [FFAlertAction] {
               | 
            |
| 49 | 
                -//        get { return alert.alertActions }
               | 
            |
| 50 | 
                -//        set { alert.alertActions = newValue }
               | 
            |
| 51 | 
                -// }  | 
            |
| 52 | 
                -//  | 
            |
| 53 | 
                -//    public var alertEdgInsets: (left: CGFloat, right: CGFloat) {
               | 
            |
| 54 | 
                -//        get { return alert.edgInsets }
               | 
            |
| 55 | 
                -//        set { alert.edgInsets = newValue }
               | 
            |
| 56 | 
                -// }  | 
            |
| 57 | 
                -//  | 
            |
| 58 | 
                -// convenience init(title: String? = nil, message: String? = nil,  | 
            |
| 59 | 
                -// customView: UIView,  | 
            |
| 60 | 
                -//                     alertStyle: FFAlertStyle = .alert) {
               | 
            |
| 61 | 
                -// self.init(alertStyle: alertStyle)  | 
            |
| 62 | 
                -// self.alert.contentView = customView  | 
            |
| 63 | 
                -// self.title = title  | 
            |
| 64 | 
                -// self.message = message  | 
            |
| 65 | 
                -// }  | 
            |
| 66 | 
                -//  | 
            |
| 67 | 
                -// convenience init(title: String? = nil, message: String? = nil,  | 
            |
| 68 | 
                -//                     alertStyle: FFAlertStyle = .alert) {
               | 
            |
| 69 | 
                -// self.init(alertStyle: alertStyle)  | 
            |
| 70 | 
                -// self.title = title  | 
            |
| 71 | 
                -// self.message = message  | 
            |
| 72 | 
                -//  | 
            |
| 73 | 
                -// }  | 
            |
| 74 | 
                -//  | 
            |
| 75 | 
                -// convenience init(attributedTitle: NSAttributedString? = nil,  | 
            |
| 76 | 
                -// attributedMessage: NSAttributedString? = nil,  | 
            |
| 77 | 
                -//                     alertStyle: FFAlertStyle = .alert) {
               | 
            |
| 78 | 
                -// self.init(alertStyle: alertStyle)  | 
            |
| 79 | 
                -// self.attributedTitle = attributedTitle  | 
            |
| 80 | 
                -// self.attributedMessage = attributedMessage  | 
            |
| 81 | 
                -// }  | 
            |
| 82 | 
                -//  | 
            |
| 83 | 
                -//    private init(alertStyle: FFAlertStyle) {
               | 
            |
| 84 | 
                -//        switch alertStyle {
               | 
            |
| 85 | 
                -// case .alert:  | 
            |
| 86 | 
                -// self.alert = FFAlertView()  | 
            |
| 87 | 
                -// case .actionSheet:  | 
            |
| 88 | 
                -// self.alert = FFSheetView()  | 
            |
| 89 | 
                -// }  | 
            |
| 90 | 
                -// self.alertStyle = alertStyle  | 
            |
| 91 | 
                -// self.transitionDelegate = FFTransitioning(alertStyle: alertStyle)  | 
            |
| 92 | 
                -// super.init(nibName: nil, bundle: nil)  | 
            |
| 93 | 
                -// commonInit()  | 
            |
| 94 | 
                -// }  | 
            |
| 95 | 
                -//  | 
            |
| 96 | 
                -//    required public init?(coder aDecoder: NSCoder) {
               | 
            |
| 97 | 
                -//        fatalError("init(coder:) has not been implemented")
               | 
            |
| 98 | 
                -// }  | 
            |
| 99 | 
                -//  | 
            |
| 100 | 
                -//    private func commonInit() {
               | 
            |
| 101 | 
                -// self.modalPresentationStyle = .custom  | 
            |
| 102 | 
                -// self.transitioningDelegate = self.transitionDelegate  | 
            |
| 103 | 
                -// }  | 
            |
| 104 | 
                -//  | 
            |
| 105 | 
                -//    override public var preferredStatusBarStyle: UIStatusBarStyle {
               | 
            |
| 106 | 
                -// return presentingViewController?.preferredStatusBarStyle ?? .default  | 
            |
| 107 | 
                -// }  | 
            |
| 108 | 
                -//  | 
            |
| 109 | 
                -//    override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
               | 
            |
| 110 | 
                -// return presentingViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations  | 
            |
| 111 | 
                -// }  | 
            |
| 112 | 
                -//  | 
            |
| 113 | 
                -//    override public func viewDidLoad() {
               | 
            |
| 114 | 
                -// super.viewDidLoad()  | 
            |
| 115 | 
                -// configurationOfAlertView()  | 
            |
| 116 | 
                -// let tap = UITapGestureRecognizer(target: self, action: #selector(disappear))  | 
            |
| 117 | 
                -// tap.delegate = self  | 
            |
| 118 | 
                -// view.addGestureRecognizer(tap)  | 
            |
| 119 | 
                -// }  | 
            |
| 120 | 
                -//  | 
            |
| 121 | 
                -// @objc  | 
            |
| 122 | 
                -//    func disappear() {
               | 
            |
| 123 | 
                -// dismiss(animated: true, completion: nil)  | 
            |
| 124 | 
                -// }  | 
            |
| 125 | 
                -//  | 
            |
| 126 | 
                -//    func configurationOfAlertView() {
               | 
            |
| 127 | 
                -// view.addSubview(alert)  | 
            |
| 128 | 
                -// alert.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 129 | 
                -// alert.backgroundColor = UIColor.white  | 
            |
| 130 | 
                -//        switch alertStyle {
               | 
            |
| 131 | 
                -// case .actionSheet:  | 
            |
| 132 | 
                -// NSLayoutConstraint.activate(  | 
            |
| 133 | 
                -// [NSLayoutConstraint(item: alert, attribute: .leading,  | 
            |
| 134 | 
                -// relatedBy: .equal,  | 
            |
| 135 | 
                -// toItem: view, attribute: .leading,  | 
            |
| 136 | 
                -// multiplier: 1, constant: alertEdgInsets.left),  | 
            |
| 137 | 
                -// NSLayoutConstraint(item: alert, attribute: .bottom,  | 
            |
| 138 | 
                -// relatedBy: .equal,  | 
            |
| 139 | 
                -// toItem: view, attribute: .bottom,  | 
            |
| 140 | 
                -// multiplier: 1, constant: 0),  | 
            |
| 141 | 
                -// NSLayoutConstraint(item: alert, attribute: .trailing,  | 
            |
| 142 | 
                -// relatedBy: .equal,  | 
            |
| 143 | 
                -// toItem: view, attribute: .trailing,  | 
            |
| 144 | 
                -// multiplier: 1, constant: -alertEdgInsets.right),  | 
            |
| 145 | 
                -// NSLayoutConstraint(item: alert, attribute: .height,  | 
            |
| 146 | 
                -// relatedBy: .lessThanOrEqual,  | 
            |
| 147 | 
                -// toItem: view, attribute: .height,  | 
            |
| 148 | 
                -// multiplier: 1, constant: 0)]  | 
            |
| 149 | 
                -// )  | 
            |
| 150 | 
                -// alert.setContentCompressionResistancePriority(.required, for: .vertical)  | 
            |
| 151 | 
                -// case .alert:  | 
            |
| 152 | 
                -// NSLayoutConstraint.activate(  | 
            |
| 153 | 
                -// [NSLayoutConstraint(item: alert, attribute: .leading,  | 
            |
| 154 | 
                -// relatedBy: .equal,  | 
            |
| 155 | 
                -// toItem: view, attribute: .leading,  | 
            |
| 156 | 
                -// multiplier: 1, constant: alertEdgInsets.left),  | 
            |
| 157 | 
                -// NSLayoutConstraint(item: alert, attribute: .centerY,  | 
            |
| 158 | 
                -// relatedBy: .equal,  | 
            |
| 159 | 
                -// toItem: view, attribute: .centerY,  | 
            |
| 160 | 
                -// multiplier: 1, constant: 0),  | 
            |
| 161 | 
                -// NSLayoutConstraint(item: alert, attribute: .trailing,  | 
            |
| 162 | 
                -// relatedBy: .equal,  | 
            |
| 163 | 
                -// toItem: view, attribute: .trailing,  | 
            |
| 164 | 
                -// multiplier: 1, constant: -alertEdgInsets.right),  | 
            |
| 165 | 
                -// NSLayoutConstraint(item: alert, attribute: .height,  | 
            |
| 166 | 
                -// relatedBy: .lessThanOrEqual,  | 
            |
| 167 | 
                -// toItem: view, attribute: .height,  | 
            |
| 168 | 
                -// multiplier: 1, constant: 0)]  | 
            |
| 169 | 
                -// )  | 
            |
| 170 | 
                -// alert.setContentCompressionResistancePriority(.required, for: .vertical)  | 
            |
| 171 | 
                -// }  | 
            |
| 172 | 
                -//  | 
            |
| 173 | 
                -// }  | 
            |
| 174 | 
                -//  | 
            |
| 175 | 
                -//    func addAlertAction(alertAction: FFAlertAction) {
               | 
            |
| 176 | 
                -// alertActions.append(alertAction)  | 
            |
| 177 | 
                -// }  | 
            |
| 178 | 
                -//}  | 
            |
| 179 | 
                -//  | 
            |
| 180 | 
                -//extension FFAlertController: UIGestureRecognizerDelegate {
               | 
            |
| 181 | 
                -//    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
               | 
            |
| 182 | 
                -//        if alert.frame.contains(touch.location(in: view)) {
               | 
            |
| 183 | 
                -// return false  | 
            |
| 184 | 
                -// }  | 
            |
| 185 | 
                -// return true  | 
            |
| 186 | 
                -// }  | 
            |
| 187 | 
                -//}  | 
            
                @@ -1,21 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// FFAlertControllerRepresentable.swift  | 
            |
| 3 | 
                -// FFAlert  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by FFIB on 2017/11/17.  | 
            |
| 6 | 
                -// Copyright © 2017年 FFIB. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -//protocol FFAlertRepresentable {
               | 
            |
| 12 | 
                -//    var titleLabel: FFAlertLabel { get set }
               | 
            |
| 13 | 
                -//    var messageLabel: FFAlertLabel { get set }
               | 
            |
| 14 | 
                -//    var contentView: UIView? { get set }
               | 
            |
| 15 | 
                -//    var alertActions: [FFAlertAction] { get set }
               | 
            |
| 16 | 
                -//    var contentEdgInsets: UIEdgeInsets { get set }
               | 
            |
| 17 | 
                -//    var title: NSAttributedString? { get set }
               | 
            |
| 18 | 
                -//    var message: NSAttributedString? { get set }
               | 
            |
| 19 | 
                -//    var contentHeight: CGFloat { get set }
               | 
            |
| 20 | 
                -//    var edgInsets: (left: CGFloat, right: CGFloat) { get set }
               | 
            |
| 21 | 
                -//}  | 
            
                @@ -1,29 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// FFAlertLabel.swift  | 
            |
| 3 | 
                -// FFAlert  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by FFIB on 2017/11/14.  | 
            |
| 6 | 
                -// Copyright © 2017年 FFIB. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -class FFAlertLabel: UILabel {
               | 
            |
| 12 | 
                -  | 
            |
| 13 | 
                -    override var attributedText: NSAttributedString? {
               | 
            |
| 14 | 
                -        didSet {
               | 
            |
| 15 | 
                - sizeToFit()  | 
            |
| 16 | 
                - }  | 
            |
| 17 | 
                - }  | 
            |
| 18 | 
                -  | 
            |
| 19 | 
                -    init() {
               | 
            |
| 20 | 
                - super.init(frame: CGRect.zero)  | 
            |
| 21 | 
                - self.textAlignment = .center  | 
            |
| 22 | 
                - self.numberOfLines = 0  | 
            |
| 23 | 
                - self.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 24 | 
                - }  | 
            |
| 25 | 
                -  | 
            |
| 26 | 
                -    required init?(coder aDecoder: NSCoder) {
               | 
            |
| 27 | 
                - super.init(coder: aDecoder)  | 
            |
| 28 | 
                - }  | 
            |
| 29 | 
                -}  | 
            
                @@ -1,41 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// FFSheetActionCell.swift  | 
            |
| 3 | 
                -// FFAlert  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by FFIB on 2017/11/17.  | 
            |
| 6 | 
                -// Copyright © 2017年 FFIB. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -//class FFSheetActionCell: UITableViewCell {
               | 
            |
| 12 | 
                -//  | 
            |
| 13 | 
                -// var label = UILabel()  | 
            |
| 14 | 
                -//  | 
            |
| 15 | 
                -//    func setInfo(alertAction: FFAlertAction) {
               | 
            |
| 16 | 
                -// addSubview(label)  | 
            |
| 17 | 
                -// label.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 18 | 
                -// label.attributedText = alertAction.attributedTitle  | 
            |
| 19 | 
                -// label.backgroundColor = alertAction.backgroundColor  | 
            |
| 20 | 
                -// label.textAlignment = .center  | 
            |
| 21 | 
                -// let actionEdgInsets = alertAction.contentEdgInsets ?? UIEdgeInsets.zero  | 
            |
| 22 | 
                -// NSLayoutConstraint.activate(  | 
            |
| 23 | 
                -// [NSLayoutConstraint(item: label, attribute: .leading,  | 
            |
| 24 | 
                -// relatedBy: .equal,  | 
            |
| 25 | 
                -// toItem: self, attribute: .leading,  | 
            |
| 26 | 
                -// multiplier: 1, constant: actionEdgInsets.left),  | 
            |
| 27 | 
                -// NSLayoutConstraint(item: label, attribute: .trailing,  | 
            |
| 28 | 
                -// relatedBy: .equal,  | 
            |
| 29 | 
                -// toItem: self, attribute: .trailing,  | 
            |
| 30 | 
                -// multiplier: 1, constant: -actionEdgInsets.right),  | 
            |
| 31 | 
                -// NSLayoutConstraint(item: label, attribute: .top,  | 
            |
| 32 | 
                -// relatedBy: .equal,  | 
            |
| 33 | 
                -// toItem: self, attribute: .top,  | 
            |
| 34 | 
                -// multiplier: 1, constant: actionEdgInsets.top),  | 
            |
| 35 | 
                -// NSLayoutConstraint(item: label, attribute: .bottom,  | 
            |
| 36 | 
                -// relatedBy: .equal,  | 
            |
| 37 | 
                -// toItem: self, attribute: .bottom,  | 
            |
| 38 | 
                -// multiplier: 1, constant: -actionEdgInsets.bottom - 6)]  | 
            |
| 39 | 
                -// )  | 
            |
| 40 | 
                -// }  | 
            |
| 41 | 
                -//}  | 
            
                @@ -31,6 +31,7 @@ public final class ActionSheetView: UIView {
               | 
            ||
| 31 | 31 | 
                         guard viewNotReady else { return }
               | 
            
| 32 | 32 | 
                constructViewHierarchy()  | 
            
| 33 | 33 | 
                activateConstraints()  | 
            
| 34 | 
                + installTarget()  | 
            |
| 34 | 35 | 
                backgroundColor = UIColor(r: 153, g: 153, b: 153)  | 
            
| 35 | 36 | 
                viewNotReady = false  | 
            
| 36 | 37 | 
                }  | 
            
                @@ -58,6 +59,36 @@ public final class ActionSheetView: UIView {
               | 
            ||
| 58 | 59 | 
                _cancelItem = action.style.item  | 
            
| 59 | 60 | 
                }  | 
            
| 60 | 61 | 
                }  | 
            
| 62 | 
                +  | 
            |
| 63 | 
                +    private func installTarget() {
               | 
            |
| 64 | 
                +        if cancelAction != nil {
               | 
            |
| 65 | 
                + _cancelItem?.addTarget(self, action: #selector(cancelAction(btn:)), for: .touchUpInside)  | 
            |
| 66 | 
                + }  | 
            |
| 67 | 
                +  | 
            |
| 68 | 
                +        for (i, item) in _alertItems.enumerated() {
               | 
            |
| 69 | 
                + item.sign = i  | 
            |
| 70 | 
                + item.addTarget(self, action: #selector(alertAction), for: .touchUpInside)  | 
            |
| 71 | 
                + }  | 
            |
| 72 | 
                + }  | 
            |
| 73 | 
                +  | 
            |
| 74 | 
                +    @objc private func alertAction(btn: UIButton) {
               | 
            |
| 75 | 
                +        guard let alertItem = btn as? AlertItem else { return }
               | 
            |
| 76 | 
                + alertActions[alertItem.sign].handler?(alertItem)  | 
            |
| 77 | 
                +  | 
            |
| 78 | 
                + dismissSuperViewController()  | 
            |
| 79 | 
                + }  | 
            |
| 80 | 
                +  | 
            |
| 81 | 
                +    @objc private func cancelAction(btn: UIButton) {
               | 
            |
| 82 | 
                +        guard let cancelItem = _cancelItem else { return }
               | 
            |
| 83 | 
                + cancelAction?.handler?(cancelItem)  | 
            |
| 84 | 
                +  | 
            |
| 85 | 
                + dismissSuperViewController()  | 
            |
| 86 | 
                + }  | 
            |
| 87 | 
                +  | 
            |
| 88 | 
                +    private func dismissSuperViewController() {
               | 
            |
| 89 | 
                +        guard let vc = getSuperViewController() else { return }
               | 
            |
| 90 | 
                + vc.dismissController()  | 
            |
| 91 | 
                + }  | 
            |
| 61 | 92 | 
                }  | 
            
| 62 | 93 | 
                 | 
            
| 63 | 94 | 
                /// MARK:  | 
            
                @@ -9,6 +9,7 @@  | 
            ||
| 9 | 9 | 
                import UIKit  | 
            
| 10 | 10 | 
                 | 
            
| 11 | 11 | 
                 public class AlertItem: UIButton {
               | 
            
| 12 | 
                + var sign = 0  | 
            |
| 12 | 13 | 
                 | 
            
| 13 | 14 | 
                     public override init(frame: CGRect) {
               | 
            
| 14 | 15 | 
                super.init(frame: frame)  | 
            
                @@ -1,32 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// FFProgress.swift  | 
            |
| 3 | 
                -// PaiAi  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by zhengjianfei on 2017/3/22.  | 
            |
| 6 | 
                -// Copyright © 2017年 FFIB. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -class FFProgress: UIView {
               | 
            |
| 12 | 
                - @IBInspectable var lineColor = UIColor.red  | 
            |
| 13 | 
                - @IBInspectable var lineWidth: CGFloat = 6  | 
            |
| 14 | 
                - let progressLayer = CAShapeLayer()  | 
            |
| 15 | 
                -    var strokeEnd: CGFloat = 0.0 {
               | 
            |
| 16 | 
                -        didSet {
               | 
            |
| 17 | 
                - progressLayer.strokeEnd = strokeEnd  | 
            |
| 18 | 
                - }  | 
            |
| 19 | 
                - }  | 
            |
| 20 | 
                -  | 
            |
| 21 | 
                -    override func draw(_ rect: CGRect) {
               | 
            |
| 22 | 
                - let bezierPath = UIBezierPath(arcCenter:CGPoint(x: self.width / 2, y: self.height / 2), radius: self.width / 2, startAngle: .pi / 180.0, endAngle: .pi / -2.0, clockwise: true)  | 
            |
| 23 | 
                - progressLayer.frame = self.bounds  | 
            |
| 24 | 
                - progressLayer.fillColor = UIColor.clear.cgColor  | 
            |
| 25 | 
                - progressLayer.strokeColor = lineColor.cgColor  | 
            |
| 26 | 
                - progressLayer.lineCap = kCALineCapRound  | 
            |
| 27 | 
                - progressLayer.lineWidth = lineWidth  | 
            |
| 28 | 
                - progressLayer.strokeEnd = strokeEnd  | 
            |
| 29 | 
                - progressLayer.path = bezierPath.cgPath  | 
            |
| 30 | 
                - self.layer.addSublayer(progressLayer)  | 
            |
| 31 | 
                - }  | 
            |
| 32 | 
                -}  | 
            
                @@ -15,7 +15,7 @@ public extension GestureRecognizerDelegate where Self: UIViewController & Naviga  | 
            ||
| 15 | 15 | 
                gestureRecognizer.isKind(of: UIPanGestureRecognizer.self),  | 
            
| 16 | 16 | 
                             let pan = gestureRecognizer as? UIPanGestureRecognizer {
               | 
            
| 17 | 17 | 
                let point = pan.translation(in: self.view)  | 
            
| 18 | 
                -            if point.x > 0 {
               | 
            |
| 18 | 
                +            if point.x > 30 {
               | 
            |
| 19 | 19 | 
                return true  | 
            
| 20 | 20 | 
                }  | 
            
| 21 | 21 | 
                }  | 
            
                @@ -14,6 +14,8 @@ public protocol GestureRecognizerDelegate: class {
               | 
            ||
| 14 | 14 | 
                 | 
            
| 15 | 15 | 
                func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,  | 
            
| 16 | 16 | 
                shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool  | 
            
| 17 | 
                +  | 
            |
| 18 | 
                + func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool  | 
            |
| 17 | 19 | 
                }  | 
            
| 18 | 20 | 
                 | 
            
| 19 | 21 | 
                 public extension GestureRecognizerDelegate {
               | 
            
                @@ -26,4 +28,8 @@ public extension GestureRecognizerDelegate {
               | 
            ||
| 26 | 28 | 
                                            shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
               | 
            
| 27 | 29 | 
                return false  | 
            
| 28 | 30 | 
                }  | 
            
| 31 | 
                +  | 
            |
| 32 | 
                +    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
               | 
            |
| 33 | 
                + return true  | 
            |
| 34 | 
                + }  | 
            |
| 29 | 35 | 
                }  | 
            
                @@ -15,6 +15,11 @@ class GestureRecognizerProxy: NSObject, UIGestureRecognizerDelegate {
               | 
            ||
| 15 | 15 | 
                delegate = target  | 
            
| 16 | 16 | 
                }  | 
            
| 17 | 17 | 
                 | 
            
| 18 | 
                +    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
               | 
            |
| 19 | 
                +        guard let d = delegate else { return false }
               | 
            |
| 20 | 
                + return d.gestureRecognizerShouldBegin(gestureRecognizer)  | 
            |
| 21 | 
                + }  | 
            |
| 22 | 
                +  | 
            |
| 18 | 23 | 
                     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
               | 
            
| 19 | 24 | 
                         guard let d = delegate else { return false }
               | 
            
| 20 | 25 | 
                return d.gestureRecognizer(gestureRecognizer, shouldReceive: touch)  | 
            
                @@ -17,12 +17,6 @@ protocol Coordinator {}
               | 
            ||
| 17 | 17 | 
                 | 
            
| 18 | 18 | 
                 public final class AppCoordinator {
               | 
            
| 19 | 19 | 
                 | 
            
| 20 | 
                -    fileprivate enum CoordinatorKey: String {
               | 
            |
| 21 | 
                - case home = "home"  | 
            |
| 22 | 
                - case message = "message"  | 
            |
| 23 | 
                - case mine = "mine"  | 
            |
| 24 | 
                - }  | 
            |
| 25 | 
                -  | 
            |
| 26 | 20 | 
                var shareUserInfoViewModel = UserInfoViewModel()  | 
            
| 27 | 21 | 
                var containerViewController: ContainerViewController  | 
            
| 28 | 22 | 
                var navigationController: UINavigationController  | 
            
                @@ -0,0 +1,18 @@  | 
            ||
| 1 | 
                +//  | 
            |
| 2 | 
                +// CoordinatorKey.swift  | 
            |
| 3 | 
                +// Paiai_iOS  | 
            |
| 4 | 
                +//  | 
            |
| 5 | 
                +// Created by ffib on 2019/3/26.  | 
            |
| 6 | 
                +// Copyright © 2019 yb. All rights reserved.  | 
            |
| 7 | 
                +//  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +import Foundation  | 
            |
| 10 | 
                +  | 
            |
| 11 | 
                +enum CoordinatorKey: String {
               | 
            |
| 12 | 
                + case home = "home"  | 
            |
| 13 | 
                + case message = "message"  | 
            |
| 14 | 
                + case mine = "mine"  | 
            |
| 15 | 
                + case group = "group"  | 
            |
| 16 | 
                + case groupDetail = "groupDetail"  | 
            |
| 17 | 
                + case photoDetail = "photoDetail"  | 
            |
| 18 | 
                +}  | 
            
                @@ -30,7 +30,7 @@  | 
            ||
| 30 | 30 | 
                <constraint firstAttribute="height" constant="64" id="dza-Pq-ZRx"/>  | 
            
| 31 | 31 | 
                <constraint firstAttribute="width" constant="64" id="kEi-cK-cxH"/>  | 
            
| 32 | 32 | 
                </constraints>  | 
            
| 33 | 
                - <state key="normal" image="BTN-拍照"/>  | 
            |
| 33 | 
                + <state key="normal" image="BTN-camera"/>  | 
            |
| 34 | 34 | 
                <state key="selected" image="BTN-拍照-press"/>  | 
            
| 35 | 35 | 
                <connections>  | 
            
| 36 | 36 | 
                <action selector="takePhotoAction" destination="qPy-31-33I" eventType="touchUpInside" id="vIP-Gk-vDZ"/>  | 
            
                @@ -60,7 +60,7 @@  | 
            ||
| 60 | 60 | 
                </scene>  | 
            
| 61 | 61 | 
                </scenes>  | 
            
| 62 | 62 | 
                <resources>  | 
            
| 63 | 
                - <image name="BTN-拍照" width="168" height="168"/>  | 
            |
| 63 | 
                + <image name="BTN-camera" width="168" height="168"/>  | 
            |
| 64 | 64 | 
                <image name="BTN-拍照-press" width="16" height="16"/>  | 
            
| 65 | 65 | 
                </resources>  | 
            
| 66 | 66 | 
                </document>  | 
            
                @@ -14,7 +14,7 @@ class GroupCoordinator: Coordinator {
               | 
            ||
| 14 | 14 | 
                let navigationController: UINavigationController  | 
            
| 15 | 15 | 
                let groupViewController: GroupViewController  | 
            
| 16 | 16 | 
                 | 
            
| 17 | 
                - var coordinators: [String: Coordinator] = [:]  | 
            |
| 17 | 
                + var coordinators: [CoordinatorKey: Coordinator] = [:]  | 
            |
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                     init(_ groupVC: GroupViewController, navigationController: UINavigationController) {
               | 
            
| 20 | 20 | 
                self.groupViewController = groupVC  | 
            
                @@ -28,7 +28,7 @@ class GroupCoordinator: Coordinator {
               | 
            ||
| 28 | 28 | 
                 extension GroupCoordinator: GroupViewModelDelegate {
               | 
            
| 29 | 29 | 
                     func navigateToGroupDetail(_ item: GroupItem) {
               | 
            
| 30 | 30 | 
                let coordinator = GroupDetailCoordinator(makeGroupDetailViewController(item), navigationController: navigationController)  | 
            
| 31 | 
                - coordinators["groupDetail"] = coordinator  | 
            |
| 31 | 
                + coordinators[.groupDetail] = coordinator  | 
            |
| 32 | 32 | 
                 | 
            
| 33 | 33 | 
                navigationController.pushViewController(coordinator.groupDetailViewController)  | 
            
| 34 | 34 | 
                }  | 
            
                @@ -40,7 +40,7 @@ extension GroupCoordinator: GroupViewModelDelegate {
               | 
            ||
| 40 | 40 | 
                let coordinator = PhotoDetailCoordinator(ctl, nav: navigationController,  | 
            
| 41 | 41 | 
                viewModel: viewModel,  | 
            
| 42 | 42 | 
                listViewModel: PhotoDetailListViewModel(items: items, currIndex: currIndex))  | 
            
| 43 | 
                - coordinators["photoDetail"] = coordinator  | 
            |
| 43 | 
                + coordinators[.photoDetail] = coordinator  | 
            |
| 44 | 44 | 
                coordinator.start()  | 
            
| 45 | 45 | 
                navigationController.pushViewController(coordinator.photoDetailViewController)  | 
            
| 46 | 46 | 
                }  | 
            
                @@ -440,7 +440,7 @@  | 
            ||
| 440 | 440 | 
                <constraint firstAttribute="width" constant="33" id="Lao-Lp-1av"/>  | 
            
| 441 | 441 | 
                <constraint firstAttribute="height" constant="33" id="wB9-o4-baK"/>  | 
            
| 442 | 442 | 
                </constraints>  | 
            
| 443 | 
                - <state key="normal" title="Button" image="delete"/>  | 
            |
| 443 | 
                + <state key="normal" title="Button" image="BTN-delete"/>  | 
            |
| 444 | 444 | 
                <connections>  | 
            
| 445 | 445 | 
                <action selector="deleteMemberAction:" destination="DJ1-Ig-ZYH" eventType="touchUpInside" id="kwS-bB-js1"/>  | 
            
| 446 | 446 | 
                </connections>  | 
            
                @@ -490,7 +490,7 @@  | 
            ||
| 490 | 490 | 
                </scene>  | 
            
| 491 | 491 | 
                </scenes>  | 
            
| 492 | 492 | 
                <resources>  | 
            
| 493 | 
                - <image name="delete" width="66" height="66"/>  | 
            |
| 493 | 
                + <image name="BTN-delete" width="66" height="66"/>  | 
            |
| 494 | 494 | 
                <image name="list-QR" width="36" height="36"/>  | 
            
| 495 | 495 | 
                <image name="list-arrow" width="24" height="36"/>  | 
            
| 496 | 496 | 
                <image name="navigation-background" width="12" height="132"/>  | 
            
                @@ -66,7 +66,8 @@ final class GroupViewController: UIViewController {
               | 
            ||
| 66 | 66 | 
                 | 
            
| 67 | 67 | 
                     private func setupReloadControl() {
               | 
            
| 68 | 68 | 
                         collectionView.addPullToRefresh(PullToRefresh()) {
               | 
            
| 69 | 
                - [unowned self] in  | 
            |
| 69 | 
                + [weak self] in  | 
            |
| 70 | 
                +            guard let `self` = self else { return }
               | 
            |
| 70 | 71 | 
                self.viewModel.reload()  | 
            
| 71 | 72 | 
                }  | 
            
| 72 | 73 | 
                collectionView.startRefreshing(at: .top)  | 
            
                @@ -11,13 +11,6 @@ import PaiaiDataKit  | 
            ||
| 11 | 11 | 
                import PaiaiUIKit  | 
            
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                 class HomeCoordinator: Coordinator {
               | 
            
| 14 | 
                -    fileprivate enum CoordinatorKey: String {
               | 
            |
| 15 | 
                - case home = "home"  | 
            |
| 16 | 
                - case message = "message"  | 
            |
| 17 | 
                - case mine = "mine"  | 
            |
| 18 | 
                - case photoDetail = "photoDetail"  | 
            |
| 19 | 
                - case group = "group"  | 
            |
| 20 | 
                - }  | 
            |
| 21 | 14 | 
                fileprivate var coordinators = [CoordinatorKey: Coordinator]()  | 
            
| 22 | 15 | 
                 | 
            
| 23 | 16 | 
                var homeViewController: HomeViewController  | 
            
                @@ -53,7 +53,8 @@ final class HomeViewController: UIViewController {
               | 
            ||
| 53 | 53 | 
                 | 
            
| 54 | 54 | 
                     private func setupLoadingControl() {
               | 
            
| 55 | 55 | 
                         collectionView.addPullToRefresh(PullToRefresh(position: .bottom)) {
               | 
            
| 56 | 
                - [unowned self] in  | 
            |
| 56 | 
                + [weak self] in  | 
            |
| 57 | 
                +            guard let `self` = self else { return }
               | 
            |
| 57 | 58 | 
                self.viewModel.preload()  | 
            
| 58 | 59 | 
                }  | 
            
| 59 | 60 | 
                }  | 
            
                @@ -36,14 +36,14 @@  | 
            ||
| 36 | 36 | 
                <subviews>  | 
            
| 37 | 37 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rAd-6a-QN5">  | 
            
| 38 | 38 | 
                <rect key="frame" x="212" y="30" width="126" height="126"/>  | 
            
| 39 | 
                - <state key="normal" image="闪光灯-默认70%透明度,按压100%"/>  | 
            |
| 39 | 
                + <state key="normal" image="BTN-flash"/>  | 
            |
| 40 | 40 | 
                <connections>  | 
            
| 41 | 41 | 
                <action selector="openLight" destination="xAo-Yl-fd5" eventType="touchUpInside" id="S8Z-U4-bVm"/>  | 
            
| 42 | 42 | 
                </connections>  | 
            
| 43 | 43 | 
                </button>  | 
            
| 44 | 44 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WMh-c4-xbf">  | 
            
| 45 | 45 | 
                <rect key="frame" x="37" y="30" width="126" height="126"/>  | 
            
| 46 | 
                - <state key="normal" image="从相册选取-默认70%透明度,按压100%"/>  | 
            |
| 46 | 
                + <state key="normal" image="BTN-photoAlbum"/>  | 
            |
| 47 | 47 | 
                <connections>  | 
            
| 48 | 48 | 
                <action selector="chooseFromSYSPhoto" destination="xAo-Yl-fd5" eventType="touchUpInside" id="U7Z-Vq-2r2"/>  | 
            
| 49 | 49 | 
                </connections>  | 
            
                @@ -119,7 +119,7 @@  | 
            ||
| 119 | 119 | 
                <constraint firstAttribute="width" constant="64" id="6uz-fL-QnX"/>  | 
            
| 120 | 120 | 
                <constraint firstAttribute="height" constant="64" id="fVK-Un-AnR"/>  | 
            
| 121 | 121 | 
                </constraints>  | 
            
| 122 | 
                - <state key="normal" image="BTN-扫码"/>  | 
            |
| 122 | 
                + <state key="normal" image="BTN-scanQR"/>  | 
            |
| 123 | 123 | 
                <state key="selected" image="BTN-扫码-press"/>  | 
            
| 124 | 124 | 
                </button>  | 
            
| 125 | 125 | 
                <button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EqW-Tv-dAo">  | 
            
                @@ -128,7 +128,7 @@  | 
            ||
| 128 | 128 | 
                <constraint firstAttribute="height" constant="64" id="6oe-ry-LNq"/>  | 
            
| 129 | 129 | 
                <constraint firstAttribute="width" constant="64" id="bCz-yX-g9j"/>  | 
            
| 130 | 130 | 
                </constraints>  | 
            
| 131 | 
                - <state key="normal" image="BTN-新增"/>  | 
            |
| 131 | 
                + <state key="normal" image="BTN-add"/>  | 
            |
| 132 | 132 | 
                <state key="selected" image="BTN-新增-press"/>  | 
            
| 133 | 133 | 
                </button>  | 
            
| 134 | 134 | 
                </subviews>  | 
            
                @@ -437,7 +437,7 @@  | 
            ||
| 437 | 437 | 
                <rect key="frame" x="94" y="548.5" width="187.5" height="53.5"/>  | 
            
| 438 | 438 | 
                <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 439 | 439 | 
                <inset key="imageEdgeInsets" minX="-10" minY="0.0" maxX="0.0" maxY="0.0"/>  | 
            
| 440 | 
                - <state key="normal" image="微信">  | 
            |
| 440 | 
                + <state key="normal" image="BTN-weixin">  | 
            |
| 441 | 441 | 
                <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 442 | 442 | 
                </state>  | 
            
| 443 | 443 | 
                <userDefinedRuntimeAttributes>  | 
            
                @@ -480,16 +480,16 @@  | 
            ||
| 480 | 480 | 
                </scene>  | 
            
| 481 | 481 | 
                </scenes>  | 
            
| 482 | 482 | 
                <resources>  | 
            
| 483 | 
                - <image name="BTN-扫码" width="168" height="168"/>  | 
            |
| 483 | 
                + <image name="BTN-add" width="168" height="168"/>  | 
            |
| 484 | 
                + <image name="BTN-flash" width="126" height="126"/>  | 
            |
| 485 | 
                + <image name="BTN-photoAlbum" width="126" height="126"/>  | 
            |
| 486 | 
                + <image name="BTN-scanQR" width="168" height="168"/>  | 
            |
| 487 | 
                + <image name="BTN-weixin" width="911" height="247"/>  | 
            |
| 484 | 488 | 
                <image name="BTN-扫码-press" width="168" height="168"/>  | 
            
| 485 | 
                - <image name="BTN-新增" width="168" height="168"/>  | 
            |
| 486 | 489 | 
                <image name="BTN-新增-press" width="168" height="168"/>  | 
            
| 487 | 490 | 
                <image name="guide1" width="1462" height="2600"/>  | 
            
| 488 | 491 | 
                <image name="guide2" width="1462" height="2600"/>  | 
            
| 489 | 492 | 
                <image name="guide3" width="1462" height="2600"/>  | 
            
| 490 | 
                - <image name="从相册选取-默认70%透明度,按压100%" width="126" height="126"/>  | 
            |
| 491 | 
                - <image name="微信" width="911" height="247"/>  | 
            |
| 492 | 
                - <image name="闪光灯-默认70%透明度,按压100%" width="126" height="126"/>  | 
            |
| 493 | 493 | 
                <image name="默认头像" width="240" height="240"/>  | 
            
| 494 | 494 | 
                </resources>  | 
            
| 495 | 495 | 
                </document>  | 
            
                @@ -1,6 +1,10 @@  | 
            ||
| 1 | 1 | 
                <?xml version="1.0" encoding="UTF-8"?>  | 
            
| 2 | 2 | 
                <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES">  | 
            
| 3 | 
                + <device id="retina4_7" orientation="portrait">  | 
            |
| 4 | 
                + <adaptation id="fullscreen"/>  | 
            |
| 5 | 
                + </device>  | 
            |
| 3 | 6 | 
                <dependencies>  | 
            
| 7 | 
                + <deployment identifier="iOS"/>  | 
            |
| 4 | 8 | 
                <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>  | 
            
| 5 | 9 | 
                <capability name="Safe area layout guides" minToolsVersion="9.0"/>  | 
            
| 6 | 10 | 
                <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>  | 
            
                @@ -210,7 +214,7 @@  | 
            ||
| 210 | 214 | 
                <nil key="highlightedColor"/>  | 
            
| 211 | 215 | 
                </label>  | 
            
| 212 | 216 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="mre-Tt-F0S">  | 
            
| 213 | 
                - <rect key="frame" x="349" y="24" width="16" height="16"/>  | 
            |
| 217 | 
                + <rect key="frame" x="341" y="14" width="24" height="36"/>  | 
            |
| 214 | 218 | 
                </imageView>  | 
            
| 215 | 219 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="T9q-a4-Ugc">  | 
            
| 216 | 220 | 
                <rect key="frame" x="0.0" y="64" width="375" height="64"/>  | 
            
                @@ -227,7 +231,7 @@  | 
            ||
| 227 | 231 | 
                </constraints>  | 
            
| 228 | 232 | 
                </imageView>  | 
            
| 229 | 233 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="8VZ-dR-b6z">  | 
            
| 230 | 
                - <rect key="frame" x="349" y="88" width="16" height="16"/>  | 
            |
| 234 | 
                + <rect key="frame" x="341" y="78" width="24" height="36"/>  | 
            |
| 231 | 235 | 
                </imageView>  | 
            
| 232 | 236 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赞" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J3p-B7-gMi">  | 
            
| 233 | 237 | 
                <rect key="frame" x="70" y="86" width="17" height="20"/>  | 
            
                @@ -250,7 +254,7 @@  | 
            ||
| 250 | 254 | 
                </constraints>  | 
            
| 251 | 255 | 
                </imageView>  | 
            
| 252 | 256 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="hJe-J2-RpF">  | 
            
| 253 | 
                - <rect key="frame" x="349" y="152" width="16" height="16"/>  | 
            |
| 257 | 
                + <rect key="frame" x="341" y="142" width="24" height="36"/>  | 
            |
| 254 | 258 | 
                </imageView>  | 
            
| 255 | 259 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="评论" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fy-0a-WYd">  | 
            
| 256 | 260 | 
                <rect key="frame" x="70" y="150" width="33" height="20"/>  | 
            
                @@ -259,7 +263,7 @@  | 
            ||
| 259 | 263 | 
                <nil key="highlightedColor"/>  | 
            
| 260 | 264 | 
                </label>  | 
            
| 261 | 265 | 
                <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oLf-Xb-QSv">  | 
            
| 262 | 
                - <rect key="frame" x="333" y="28" width="8" height="8"/>  | 
            |
| 266 | 
                + <rect key="frame" x="325" y="28" width="8" height="8"/>  | 
            |
| 263 | 267 | 
                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 264 | 268 | 
                <constraints>  | 
            
| 265 | 269 | 
                <constraint firstAttribute="height" constant="8" id="8PB-CF-AvI"/>  | 
            
                @@ -272,7 +276,7 @@  | 
            ||
| 272 | 276 | 
                </userDefinedRuntimeAttributes>  | 
            
| 273 | 277 | 
                </view>  | 
            
| 274 | 278 | 
                <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R8U-gK-x5D">  | 
            
| 275 | 
                - <rect key="frame" x="333" y="92" width="8" height="8"/>  | 
            |
| 279 | 
                + <rect key="frame" x="325" y="92" width="8" height="8"/>  | 
            |
| 276 | 280 | 
                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 277 | 281 | 
                <constraints>  | 
            
| 278 | 282 | 
                <constraint firstAttribute="height" constant="8" id="pvk-DY-af3"/>  | 
            
                @@ -285,7 +289,7 @@  | 
            ||
| 285 | 289 | 
                </userDefinedRuntimeAttributes>  | 
            
| 286 | 290 | 
                </view>  | 
            
| 287 | 291 | 
                <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qi9-c7-GCt">  | 
            
| 288 | 
                - <rect key="frame" x="333" y="156" width="8" height="8"/>  | 
            |
| 292 | 
                + <rect key="frame" x="325" y="156" width="8" height="8"/>  | 
            |
| 289 | 293 | 
                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 290 | 294 | 
                <constraints>  | 
            
| 291 | 295 | 
                <constraint firstAttribute="height" constant="8" id="d1V-XC-UJk"/>  | 
            
                @@ -386,7 +390,7 @@  | 
            ||
| 386 | 390 | 
                </scene>  | 
            
| 387 | 391 | 
                </scenes>  | 
            
| 388 | 392 | 
                <resources>  | 
            
| 389 | 
                - <image name="list-arrow" width="16" height="16"/>  | 
            |
| 393 | 
                + <image name="list-arrow" width="24" height="36"/>  | 
            |
| 390 | 394 | 
                <image name="message-comment" width="144" height="144"/>  | 
            
| 391 | 395 | 
                <image name="message-system" width="144" height="144"/>  | 
            
| 392 | 396 | 
                <image name="message-thumpub" width="144" height="144"/>  | 
            
                @@ -23,7 +23,7 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 23 | 23 | 
                @IBOutlet weak var tableView: UITableView!  | 
            
| 24 | 24 | 
                 | 
            
| 25 | 25 | 
                     var emptyView : UILabel = {
               | 
            
| 26 | 
                - let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 74, width: 50, height: 50))  | 
            |
| 26 | 
                + let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 5, width: 50, height: 50))  | 
            |
| 27 | 27 | 
                 | 
            
| 28 | 28 | 
                empty.isHidden = true  | 
            
| 29 | 29 | 
                empty.text = "当前没有任何消息"  | 
            
                @@ -48,11 +48,12 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 48 | 48 | 
                setup()  | 
            
| 49 | 49 | 
                binding()  | 
            
| 50 | 50 | 
                setNavigationBar()  | 
            
| 51 | 
                + self.viewModel.reload()  | 
            |
| 51 | 52 | 
                }  | 
            
| 52 | 53 | 
                 | 
            
| 53 | 54 | 
                     private func setNavigationBar() {
               | 
            
| 54 | 55 | 
                title = type.model.title  | 
            
| 55 | 
                - setRightBarButtonItem(image: UIImage.Navigation.verticalPoints, action: #selector(clearMessage))  | 
            |
| 56 | 
                + setRightBarButtonItem(image: UIImage.Navigation.right, action: #selector(clearMessage))  | 
            |
| 56 | 57 | 
                }  | 
            
| 57 | 58 | 
                 | 
            
| 58 | 59 | 
                     private func setup() {
               | 
            
                @@ -62,7 +63,8 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 62 | 63 | 
                 | 
            
| 63 | 64 | 
                     private func setupReloadControl() {
               | 
            
| 64 | 65 | 
                         tableView.addPullToRefresh(PullToRefresh()) {
               | 
            
| 65 | 
                - [unowned self] in  | 
            |
| 66 | 
                + [weak self] in  | 
            |
| 67 | 
                +            guard let `self` = self else { return }
               | 
            |
| 66 | 68 | 
                self.viewModel.reload()  | 
            
| 67 | 69 | 
                }  | 
            
| 68 | 70 | 
                tableView.startRefreshing(at: .top)  | 
            
                @@ -70,7 +72,8 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 70 | 72 | 
                 | 
            
| 71 | 73 | 
                     private func setupLoadingControl() {
               | 
            
| 72 | 74 | 
                         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
               | 
            
| 73 | 
                - [unowned self] in  | 
            |
| 75 | 
                + [weak self] in  | 
            |
| 76 | 
                +            guard let `self` = self else { return }
               | 
            |
| 74 | 77 | 
                self.viewModel.preload()  | 
            
| 75 | 78 | 
                }  | 
            
| 76 | 79 | 
                }  | 
            
                @@ -80,7 +83,7 @@ final class MessageListViewController: UIViewController {
               | 
            ||
| 80 | 83 | 
                let alert = ActionSheetController()  | 
            
| 81 | 84 | 
                 | 
            
| 82 | 85 | 
                alert.addAlertAction(AlertAction(title: "取消", style: .cancel))  | 
            
| 83 | 
                -        alert.addAlertAction(AlertAction(title: "清空消息", handler: { (item) in
               | 
            |
| 86 | 
                +        alert.addAlertAction(AlertAction(title: "清空消息", handler: { _ in
               | 
            |
| 84 | 87 | 
                self.viewModel.removeAll()  | 
            
| 85 | 88 | 
                }))  | 
            
| 86 | 89 | 
                presentController(alert)  | 
            
                @@ -101,17 +104,18 @@ fileprivate extension MessageListViewController {
               | 
            ||
| 101 | 104 | 
                 fileprivate extension MessageListViewController {
               | 
            
| 102 | 105 | 
                 | 
            
| 103 | 106 | 
                     var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>> {
               | 
            
| 104 | 
                -        return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(configureCell: { (dataSource, tableView, indexPath, item) in
               | 
            |
| 105 | 
                -            switch self.type! {
               | 
            |
| 106 | 
                - case .system:  | 
            |
| 107 | 
                - let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell  | 
            |
| 108 | 
                - cell.setInfo(item)  | 
            |
| 109 | 
                - return cell  | 
            |
| 110 | 
                - case .comment, .thumbup:  | 
            |
| 111 | 
                - let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell  | 
            |
| 112 | 
                - cell.setInfo(item)  | 
            |
| 113 | 
                - return cell  | 
            |
| 114 | 
                - }  | 
            |
| 107 | 
                + return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(  | 
            |
| 108 | 
                +            configureCell: { (dataSource, tableView, indexPath, item) in
               | 
            |
| 109 | 
                +                switch self.type! {
               | 
            |
| 110 | 
                + case .system:  | 
            |
| 111 | 
                + let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell  | 
            |
| 112 | 
                + cell.setInfo(item)  | 
            |
| 113 | 
                + return cell  | 
            |
| 114 | 
                + case .comment, .thumbup:  | 
            |
| 115 | 
                + let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell  | 
            |
| 116 | 
                + cell.setInfo(item)  | 
            |
| 117 | 
                + return cell  | 
            |
| 118 | 
                + }  | 
            |
| 115 | 119 | 
                         }, canEditRowAtIndexPath: { _, _ in true })
               | 
            
| 116 | 120 | 
                }  | 
            
| 117 | 121 | 
                 | 
            
                @@ -108,7 +108,7 @@  | 
            ||
| 108 | 108 | 
                </viewController>  | 
            
| 109 | 109 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="ITq-MN-EQz" userLabel="First Responder" sceneMemberID="firstResponder"/>  | 
            
| 110 | 110 | 
                </objects>  | 
            
| 111 | 
                - <point key="canvasLocation" x="814.39999999999998" y="322.93853073463271"/>  | 
            |
| 111 | 
                + <point key="canvasLocation" x="983" y="-164"/>  | 
            |
| 112 | 112 | 
                </scene>  | 
            
| 113 | 113 | 
                <!--Mine Feedback View Controller-->  | 
            
| 114 | 114 | 
                <scene sceneID="jVz-lZ-rOH">  | 
            
                @@ -118,48 +118,40 @@  | 
            ||
| 118 | 118 | 
                <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>  | 
            
| 119 | 119 | 
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>  | 
            
| 120 | 120 | 
                <subviews>  | 
            
| 121 | 
                - <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="iOy-y4-gly">  | 
            |
| 122 | 
                - <rect key="frame" x="7" y="20" width="368" height="140"/>  | 
            |
| 123 | 
                - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 124 | 
                - <constraints>  | 
            |
| 125 | 
                - <constraint firstAttribute="height" constant="140" id="rmr-7m-qu4"/>  | 
            |
| 126 | 
                - </constraints>  | 
            |
| 127 | 
                - <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 128 | 
                - <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>  | 
            |
| 129 | 
                - </textView>  | 
            |
| 130 | 
                - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kyg-hG-JSP">  | 
            |
| 131 | 
                - <rect key="frame" x="0.0" y="190" width="375" height="45"/>  | 
            |
| 132 | 
                - <constraints>  | 
            |
| 133 | 
                - <constraint firstAttribute="height" constant="45" id="x3X-y4-kmZ"/>  | 
            |
| 134 | 
                - </constraints>  | 
            |
| 135 | 
                - <fontDescription key="fontDescription" type="system" pointSize="20"/>  | 
            |
| 136 | 
                - <state key="normal" title="发送" backgroundImage="BTN-send">  | 
            |
| 137 | 
                - <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 138 | 
                - </state>  | 
            |
| 139 | 
                - <connections>  | 
            |
| 140 | 
                - <action selector="sendFeedBack" destination="iwu-HG-AWF" eventType="touchUpInside" id="hQt-ku-2nH"/>  | 
            |
| 141 | 
                - </connections>  | 
            |
| 142 | 
                - </button>  | 
            |
| 143 | 
                - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="r6q-Tb-uYK">  | 
            |
| 144 | 
                - <rect key="frame" x="0.0" y="20" width="7" height="140"/>  | 
            |
| 145 | 
                - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 146 | 
                - <constraints>  | 
            |
| 147 | 
                - <constraint firstAttribute="width" constant="7" id="mcu-tc-3Gz"/>  | 
            |
| 148 | 
                - </constraints>  | 
            |
| 149 | 
                - </view>  | 
            |
| 121 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="hN3-J9-En6">  | 
            |
| 122 | 
                + <rect key="frame" x="0.0" y="20" width="375" height="197"/>  | 
            |
| 123 | 
                + <subviews>  | 
            |
| 124 | 
                + <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="iOy-y4-gly">  | 
            |
| 125 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="140"/>  | 
            |
| 126 | 
                + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 127 | 
                + <constraints>  | 
            |
| 128 | 
                + <constraint firstAttribute="height" constant="140" id="rmr-7m-qu4"/>  | 
            |
| 129 | 
                + </constraints>  | 
            |
| 130 | 
                + <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 131 | 
                + <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>  | 
            |
| 132 | 
                + </textView>  | 
            |
| 133 | 
                + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kyg-hG-JSP">  | 
            |
| 134 | 
                + <rect key="frame" x="0.0" y="152" width="375" height="45"/>  | 
            |
| 135 | 
                + <constraints>  | 
            |
| 136 | 
                + <constraint firstAttribute="height" constant="45" id="x3X-y4-kmZ"/>  | 
            |
| 137 | 
                + </constraints>  | 
            |
| 138 | 
                + <fontDescription key="fontDescription" type="system" pointSize="20"/>  | 
            |
| 139 | 
                + <state key="normal" title="发送" backgroundImage="BTN-send">  | 
            |
| 140 | 
                + <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 141 | 
                + </state>  | 
            |
| 142 | 
                + <connections>  | 
            |
| 143 | 
                + <action selector="sendFeedBack" destination="iwu-HG-AWF" eventType="touchUpInside" id="hQt-ku-2nH"/>  | 
            |
| 144 | 
                + </connections>  | 
            |
| 145 | 
                + </button>  | 
            |
| 146 | 
                + </subviews>  | 
            |
| 147 | 
                + </stackView>  | 
            |
| 150 | 148 | 
                </subviews>  | 
            
| 151 | 149 | 
                <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 152 | 150 | 
                <gestureRecognizers/>  | 
            
| 153 | 151 | 
                <constraints>  | 
            
| 154 | 
                - <constraint firstItem="r6q-Tb-uYK" firstAttribute="leading" secondItem="iOy-y4-gly" secondAttribute="leading" constant="-7" id="5tW-Mf-S7u"/>  | 
            |
| 155 | 
                - <constraint firstItem="iOy-y4-gly" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" constant="7" id="7a3-jq-iQ0"/>  | 
            |
| 156 | 
                - <constraint firstItem="iOy-y4-gly" firstAttribute="top" secondItem="zyN-cU-iak" secondAttribute="top" id="NR4-e2-k5p"/>  | 
            |
| 157 | 
                - <constraint firstItem="r6q-Tb-uYK" firstAttribute="bottom" secondItem="iOy-y4-gly" secondAttribute="bottom" id="VLj-GB-is8"/>  | 
            |
| 158 | 
                - <constraint firstItem="kyg-hG-JSP" firstAttribute="top" secondItem="iOy-y4-gly" secondAttribute="bottom" constant="30" id="W7x-rO-3tW"/>  | 
            |
| 159 | 
                - <constraint firstItem="zyN-cU-iak" firstAttribute="trailing" secondItem="iOy-y4-gly" secondAttribute="trailing" id="dHo-cB-cng"/>  | 
            |
| 160 | 
                - <constraint firstItem="kyg-hG-JSP" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" id="eNW-4w-6p7"/>  | 
            |
| 161 | 
                - <constraint firstItem="r6q-Tb-uYK" firstAttribute="top" secondItem="iOy-y4-gly" secondAttribute="top" id="mcS-Zb-P9m"/>  | 
            |
| 162 | 
                - <constraint firstItem="zyN-cU-iak" firstAttribute="trailing" secondItem="kyg-hG-JSP" secondAttribute="trailing" id="uH1-y3-dPp"/>  | 
            |
| 152 | 
                + <constraint firstItem="hN3-J9-En6" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" id="grT-5w-3hd"/>  | 
            |
| 153 | 
                + <constraint firstAttribute="trailing" secondItem="hN3-J9-En6" secondAttribute="trailing" id="tlo-OB-46x"/>  | 
            |
| 154 | 
                + <constraint firstItem="hN3-J9-En6" firstAttribute="top" secondItem="zyN-cU-iak" secondAttribute="top" id="vyF-KA-cQ3"/>  | 
            |
| 163 | 155 | 
                </constraints>  | 
            
| 164 | 156 | 
                <viewLayoutGuide key="safeArea" id="zyN-cU-iak"/>  | 
            
| 165 | 157 | 
                <connections>  | 
            
                @@ -179,7 +171,7 @@  | 
            ||
| 179 | 171 | 
                </connections>  | 
            
| 180 | 172 | 
                </tapGestureRecognizer>  | 
            
| 181 | 173 | 
                </objects>  | 
            
| 182 | 
                - <point key="canvasLocation" x="814.39999999999998" y="994.9025487256373"/>  | 
            |
| 174 | 
                + <point key="canvasLocation" x="292" y="-164"/>  | 
            |
| 183 | 175 | 
                </scene>  | 
            
| 184 | 176 | 
                <!--Mine About View Controller-->  | 
            
| 185 | 177 | 
                <scene sceneID="dR7-2C-QzB">  | 
            
                @@ -189,42 +181,42 @@  | 
            ||
| 189 | 181 | 
                <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>  | 
            
| 190 | 182 | 
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>  | 
            
| 191 | 183 | 
                <subviews>  | 
            
| 192 | 
                - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Str-BX-Lky" userLabel="View-up">  | 
            |
| 193 | 
                - <rect key="frame" x="0.0" y="20" width="375" height="216"/>  | 
            |
| 184 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="2I3-Nh-YZ5">  | 
            |
| 185 | 
                + <rect key="frame" x="0.0" y="20" width="375" height="641"/>  | 
            |
| 194 | 186 | 
                <subviews>  | 
            
| 195 | 
                - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">  | 
            |
| 196 | 
                - <rect key="frame" x="117.5" y="38" width="140" height="140"/>  | 
            |
| 187 | 
                + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Str-BX-Lky" userLabel="Logo view">  | 
            |
| 188 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="216"/>  | 
            |
| 189 | 
                + <subviews>  | 
            |
| 190 | 
                + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">  | 
            |
| 191 | 
                + <rect key="frame" x="117.5" y="38" width="140" height="140"/>  | 
            |
| 192 | 
                + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 193 | 
                + </imageView>  | 
            |
| 194 | 
                + </subviews>  | 
            |
| 197 | 195 | 
                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 198 | 
                - </imageView>  | 
            |
| 199 | 
                - </subviews>  | 
            |
| 200 | 
                - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 201 | 
                - <constraints>  | 
            |
| 202 | 
                - <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerX" secondItem="Str-BX-Lky" secondAttribute="centerX" id="5Hv-0h-6dw"/>  | 
            |
| 203 | 
                - <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerY" secondItem="Str-BX-Lky" secondAttribute="centerY" id="ffl-F6-a1m"/>  | 
            |
| 204 | 
                - <constraint firstAttribute="height" constant="216" id="qV0-pB-Hya"/>  | 
            |
| 205 | 
                - </constraints>  | 
            |
| 206 | 
                - </view>  | 
            |
| 207 | 
                - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjC-jQ-LOw" userLabel="View-down">  | 
            |
| 208 | 
                - <rect key="frame" x="-4" y="236" width="383" height="431"/>  | 
            |
| 209 | 
                - <subviews>  | 
            |
| 196 | 
                + <constraints>  | 
            |
| 197 | 
                + <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerX" secondItem="Str-BX-Lky" secondAttribute="centerX" id="5Hv-0h-6dw"/>  | 
            |
| 198 | 
                + <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerY" secondItem="Str-BX-Lky" secondAttribute="centerY" id="ffl-F6-a1m"/>  | 
            |
| 199 | 
                + <constraint firstAttribute="height" constant="216" id="qV0-pB-Hya"/>  | 
            |
| 200 | 
                + </constraints>  | 
            |
| 201 | 
                + </view>  | 
            |
| 210 | 202 | 
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mae-VW-ed0" userLabel="Contact Us View">  | 
            
| 211 | 
                - <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>  | 
            |
| 203 | 
                + <rect key="frame" x="0.0" y="216" width="375" height="48"/>  | 
            |
| 212 | 204 | 
                <subviews>  | 
            
| 213 | 205 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-contactUs" translatesAutoresizingMaskIntoConstraints="NO" id="pVB-Uy-xXH">  | 
            
| 214 | 206 | 
                <rect key="frame" x="16" y="8" width="32" height="32"/>  | 
            
| 215 | 207 | 
                </imageView>  | 
            
| 216 | 208 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系我们" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CYk-cu-pHl">  | 
            
| 217 | 
                - <rect key="frame" x="62" y="14" width="66" height="20"/>  | 
            |
| 209 | 
                + <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>  | 
            |
| 218 | 210 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>  | 
            
| 219 | 211 | 
                <fontDescription key="fontDescription" type="system" pointSize="16"/>  | 
            
| 220 | 212 | 
                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 221 | 213 | 
                <nil key="highlightedColor"/>  | 
            
| 222 | 214 | 
                </label>  | 
            
| 223 | 215 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="MgR-ta-3jg">  | 
            
| 224 | 
                - <rect key="frame" x="349" y="6" width="24" height="36"/>  | 
            |
| 216 | 
                + <rect key="frame" x="341" y="6" width="24" height="36"/>  | 
            |
| 225 | 217 | 
                </imageView>  | 
            
| 226 | 218 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L1g-sb-a5F">  | 
            
| 227 | 
                - <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>  | 
            |
| 219 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>  | 
            |
| 228 | 220 | 
                </button>  | 
            
| 229 | 221 | 
                </subviews>  | 
            
| 230 | 222 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>  | 
            
                @@ -243,23 +235,23 @@  | 
            ||
| 243 | 235 | 
                </constraints>  | 
            
| 244 | 236 | 
                </view>  | 
            
| 245 | 237 | 
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EVY-h5-0pO" userLabel="Score View">  | 
            
| 246 | 
                - <rect key="frame" x="0.0" y="48" width="383" height="48"/>  | 
            |
| 238 | 
                + <rect key="frame" x="0.0" y="264" width="375" height="48"/>  | 
            |
| 247 | 239 | 
                <subviews>  | 
            
| 248 | 240 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-score" translatesAutoresizingMaskIntoConstraints="NO" id="0O4-xB-jPJ">  | 
            
| 249 | 241 | 
                <rect key="frame" x="16" y="8" width="32" height="32"/>  | 
            
| 250 | 242 | 
                </imageView>  | 
            
| 251 | 243 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="给我评分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAf-2j-KJO">  | 
            
| 252 | 
                - <rect key="frame" x="62" y="14" width="66" height="20"/>  | 
            |
| 244 | 
                + <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>  | 
            |
| 253 | 245 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>  | 
            
| 254 | 246 | 
                <fontDescription key="fontDescription" type="system" pointSize="16"/>  | 
            
| 255 | 247 | 
                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 256 | 248 | 
                <nil key="highlightedColor"/>  | 
            
| 257 | 249 | 
                </label>  | 
            
| 258 | 250 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="vLw-Zd-Mis">  | 
            
| 259 | 
                - <rect key="frame" x="349" y="6" width="24" height="36"/>  | 
            |
| 251 | 
                + <rect key="frame" x="341" y="6" width="24" height="36"/>  | 
            |
| 260 | 252 | 
                </imageView>  | 
            
| 261 | 253 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FIE-jb-ZGu">  | 
            
| 262 | 
                - <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>  | 
            |
| 254 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>  | 
            |
| 263 | 255 | 
                </button>  | 
            
| 264 | 256 | 
                </subviews>  | 
            
| 265 | 257 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>  | 
            
                @@ -278,23 +270,23 @@  | 
            ||
| 278 | 270 | 
                </constraints>  | 
            
| 279 | 271 | 
                </view>  | 
            
| 280 | 272 | 
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hN9-6g-QCB" userLabel="User Agreement View">  | 
            
| 281 | 
                - <rect key="frame" x="0.0" y="96" width="383" height="48"/>  | 
            |
| 273 | 
                + <rect key="frame" x="0.0" y="312" width="375" height="48"/>  | 
            |
| 282 | 274 | 
                <subviews>  | 
            
| 283 | 275 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-userAgreement" translatesAutoresizingMaskIntoConstraints="NO" id="u6G-8X-fqc">  | 
            
| 284 | 276 | 
                <rect key="frame" x="16" y="8" width="32" height="32"/>  | 
            
| 285 | 277 | 
                </imageView>  | 
            
| 286 | 278 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="用户协议" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="COm-64-2lk">  | 
            
| 287 | 
                - <rect key="frame" x="62" y="14" width="66" height="20"/>  | 
            |
| 279 | 
                + <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>  | 
            |
| 288 | 280 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>  | 
            
| 289 | 281 | 
                <fontDescription key="fontDescription" type="system" pointSize="16"/>  | 
            
| 290 | 282 | 
                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 291 | 283 | 
                <nil key="highlightedColor"/>  | 
            
| 292 | 284 | 
                </label>  | 
            
| 293 | 285 | 
                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="mhJ-Uj-tdj">  | 
            
| 294 | 
                - <rect key="frame" x="349" y="6" width="24" height="36"/>  | 
            |
| 286 | 
                + <rect key="frame" x="341" y="6" width="24" height="36"/>  | 
            |
| 295 | 287 | 
                </imageView>  | 
            
| 296 | 288 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VGv-oO-leT">  | 
            
| 297 | 
                - <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>  | 
            |
| 289 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>  | 
            |
| 298 | 290 | 
                </button>  | 
            
| 299 | 291 | 
                </subviews>  | 
            
| 300 | 292 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>  | 
            
                @@ -312,49 +304,33 @@  | 
            ||
| 312 | 304 | 
                <constraint firstItem="mhJ-Uj-tdj" firstAttribute="centerY" secondItem="hN9-6g-QCB" secondAttribute="centerY" id="z8z-9u-ZAm"/>  | 
            
| 313 | 305 | 
                </constraints>  | 
            
| 314 | 306 | 
                </view>  | 
            
| 307 | 
                + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjC-jQ-LOw" userLabel="Fill view">  | 
            |
| 308 | 
                + <rect key="frame" x="0.0" y="360" width="375" height="254.5"/>  | 
            |
| 309 | 
                + <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 310 | 
                + </view>  | 
            |
| 311 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本:1.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">  | 
            |
| 312 | 
                + <rect key="frame" x="0.0" y="614.5" width="375" height="14.5"/>  | 
            |
| 313 | 
                + <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 314 | 
                + <fontDescription key="fontDescription" type="system" pointSize="12"/>  | 
            |
| 315 | 
                + <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 316 | 
                + <nil key="highlightedColor"/>  | 
            |
| 317 | 
                + </label>  | 
            |
| 318 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Copyright@pai.ai" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">  | 
            |
| 319 | 
                + <rect key="frame" x="0.0" y="629" width="375" height="12"/>  | 
            |
| 320 | 
                + <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 321 | 
                + <fontDescription key="fontDescription" type="system" pointSize="10"/>  | 
            |
| 322 | 
                + <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 323 | 
                + <nil key="highlightedColor"/>  | 
            |
| 324 | 
                + </label>  | 
            |
| 315 | 325 | 
                </subviews>  | 
            
| 316 | 
                - <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 317 | 
                - <constraints>  | 
            |
| 318 | 
                - <constraint firstItem="mae-VW-ed0" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="25m-1u-PlX"/>  | 
            |
| 319 | 
                - <constraint firstAttribute="trailing" secondItem="EVY-h5-0pO" secondAttribute="trailing" id="Cl6-If-4fD"/>  | 
            |
| 320 | 
                - <constraint firstItem="EVY-h5-0pO" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Cmx-5f-fSM"/>  | 
            |
| 321 | 
                - <constraint firstItem="EVY-h5-0pO" firstAttribute="top" secondItem="mae-VW-ed0" secondAttribute="bottom" id="Kg3-vC-Ohr"/>  | 
            |
| 322 | 
                - <constraint firstAttribute="trailing" secondItem="mae-VW-ed0" secondAttribute="trailing" id="Qtq-6O-uU3"/>  | 
            |
| 323 | 
                - <constraint firstItem="hN9-6g-QCB" firstAttribute="top" secondItem="EVY-h5-0pO" secondAttribute="bottom" id="SCp-cp-eDW"/>  | 
            |
| 324 | 
                - <constraint firstItem="hN9-6g-QCB" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Ufj-Mi-XEY"/>  | 
            |
| 325 | 
                - <constraint firstAttribute="trailing" secondItem="hN9-6g-QCB" secondAttribute="trailing" id="YLN-9T-LED"/>  | 
            |
| 326 | 
                - <constraint firstItem="mae-VW-ed0" firstAttribute="top" secondItem="bjC-jQ-LOw" secondAttribute="top" id="qXw-XK-Fq0"/>  | 
            |
| 327 | 
                - </constraints>  | 
            |
| 328 | 
                - </view>  | 
            |
| 329 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Copyright@pai.ai" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">  | 
            |
| 330 | 
                - <rect key="frame" x="146.5" y="649" width="82" height="12"/>  | 
            |
| 331 | 
                - <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 332 | 
                - <fontDescription key="fontDescription" type="system" pointSize="10"/>  | 
            |
| 333 | 
                - <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 334 | 
                - <nil key="highlightedColor"/>  | 
            |
| 335 | 
                - </label>  | 
            |
| 336 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本:1.0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">  | 
            |
| 337 | 
                - <rect key="frame" x="161" y="628.5" width="53" height="14.5"/>  | 
            |
| 338 | 
                - <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 339 | 
                - <fontDescription key="fontDescription" type="system" pointSize="12"/>  | 
            |
| 340 | 
                - <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 341 | 
                - <nil key="highlightedColor"/>  | 
            |
| 342 | 
                - </label>  | 
            |
| 326 | 
                + </stackView>  | 
            |
| 343 | 327 | 
                </subviews>  | 
            
| 344 | 328 | 
                <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 345 | 329 | 
                <constraints>  | 
            
| 346 | 
                - <constraint firstItem="bjC-jQ-LOw" firstAttribute="leading" secondItem="gzV-sh-iNN" secondAttribute="leadingMargin" constant="-20" id="4XL-Mn-Bda"/>  | 
            |
| 347 | 
                - <constraint firstAttribute="bottom" secondItem="bjC-jQ-LOw" secondAttribute="bottom" id="7cS-3o-xis"/>  | 
            |
| 348 | 
                - <constraint firstItem="bjC-jQ-LOw" firstAttribute="centerX" secondItem="szY-tb-XAT" secondAttribute="centerX" id="B1z-7x-Vdk"/>  | 
            |
| 349 | 
                - <constraint firstItem="inH-WZ-fdD" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="BGs-5i-uoA"/>  | 
            |
| 350 | 
                - <constraint firstItem="bEV-QT-Egq" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="CGs-tu-a6G"/>  | 
            |
| 351 | 
                - <constraint firstItem="szY-tb-XAT" firstAttribute="bottom" secondItem="inH-WZ-fdD" secondAttribute="bottom" constant="6" id="XIG-RN-kfd"/>  | 
            |
| 352 | 
                - <constraint firstItem="bjC-jQ-LOw" firstAttribute="top" secondItem="Str-BX-Lky" secondAttribute="bottom" id="dKZ-iN-vPM"/>  | 
            |
| 353 | 
                - <constraint firstItem="szY-tb-XAT" firstAttribute="trailing" secondItem="Str-BX-Lky" secondAttribute="trailing" id="fpg-jU-lLU"/>  | 
            |
| 354 | 
                - <constraint firstItem="inH-WZ-fdD" firstAttribute="top" secondItem="bEV-QT-Egq" secondAttribute="bottom" constant="6" id="gQZ-xs-1i5"/>  | 
            |
| 355 | 
                - <constraint firstItem="Str-BX-Lky" firstAttribute="top" secondItem="szY-tb-XAT" secondAttribute="top" id="n5h-V7-STS"/>  | 
            |
| 356 | 
                - <constraint firstAttribute="trailingMargin" secondItem="bjC-jQ-LOw" secondAttribute="trailing" constant="-20" id="wJd-7K-65L"/>  | 
            |
| 357 | 
                - <constraint firstItem="Str-BX-Lky" firstAttribute="leading" secondItem="szY-tb-XAT" secondAttribute="leading" id="x2e-5M-bfE"/>  | 
            |
| 330 | 
                + <constraint firstItem="szY-tb-XAT" firstAttribute="bottom" secondItem="2I3-Nh-YZ5" secondAttribute="bottom" constant="6" id="PzK-nk-5ha"/>  | 
            |
| 331 | 
                + <constraint firstItem="2I3-Nh-YZ5" firstAttribute="leading" secondItem="szY-tb-XAT" secondAttribute="leading" id="juG-cf-sI2"/>  | 
            |
| 332 | 
                + <constraint firstItem="2I3-Nh-YZ5" firstAttribute="top" secondItem="szY-tb-XAT" secondAttribute="top" id="uNF-HK-KAi"/>  | 
            |
| 333 | 
                + <constraint firstAttribute="trailing" secondItem="2I3-Nh-YZ5" secondAttribute="trailing" id="w77-9w-TET"/>  | 
            |
| 358 | 334 | 
                </constraints>  | 
            
| 359 | 335 | 
                <viewLayoutGuide key="safeArea" id="szY-tb-XAT"/>  | 
            
| 360 | 336 | 
                </view>  | 
            
                @@ -368,26 +344,26 @@  | 
            ||
| 368 | 344 | 
                </viewController>  | 
            
| 369 | 345 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="i5Y-H4-CYK" userLabel="First Responder" sceneMemberID="firstResponder"/>  | 
            
| 370 | 346 | 
                </objects>  | 
            
| 371 | 
                - <point key="canvasLocation" x="143.19999999999999" y="926.08695652173924"/>  | 
            |
| 347 | 
                + <point key="canvasLocation" x="-444" y="-164"/>  | 
            |
| 372 | 348 | 
                </scene>  | 
            
| 373 | 349 | 
                <!--Mine Order View Controller-->  | 
            
| 374 | 350 | 
                <scene sceneID="3e4-t5-KsN">  | 
            
| 375 | 351 | 
                <objects>  | 
            
| 376 | 352 | 
                <viewController storyboardIdentifier="MineOrderViewController" automaticallyAdjustsScrollViewInsets="NO" id="Rcb-gY-KGS" customClass="MineOrderViewController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">  | 
            
| 377 | 353 | 
                <view key="view" contentMode="scaleToFill" id="1da-az-lxh">  | 
            
| 378 | 
                - <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>  | 
            |
| 354 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>  | 
            |
| 379 | 355 | 
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>  | 
            
| 380 | 356 | 
                <subviews>  | 
            
| 381 | 357 | 
                <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="64" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="Ysr-aa-J9R">  | 
            
| 382 | 
                - <rect key="frame" x="0.0" y="20" width="320" height="548"/>  | 
            |
| 358 | 
                + <rect key="frame" x="0.0" y="20" width="375" height="647"/>  | 
            |
| 383 | 359 | 
                <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 384 | 360 | 
                <color key="separatorColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 385 | 361 | 
                <prototypes>  | 
            
| 386 | 
                - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="orderCell" rowHeight="64" id="b9t-RY-ZJI" customClass="OrderCell" customModule="Paiai_iOS" customModuleProvider="target">  | 
            |
| 387 | 
                - <rect key="frame" x="0.0" y="28" width="320" height="64"/>  | 
            |
| 362 | 
                + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="orderCell" rowHeight="64" id="b9t-RY-ZJI" customClass="OrderCell" customModule="Paiai_iOS" customModuleProvider="target">  | 
            |
| 363 | 
                + <rect key="frame" x="0.0" y="28" width="375" height="64"/>  | 
            |
| 388 | 364 | 
                <autoresizingMask key="autoresizingMask"/>  | 
            
| 389 | 365 | 
                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b9t-RY-ZJI" id="90v-hW-Nj2">  | 
            
| 390 | 
                - <rect key="frame" x="0.0" y="0.0" width="320" height="63.5"/>  | 
            |
| 366 | 
                + <rect key="frame" x="0.0" y="0.0" width="375" height="63.5"/>  | 
            |
| 391 | 367 | 
                <autoresizingMask key="autoresizingMask"/>  | 
            
| 392 | 368 | 
                <subviews>  | 
            
| 393 | 369 | 
                <imageView clipsSubviews="YES" userInteractionEnabled="NO" tag="1001" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="默认头像" translatesAutoresizingMaskIntoConstraints="NO" id="PNO-iQ-jhe">  | 
            
                @@ -419,7 +395,7 @@  | 
            ||
| 419 | 395 | 
                <nil key="highlightedColor"/>  | 
            
| 420 | 396 | 
                </label>  | 
            
| 421 | 397 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="+ 2.00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CRI-rc-jfB">  | 
            
| 422 | 
                - <rect key="frame" x="216.5" y="24.5" width="36.5" height="14.5"/>  | 
            |
| 398 | 
                + <rect key="frame" x="326.5" y="24.5" width="36.5" height="14.5"/>  | 
            |
| 423 | 399 | 
                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>  | 
            
| 424 | 400 | 
                <fontDescription key="fontDescription" type="system" pointSize="12"/>  | 
            
| 425 | 401 | 
                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
                @@ -470,15 +446,13 @@  | 
            ||
| 470 | 446 | 
                <viewLayoutGuide key="safeArea" id="Okl-5b-EeR"/>  | 
            
| 471 | 447 | 
                </view>  | 
            
| 472 | 448 | 
                <navigationItem key="navigationItem" id="Lzy-4o-Sr3"/>  | 
            
| 473 | 
                - <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>  | 
            |
| 474 | 
                - <size key="freeformSize" width="320" height="568"/>  | 
            |
| 475 | 449 | 
                <connections>  | 
            
| 476 | 450 | 
                <outlet property="tableView" destination="Ysr-aa-J9R" id="Yuw-ab-oeJ"/>  | 
            
| 477 | 451 | 
                </connections>  | 
            
| 478 | 452 | 
                </viewController>  | 
            
| 479 | 453 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="bkE-YW-tfe" sceneMemberID="firstResponder"/>  | 
            
| 480 | 454 | 
                </objects>  | 
            
| 481 | 
                - <point key="canvasLocation" x="1656.8" y="-102.54872563718142"/>  | 
            |
| 455 | 
                + <point key="canvasLocation" x="1591" y="-164"/>  | 
            |
| 482 | 456 | 
                </scene>  | 
            
| 483 | 457 | 
                <!--Mine View Controller-->  | 
            
| 484 | 458 | 
                <scene sceneID="wJG-wy-wnD">  | 
            
                @@ -562,7 +536,7 @@  | 
            ||
| 562 | 536 | 
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uFJ-qP-CrW">  | 
            
| 563 | 537 | 
                <rect key="frame" x="0.0" y="0.0" width="300" height="84"/>  | 
            
| 564 | 538 | 
                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 565 | 
                - <state key="normal" title="登出" image="注销切图">  | 
            |
| 539 | 
                + <state key="normal" title="登出" image="BTN-logout">  | 
            |
| 566 | 540 | 
                <color key="titleColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 567 | 541 | 
                </state>  | 
            
| 568 | 542 | 
                </button>  | 
            
                @@ -611,18 +585,18 @@  | 
            ||
| 611 | 585 | 
                </viewController>  | 
            
| 612 | 586 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="89K-Cu-Ds9" userLabel="First Responder" sceneMemberID="firstResponder"/>  | 
            
| 613 | 587 | 
                </objects>  | 
            
| 614 | 
                - <point key="canvasLocation" x="2237.5999999999999" y="-102.09895052473765"/>  | 
            |
| 588 | 
                + <point key="canvasLocation" x="2228" y="-174"/>  | 
            |
| 615 | 589 | 
                </scene>  | 
            
| 616 | 590 | 
                </scenes>  | 
            
| 617 | 591 | 
                <resources>  | 
            
| 592 | 
                + <image name="BTN-logout" width="32" height="32"/>  | 
            |
| 618 | 593 | 
                <image name="BTN-send" width="608" height="304"/>  | 
            
| 619 | 
                - <image name="Logo" width="140" height="140"/>  | 
            |
| 620 | 594 | 
                <image name="about-contactUs" width="32" height="32"/>  | 
            
| 621 | 595 | 
                <image name="about-score" width="32" height="32"/>  | 
            
| 622 | 596 | 
                <image name="about-userAgreement" width="32" height="32"/>  | 
            
| 623 | 597 | 
                <image name="list-arrow" width="24" height="36"/>  | 
            
| 598 | 
                + <image name="logo" width="140" height="140"/>  | 
            |
| 624 | 599 | 
                <image name="navigation-background" width="12" height="132"/>  | 
            
| 625 | 
                - <image name="注销切图" width="32" height="32"/>  | 
            |
| 626 | 600 | 
                <image name="默认头像" width="240" height="240"/>  | 
            
| 627 | 601 | 
                </resources>  | 
            
| 628 | 602 | 
                </document>  | 
            
                @@ -14,7 +14,7 @@ class MineCoordinator: Coordinator {
               | 
            ||
| 14 | 14 | 
                 | 
            
| 15 | 15 | 
                let mineViewController: MineViewController  | 
            
| 16 | 16 | 
                let navigationController: UINavigationController  | 
            
| 17 | 
                - var childCoordinator = [String: Coordinator]()  | 
            |
| 17 | 
                + var childCoordinator = [CoordinatorKey: Coordinator]()  | 
            |
| 18 | 18 | 
                // let shareUserInfoViewModel  | 
            
| 19 | 19 | 
                 | 
            
| 20 | 20 | 
                     init(_ mineViewController: MineViewController, navigationController: UINavigationController) {
               | 
            
                @@ -62,7 +62,7 @@ extension MineCoordinator: MineGroupViewModelDelegate {
               | 
            ||
| 62 | 62 | 
                     func didSelect(_ item: GroupItem) {
               | 
            
| 63 | 63 | 
                let coordinator = GroupCoordinator(makeGroupViewController(item: item),  | 
            
| 64 | 64 | 
                navigationController: navigationController)  | 
            
| 65 | 
                - childCoordinator["group"] = coordinator  | 
            |
| 65 | 
                + childCoordinator[.group] = coordinator  | 
            |
| 66 | 66 | 
                navigationController.pushViewController(coordinator.groupViewController)  | 
            
| 67 | 67 | 
                }  | 
            
| 68 | 68 | 
                }  | 
            
                @@ -14,37 +14,43 @@ import PaiaiUIKit  | 
            ||
| 14 | 14 | 
                 | 
            
| 15 | 15 | 
                 final class MineFeedbackViewController: UIViewController {
               | 
            
| 16 | 16 | 
                 | 
            
| 17 | 
                - // MARK: Storyboard property  | 
            |
| 18 | 17 | 
                @IBOutlet weak var textView: UITextView!  | 
            
| 19 | 18 | 
                @IBOutlet weak var sendBtn: UIButton!  | 
            
| 20 | 
                - fileprivate let disposeBag = DisposeBag()  | 
            |
| 21 | 19 | 
                 | 
            
| 20 | 
                + fileprivate let disposeBag = DisposeBag()  | 
            |
| 22 | 21 | 
                var feedbackAPI: FeedbackRemoteAPI!  | 
            
| 23 | 22 | 
                 | 
            
| 24 | 
                - // MARK: view function  | 
            |
| 25 | 23 | 
                     override func viewDidLoad() {
               | 
            
| 26 | 24 | 
                super.viewDidLoad()  | 
            
| 27 | 25 | 
                title = "意见反馈"  | 
            
| 28 | 26 | 
                textView.placeholder = "您的建议是我们前进的动力"  | 
            
| 27 | 
                + textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)  | 
            |
| 29 | 28 | 
                bindTextViewToSendBtn()  | 
            
| 30 | 29 | 
                }  | 
            
| 30 | 
                +}  | 
            |
| 31 | 31 | 
                 | 
            
| 32 | 
                +/// storyboard button action  | 
            |
| 33 | 
                +extension MineFeedbackViewController {
               | 
            |
| 32 | 34 | 
                     @IBAction func sendFeedBack() {
               | 
            
| 35 | 
                + Toast.showActivity(message: "正在提交")  | 
            |
| 33 | 36 | 
                         feedbackAPI.submit(text: textView.text).subscribe(onCompleted: {[weak self] in
               | 
            
| 34 | 37 | 
                             guard let `self` = self else { return }
               | 
            
| 35 | 
                - self.navigationController?.popViewController(animated: true)  | 
            |
| 38 | 
                + Toast.hide()  | 
            |
| 36 | 39 | 
                Toast.show(message: "感谢您的建议")  | 
            
| 37 | 
                -        }) { (error) in
               | 
            |
| 38 | 
                -  | 
            |
| 39 | 
                - }.disposed(by: disposeBag)  | 
            |
| 40 | 
                + self.navigationController?.popViewController(animated: true)  | 
            |
| 41 | 
                + }).disposed(by: disposeBag)  | 
            |
| 40 | 42 | 
                }  | 
            
| 43 | 
                +}  | 
            |
| 44 | 
                +  | 
            |
| 41 | 45 | 
                 | 
            
| 46 | 
                +/// storybaord gesture recognizer action  | 
            |
| 47 | 
                +extension MineFeedbackViewController {
               | 
            |
| 42 | 48 | 
                     @IBAction func tap() {
               | 
            
| 43 | 49 | 
                textView.resignFirstResponder()  | 
            
| 44 | 50 | 
                }  | 
            
| 45 | 51 | 
                }  | 
            
| 46 | 52 | 
                 | 
            
| 47 | 
                -fileprivate extension MineFeedbackViewController {
               | 
            |
| 53 | 
                +extension MineFeedbackViewController {
               | 
            |
| 48 | 54 | 
                     func bindTextViewToSendBtn() {
               | 
            
| 49 | 55 | 
                textView.rx.text  | 
            
| 50 | 56 | 
                             .map {!($0?.isEmpty)!}
               | 
            
                @@ -26,7 +26,6 @@ final class MineGroupViewController: UIViewController {
               | 
            ||
| 26 | 26 | 
                // MARK: view function  | 
            
| 27 | 27 | 
                     override func viewDidLoad() {
               | 
            
| 28 | 28 | 
                super.viewDidLoad()  | 
            
| 29 | 
                -  | 
            |
| 30 | 29 | 
                setup()  | 
            
| 31 | 30 | 
                binding()  | 
            
| 32 | 31 | 
                setNavigationBar()  | 
            
                @@ -43,7 +42,8 @@ final class MineGroupViewController: UIViewController {
               | 
            ||
| 43 | 42 | 
                 | 
            
| 44 | 43 | 
                     private func setupReloadControl() {
               | 
            
| 45 | 44 | 
                         tableView.addPullToRefresh(PullToRefresh()) {
               | 
            
| 46 | 
                - [unowned self] in  | 
            |
| 45 | 
                + [weak self] in  | 
            |
| 46 | 
                +            guard let `self` = self else { return }
               | 
            |
| 47 | 47 | 
                self.viewModel.reload()  | 
            
| 48 | 48 | 
                }  | 
            
| 49 | 49 | 
                tableView.startRefreshing(at: .top)  | 
            
                @@ -51,7 +51,8 @@ final class MineGroupViewController: UIViewController {
               | 
            ||
| 51 | 51 | 
                 | 
            
| 52 | 52 | 
                     private func setupLoadingControl() {
               | 
            
| 53 | 53 | 
                         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
               | 
            
| 54 | 
                - [unowned self] in  | 
            |
| 54 | 
                + [weak self] in  | 
            |
| 55 | 
                +            guard let `self` = self else { return }
               | 
            |
| 55 | 56 | 
                self.viewModel.preload()  | 
            
| 56 | 57 | 
                }  | 
            
| 57 | 58 | 
                }  | 
            
                @@ -16,24 +16,20 @@ import PullToRefresh  | 
            ||
| 16 | 16 | 
                 | 
            
| 17 | 17 | 
                 final class MineOrderViewController: UIViewController {
               | 
            
| 18 | 18 | 
                 | 
            
| 19 | 
                - // MARK: Storyboard property  | 
            |
| 20 | 19 | 
                @IBOutlet weak var tableView: UITableView!  | 
            
| 21 | 20 | 
                 | 
            
| 22 | 
                - // MARK: data property  | 
            |
| 23 | 21 | 
                fileprivate let disposeBag = DisposeBag()  | 
            
| 24 | 22 | 
                var viewModel: MineOrderViewModel!  | 
            
| 25 | 23 | 
                 | 
            
| 26 | 
                - // MARK: view function  | 
            |
| 27 | 24 | 
                     override func viewDidLoad() {
               | 
            
| 28 | 25 | 
                super.viewDidLoad()  | 
            
| 29 | 
                -  | 
            |
| 30 | 26 | 
                setup()  | 
            
| 31 | 27 | 
                binding()  | 
            
| 32 | 28 | 
                setNavigationBar()  | 
            
| 33 | 29 | 
                }  | 
            
| 34 | 30 | 
                 | 
            
| 35 | 31 | 
                     private func setNavigationBar() {
               | 
            
| 36 | 
                - title = "我的照片群"  | 
            |
| 32 | 
                + title = "订单记录"  | 
            |
| 37 | 33 | 
                }  | 
            
| 38 | 34 | 
                 | 
            
| 39 | 35 | 
                     private func setup() {
               | 
            
                @@ -43,7 +39,8 @@ final class MineOrderViewController: UIViewController {
               | 
            ||
| 43 | 39 | 
                 | 
            
| 44 | 40 | 
                     private func setupReloadControl() {
               | 
            
| 45 | 41 | 
                         tableView.addPullToRefresh(PullToRefresh()) {
               | 
            
| 46 | 
                - [unowned self] in  | 
            |
| 42 | 
                + [weak self] in  | 
            |
| 43 | 
                +            guard let `self` = self else { return }
               | 
            |
| 47 | 44 | 
                self.viewModel.reload()  | 
            
| 48 | 45 | 
                }  | 
            
| 49 | 46 | 
                tableView.startRefreshing(at: .top)  | 
            
                @@ -51,17 +48,18 @@ final class MineOrderViewController: UIViewController {
               | 
            ||
| 51 | 48 | 
                 | 
            
| 52 | 49 | 
                     private func setupLoadingControl() {
               | 
            
| 53 | 50 | 
                         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
               | 
            
| 54 | 
                - [unowned self] in  | 
            |
| 51 | 
                + [weak self] in  | 
            |
| 52 | 
                +            guard let `self` = self else { return }
               | 
            |
| 55 | 53 | 
                self.viewModel.preload()  | 
            
| 56 | 54 | 
                }  | 
            
| 57 | 55 | 
                }  | 
            
| 58 | 56 | 
                }  | 
            
| 59 | 57 | 
                 | 
            
| 60 | 
                -///  | 
            |
| 58 | 
                +/// binding UI  | 
            |
| 61 | 59 | 
                 fileprivate extension MineOrderViewController {
               | 
            
| 62 | 60 | 
                 | 
            
| 63 | 
                -    var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, OrderItem>> {
               | 
            |
| 64 | 
                - return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, OrderItem>>(  | 
            |
| 61 | 
                +    var dataSource: RxTableViewSectionedReloadDataSource<AnimatableSectionModel<Int, OrderItem>> {
               | 
            |
| 62 | 
                + return RxTableViewSectionedReloadDataSource<AnimatableSectionModel<Int, OrderItem>>(  | 
            |
| 65 | 63 | 
                             configureCell: { (dataSource, tableView, indexPath, item) in
               | 
            
| 66 | 64 | 
                let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath) as! OrderCell  | 
            
| 67 | 65 | 
                cell.setInfo(item)  | 
            
                @@ -59,7 +59,7 @@  | 
            ||
| 59 | 59 | 
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qGY-qB-XSl">  | 
            
| 60 | 60 | 
                <rect key="frame" x="0.0" y="301" width="266" height="32"/>  | 
            
| 61 | 61 | 
                <subviews>  | 
            
| 62 | 
                - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-赞" translatesAutoresizingMaskIntoConstraints="NO" id="UY4-Qk-Rt9">  | 
            |
| 62 | 
                + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-thumbup" translatesAutoresizingMaskIntoConstraints="NO" id="UY4-Qk-Rt9">  | 
            |
| 63 | 63 | 
                <rect key="frame" x="8" y="-2" width="36" height="36"/>  | 
            
| 64 | 64 | 
                </imageView>  | 
            
| 65 | 65 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vth-es-l5X">  | 
            
                @@ -68,7 +68,7 @@  | 
            ||
| 68 | 68 | 
                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 69 | 69 | 
                <nil key="highlightedColor"/>  | 
            
| 70 | 70 | 
                </label>  | 
            
| 71 | 
                - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-评论" translatesAutoresizingMaskIntoConstraints="NO" id="31M-cU-gad">  | 
            |
| 71 | 
                + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-comment" translatesAutoresizingMaskIntoConstraints="NO" id="31M-cU-gad">  | 
            |
| 72 | 72 | 
                <rect key="frame" x="64.5" y="-2" width="36" height="36"/>  | 
            
| 73 | 73 | 
                </imageView>  | 
            
| 74 | 74 | 
                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="koM-0x-z5o">  | 
            
                @@ -119,7 +119,7 @@  | 
            ||
| 119 | 119 | 
                </collectionViewCell>  | 
            
| 120 | 120 | 
                </objects>  | 
            
| 121 | 121 | 
                <resources>  | 
            
| 122 | 
                - <image name="icon-评论" width="36" height="36"/>  | 
            |
| 123 | 
                - <image name="icon-赞" width="36" height="36"/>  | 
            |
| 122 | 
                + <image name="icon-comment" width="36" height="36"/>  | 
            |
| 123 | 
                + <image name="icon-thumbup" width="36" height="36"/>  | 
            |
| 124 | 124 | 
                </resources>  | 
            
| 125 | 125 | 
                </document>  | 
            
                @@ -63,7 +63,7 @@  | 
            ||
| 63 | 63 | 
                <color key="textColor" red="0.98431372549999996" green="0.31372549020000001" blue="0.31372549020000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 64 | 64 | 
                <nil key="highlightedColor"/>  | 
            
| 65 | 65 | 
                </label>  | 
            
| 66 | 
                - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="进入群" translatesAutoresizingMaskIntoConstraints="NO" id="70o-zv-I0l">  | 
            |
| 66 | 
                + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BTN-enterGroup" translatesAutoresizingMaskIntoConstraints="NO" id="70o-zv-I0l">  | 
            |
| 67 | 67 | 
                <rect key="frame" x="9" y="11.5" width="60" height="25"/>  | 
            
| 68 | 68 | 
                <constraints>  | 
            
| 69 | 69 | 
                <constraint firstAttribute="height" constant="25" id="X8l-P5-3Rd"/>  | 
            
                @@ -421,13 +421,12 @@  | 
            ||
| 421 | 421 | 
                </userDefinedRuntimeAttribute>  | 
            
| 422 | 422 | 
                </userDefinedRuntimeAttributes>  | 
            
| 423 | 423 | 
                </textField>  | 
            
| 424 | 
                - <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oef-gW-sEK">  | 
            |
| 424 | 
                + <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oef-gW-sEK">  | 
            |
| 425 | 425 | 
                <rect key="frame" x="303" y="10" width="60" height="36"/>  | 
            
| 426 | 
                - <color key="backgroundColor" red="0.9995151162147522" green="0.16799759864807129" blue="0.24112263321876526" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 427 | 426 | 
                <constraints>  | 
            
| 428 | 427 | 
                <constraint firstAttribute="width" constant="60" id="lDb-Za-vrb"/>  | 
            
| 429 | 428 | 
                </constraints>  | 
            
| 430 | 
                - <state key="normal" title="发表">  | 
            |
| 429 | 
                + <state key="normal" title="发表" backgroundImage="BTN-send">  | 
            |
| 431 | 430 | 
                <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            
| 432 | 431 | 
                </state>  | 
            
| 433 | 432 | 
                <connections>  | 
            
                @@ -460,7 +459,7 @@  | 
            ||
| 460 | 459 | 
                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lCw-zE-NnH">  | 
            
| 461 | 460 | 
                <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>  | 
            
| 462 | 461 | 
                <subviews>  | 
            
| 463 | 
                - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="购买-去水印" translatesAutoresizingMaskIntoConstraints="NO" id="pvN-rn-4Jn">  | 
            |
| 462 | 
                + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-purchase-watermark" translatesAutoresizingMaskIntoConstraints="NO" id="pvN-rn-4Jn">  | 
            |
| 464 | 463 | 
                <rect key="frame" x="123.5" y="0.0" width="48" height="48"/>  | 
            
| 465 | 464 | 
                <constraints>  | 
            
| 466 | 465 | 
                <constraint firstAttribute="height" constant="48" id="2VC-Nk-MXl"/>  | 
            
                @@ -514,6 +513,9 @@  | 
            ||
| 514 | 513 | 
                <constraint firstItem="M7B-fx-M7f" firstAttribute="leading" secondItem="9gv-8b-ehH" secondAttribute="leading" id="svX-zh-yc8"/>  | 
            
| 515 | 514 | 
                </constraints>  | 
            
| 516 | 515 | 
                <viewLayoutGuide key="safeArea" id="9gv-8b-ehH"/>  | 
            
| 516 | 
                + <connections>  | 
            |
| 517 | 
                + <outletCollection property="gestureRecognizers" destination="bqM-7G-5Nw" appends="YES" id="9Q0-1V-Lwz"/>  | 
            |
| 518 | 
                + </connections>  | 
            |
| 517 | 519 | 
                </view>  | 
            
| 518 | 520 | 
                <size key="freeformSize" width="375" height="1000"/>  | 
            
| 519 | 521 | 
                <connections>  | 
            
                @@ -527,6 +529,7 @@  | 
            ||
| 527 | 529 | 
                <outlet property="enterGroupView" destination="gSr-Cm-y1W" id="bNT-Z4-eOG"/>  | 
            
| 528 | 530 | 
                <outlet property="groupAvatar" destination="nng-M9-7cj" id="Y42-Tc-QnV"/>  | 
            
| 529 | 531 | 
                <outlet property="groupName" destination="XM7-FX-tOk" id="ifP-h1-72j"/>  | 
            
| 532 | 
                + <outlet property="keyboardGestureRcognizer" destination="bqM-7G-5Nw" id="uUS-Ox-osk"/>  | 
            |
| 530 | 533 | 
                <outlet property="photoCollectionView" destination="dtf-M8-otl" id="VlY-wa-ekc"/>  | 
            
| 531 | 534 | 
                <outlet property="photoTime" destination="QpI-Mp-URP" id="rJM-TG-fZW"/>  | 
            
| 532 | 535 | 
                <outlet property="sendBtn" destination="oef-gW-sEK" id="3RV-uD-3q1"/>  | 
            
                @@ -541,12 +544,17 @@  | 
            ||
| 541 | 544 | 
                </connections>  | 
            
| 542 | 545 | 
                </viewController>  | 
            
| 543 | 546 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="MFn-pn-5Jb" userLabel="First Responder" sceneMemberID="firstResponder"/>  | 
            
| 544 | 
                - <tapGestureRecognizer id="thN-TP-atT" userLabel="purchaseGestureRecognizer">  | 
            |
| 547 | 
                + <tapGestureRecognizer enabled="NO" id="bqM-7G-5Nw" userLabel="keyboard Gesture Recognizer">  | 
            |
| 548 | 
                + <connections>  | 
            |
| 549 | 
                + <action selector="recyclingKeyboard:" destination="qsT-Pc-Bhh" id="BWK-9f-gfv"/>  | 
            |
| 550 | 
                + </connections>  | 
            |
| 551 | 
                + </tapGestureRecognizer>  | 
            |
| 552 | 
                + <tapGestureRecognizer id="thN-TP-atT" userLabel="purchase Gesture Recognizer">  | 
            |
| 545 | 553 | 
                <connections>  | 
            
| 546 | 554 | 
                <action selector="purchase:" destination="qsT-Pc-Bhh" id="qjs-Ot-XwA"/>  | 
            
| 547 | 555 | 
                </connections>  | 
            
| 548 | 556 | 
                </tapGestureRecognizer>  | 
            
| 549 | 
                - <tapGestureRecognizer id="EHE-XX-kIE" userLabel="enterGroupGestureRecognizer">  | 
            |
| 557 | 
                + <tapGestureRecognizer id="EHE-XX-kIE" userLabel="enter Group Gesture Recognizer">  | 
            |
| 550 | 558 | 
                <connections>  | 
            
| 551 | 559 | 
                <action selector="enterGroup:" destination="qsT-Pc-Bhh" id="dZE-ok-iUM"/>  | 
            
| 552 | 560 | 
                </connections>  | 
            
                @@ -554,122 +562,146 @@  | 
            ||
| 554 | 562 | 
                </objects>  | 
            
| 555 | 563 | 
                <point key="canvasLocation" x="-1452" y="1137.9310344827586"/>  | 
            
| 556 | 564 | 
                </scene>  | 
            
| 557 | 
                - <!--ShareController-->  | 
            |
| 565 | 
                + <!--Share View Controller-->  | 
            |
| 558 | 566 | 
                <scene sceneID="UTe-rv-qoO">  | 
            
| 559 | 567 | 
                <objects>  | 
            
| 560 | 
                - <viewController storyboardIdentifier="ShareController" automaticallyAdjustsScrollViewInsets="NO" id="KnW-jg-4H5" userLabel="ShareController" customClass="ShareController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">  | 
            |
| 568 | 
                + <viewController storyboardIdentifier="ShareViewController" automaticallyAdjustsScrollViewInsets="NO" id="KnW-jg-4H5" customClass="ShareViewController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">  | 
            |
| 561 | 569 | 
                <view key="view" contentMode="scaleToFill" id="rN5-Zb-vwm">  | 
            
| 562 | 570 | 
                <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>  | 
            
| 563 | 571 | 
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>  | 
            
| 564 | 572 | 
                <subviews>  | 
            
| 565 | 
                - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xUW-ue-yp5">  | 
            |
| 573 | 
                + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="edT-EA-xhZ" userLabel="Share View">  | 
            |
| 566 | 574 | 
                <rect key="frame" x="0.0" y="463" width="375" height="77"/>  | 
            
| 567 | 575 | 
                <subviews>  | 
            
| 568 | 
                - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qpb-ag-Zb8">  | 
            |
| 569 | 
                - <rect key="frame" x="30.5" y="0.0" width="54" height="54"/>  | 
            |
| 576 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="itC-HJ-ZaT" userLabel="circle">  | 
            |
| 577 | 
                + <rect key="frame" x="30.5" y="0.0" width="54" height="71"/>  | 
            |
| 578 | 
                + <subviews>  | 
            |
| 579 | 
                + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yKG-rx-pgX">  | 
            |
| 580 | 
                + <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>  | 
            |
| 581 | 
                + <constraints>  | 
            |
| 582 | 
                + <constraint firstAttribute="width" constant="54" id="CuL-Dq-ZdA"/>  | 
            |
| 583 | 
                + <constraint firstAttribute="height" constant="54" id="N1z-wg-bWj"/>  | 
            |
| 584 | 
                + </constraints>  | 
            |
| 585 | 
                + <state key="normal" image="share-wxCircle"/>  | 
            |
| 586 | 
                + <connections>  | 
            |
| 587 | 
                + <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="l8P-Cd-0ds"/>  | 
            |
| 588 | 
                + </connections>  | 
            |
| 589 | 
                + </button>  | 
            |
| 590 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="朋友圈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3pg-qO-r4l">  | 
            |
| 591 | 
                + <rect key="frame" x="5.5" y="54" width="43" height="17"/>  | 
            |
| 592 | 
                + <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 593 | 
                + <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 594 | 
                + <nil key="highlightedColor"/>  | 
            |
| 595 | 
                + </label>  | 
            |
| 596 | 
                + </subviews>  | 
            |
| 570 | 597 | 
                <constraints>  | 
            
| 571 | 
                - <constraint firstAttribute="height" constant="54" id="1zd-z7-bRA"/>  | 
            |
| 572 | 
                - <constraint firstAttribute="width" constant="54" id="la0-N0-BGD"/>  | 
            |
| 598 | 
                + <constraint firstAttribute="width" constant="54" id="7c7-Ce-enL"/>  | 
            |
| 573 | 599 | 
                </constraints>  | 
            
| 574 | 
                - <state key="normal" image="分享-朋友圈"/>  | 
            |
| 575 | 
                - <connections>  | 
            |
| 576 | 
                - <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="3as-uU-Hcb"/>  | 
            |
| 577 | 
                - </connections>  | 
            |
| 578 | 
                - </button>  | 
            |
| 579 | 
                - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6ux-OL-8wy">  | 
            |
| 580 | 
                - <rect key="frame" x="117" y="0.0" width="54" height="54"/>  | 
            |
| 600 | 
                + </stackView>  | 
            |
| 601 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="W6V-MR-s2s" userLabel="weixin">  | 
            |
| 602 | 
                + <rect key="frame" x="117" y="0.0" width="54" height="71"/>  | 
            |
| 603 | 
                + <subviews>  | 
            |
| 604 | 
                + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WHf-tp-9sX">  | 
            |
| 605 | 
                + <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>  | 
            |
| 606 | 
                + <constraints>  | 
            |
| 607 | 
                + <constraint firstAttribute="height" constant="54" id="VCa-wM-G0W"/>  | 
            |
| 608 | 
                + <constraint firstAttribute="width" constant="54" id="bOu-A0-deg"/>  | 
            |
| 609 | 
                + </constraints>  | 
            |
| 610 | 
                + <state key="normal" image="share-wx"/>  | 
            |
| 611 | 
                + <connections>  | 
            |
| 612 | 
                + <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="HIE-st-eD9"/>  | 
            |
| 613 | 
                + </connections>  | 
            |
| 614 | 
                + </button>  | 
            |
| 615 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微信" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ju7-a4-MAb" userLabel="微信">  | 
            |
| 616 | 
                + <rect key="frame" x="12.5" y="54" width="29" height="17"/>  | 
            |
| 617 | 
                + <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 618 | 
                + <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 619 | 
                + <nil key="highlightedColor"/>  | 
            |
| 620 | 
                + </label>  | 
            |
| 621 | 
                + </subviews>  | 
            |
| 581 | 622 | 
                <constraints>  | 
            
| 582 | 
                - <constraint firstAttribute="width" constant="54" id="5X9-C3-GLj"/>  | 
            |
| 583 | 
                - <constraint firstAttribute="height" constant="54" id="8b9-pJ-MY4"/>  | 
            |
| 623 | 
                + <constraint firstAttribute="width" constant="54" id="U1a-2q-73r"/>  | 
            |
| 584 | 624 | 
                </constraints>  | 
            
| 585 | 
                - <state key="normal" image="分享-微信好友"/>  | 
            |
| 586 | 
                - <connections>  | 
            |
| 587 | 
                - <action selector="shareToWei" destination="KnW-jg-4H5" eventType="touchUpInside" id="6Sc-0e-z9l"/>  | 
            |
| 588 | 
                - </connections>  | 
            |
| 589 | 
                - </button>  | 
            |
| 590 | 
                - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x2h-L3-H9s">  | 
            |
| 591 | 
                - <rect key="frame" x="285.5" y="0.0" width="54" height="54"/>  | 
            |
| 625 | 
                + </stackView>  | 
            |
| 626 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="KU1-aO-nLf" userLabel="QQ">  | 
            |
| 627 | 
                + <rect key="frame" x="202" y="0.0" width="54" height="71"/>  | 
            |
| 628 | 
                + <subviews>  | 
            |
| 629 | 
                + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kgp-ou-XXF">  | 
            |
| 630 | 
                + <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>  | 
            |
| 631 | 
                + <constraints>  | 
            |
| 632 | 
                + <constraint firstAttribute="width" constant="54" id="HIs-RN-iJa"/>  | 
            |
| 633 | 
                + <constraint firstAttribute="height" constant="54" id="sjs-5I-q9G"/>  | 
            |
| 634 | 
                + </constraints>  | 
            |
| 635 | 
                + <state key="normal" image="share-QQ"/>  | 
            |
| 636 | 
                + <connections>  | 
            |
| 637 | 
                + <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="uxZ-de-KlE"/>  | 
            |
| 638 | 
                + </connections>  | 
            |
| 639 | 
                + </button>  | 
            |
| 640 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="QQ" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cQk-kV-x1B" userLabel="QQ">  | 
            |
| 641 | 
                + <rect key="frame" x="16.5" y="54" width="21.5" height="17"/>  | 
            |
| 642 | 
                + <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 643 | 
                + <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 644 | 
                + <nil key="highlightedColor"/>  | 
            |
| 645 | 
                + </label>  | 
            |
| 646 | 
                + </subviews>  | 
            |
| 592 | 647 | 
                <constraints>  | 
            
| 593 | 
                - <constraint firstAttribute="width" constant="54" id="JUP-IW-DiC"/>  | 
            |
| 594 | 
                - <constraint firstAttribute="height" constant="54" id="xGJ-At-rzn"/>  | 
            |
| 648 | 
                + <constraint firstAttribute="width" constant="54" id="Meq-Td-X06"/>  | 
            |
| 595 | 649 | 
                </constraints>  | 
            
| 596 | 
                - <state key="normal" image="分享-微博"/>  | 
            |
| 597 | 
                - <connections>  | 
            |
| 598 | 
                - <action selector="shareToWeibo" destination="KnW-jg-4H5" eventType="touchUpInside" id="VYj-hh-MyW"/>  | 
            |
| 599 | 
                - </connections>  | 
            |
| 600 | 
                - </button>  | 
            |
| 601 | 
                - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yqF-ZW-9kd">  | 
            |
| 602 | 
                - <rect key="frame" x="202" y="0.0" width="54" height="54"/>  | 
            |
| 650 | 
                + </stackView>  | 
            |
| 651 | 
                + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="ZLk-gf-Jzh" userLabel="weibo">  | 
            |
| 652 | 
                + <rect key="frame" x="285.5" y="0.0" width="54" height="71"/>  | 
            |
| 653 | 
                + <subviews>  | 
            |
| 654 | 
                + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uCq-aJ-DOY">  | 
            |
| 655 | 
                + <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>  | 
            |
| 656 | 
                + <constraints>  | 
            |
| 657 | 
                + <constraint firstAttribute="width" constant="54" id="9PQ-od-zwh"/>  | 
            |
| 658 | 
                + <constraint firstAttribute="height" constant="54" id="Dd2-ob-7nA"/>  | 
            |
| 659 | 
                + </constraints>  | 
            |
| 660 | 
                + <state key="normal" image="share-weibo"/>  | 
            |
| 661 | 
                + <connections>  | 
            |
| 662 | 
                + <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="inK-7r-8gZ"/>  | 
            |
| 663 | 
                + </connections>  | 
            |
| 664 | 
                + </button>  | 
            |
| 665 | 
                + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微博" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ycS-qw-cbn" userLabel="微博">  | 
            |
| 666 | 
                + <rect key="frame" x="12.5" y="54" width="29" height="17"/>  | 
            |
| 667 | 
                + <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 668 | 
                + <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 669 | 
                + <nil key="highlightedColor"/>  | 
            |
| 670 | 
                + </label>  | 
            |
| 671 | 
                + </subviews>  | 
            |
| 603 | 672 | 
                <constraints>  | 
            
| 604 | 
                - <constraint firstAttribute="height" constant="54" id="3gE-we-sHc"/>  | 
            |
| 605 | 
                - <constraint firstAttribute="width" constant="54" id="j1v-So-HZy"/>  | 
            |
| 673 | 
                + <constraint firstAttribute="width" constant="54" id="JRS-hW-4fd"/>  | 
            |
| 606 | 674 | 
                </constraints>  | 
            
| 607 | 
                - <state key="normal" image="分享-QQ"/>  | 
            |
| 608 | 
                - <connections>  | 
            |
| 609 | 
                - <action selector="shareToQQ" destination="KnW-jg-4H5" eventType="touchUpInside" id="AUu-PL-Vdh"/>  | 
            |
| 610 | 
                - </connections>  | 
            |
| 611 | 
                - </button>  | 
            |
| 612 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="朋友圈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nO4-Ve-OiO">  | 
            |
| 613 | 
                - <rect key="frame" x="36" y="60" width="43" height="17"/>  | 
            |
| 614 | 
                - <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 615 | 
                - <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 616 | 
                - <nil key="highlightedColor"/>  | 
            |
| 617 | 
                - </label>  | 
            |
| 618 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微信" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KS7-62-qGm">  | 
            |
| 619 | 
                - <rect key="frame" x="129.5" y="60" width="29" height="17"/>  | 
            |
| 620 | 
                - <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 621 | 
                - <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 622 | 
                - <nil key="highlightedColor"/>  | 
            |
| 623 | 
                - </label>  | 
            |
| 624 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="QQ" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HHz-QK-Fr2">  | 
            |
| 625 | 
                - <rect key="frame" x="218" y="60" width="22" height="17"/>  | 
            |
| 626 | 
                - <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 627 | 
                - <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 628 | 
                - <nil key="highlightedColor"/>  | 
            |
| 629 | 
                - </label>  | 
            |
| 630 | 
                - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微博" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xa5-ke-ek6">  | 
            |
| 631 | 
                - <rect key="frame" x="298" y="60" width="29" height="17"/>  | 
            |
| 632 | 
                - <fontDescription key="fontDescription" type="system" pointSize="14"/>  | 
            |
| 633 | 
                - <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>  | 
            |
| 634 | 
                - <nil key="highlightedColor"/>  | 
            |
| 635 | 
                - </label>  | 
            |
| 675 | 
                + </stackView>  | 
            |
| 636 | 676 | 
                </subviews>  | 
            
| 637 | 677 | 
                <constraints>  | 
            
| 638 | 
                - <constraint firstItem="HHz-QK-Fr2" firstAttribute="centerX" secondItem="yqF-ZW-9kd" secondAttribute="centerX" id="7l8-1r-eQh"/>  | 
            |
| 639 | 
                - <constraint firstAttribute="bottom" secondItem="HHz-QK-Fr2" secondAttribute="bottom" id="FSC-Ek-9t8"/>  | 
            |
| 640 | 
                - <constraint firstItem="yqF-ZW-9kd" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="KPI-J0-KS4"/>  | 
            |
| 641 | 
                - <constraint firstItem="xa5-ke-ek6" firstAttribute="centerX" secondItem="x2h-L3-H9s" secondAttribute="centerX" id="M27-U4-Q3M"/>  | 
            |
| 642 | 
                - <constraint firstAttribute="height" constant="77" id="N2d-i8-gd3"/>  | 
            |
| 643 | 
                - <constraint firstItem="yqF-ZW-9kd" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="220:180" id="NbH-9w-UIS"/>  | 
            |
| 644 | 
                - <constraint firstAttribute="bottom" secondItem="KS7-62-qGm" secondAttribute="bottom" id="PSC-uY-GlG"/>  | 
            |
| 645 | 
                - <constraint firstItem="x2h-L3-H9s" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="X1L-d4-RO3"/>  | 
            |
| 646 | 
                - <constraint firstItem="qpb-ag-Zb8" firstAttribute="top" secondItem="xUW-ue-yp5" secondAttribute="top" id="Xhp-xq-TAQ"/>  | 
            |
| 647 | 
                - <constraint firstItem="6ux-OL-8wy" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="138:180" id="b7V-Ap-t1L"/>  | 
            |
| 648 | 
                - <constraint firstAttribute="bottom" secondItem="nO4-Ve-OiO" secondAttribute="bottom" id="dJP-qK-Tlu"/>  | 
            |
| 649 | 
                - <constraint firstItem="KS7-62-qGm" firstAttribute="centerX" secondItem="6ux-OL-8wy" secondAttribute="centerX" id="eHD-Mp-ViT"/>  | 
            |
| 650 | 
                - <constraint firstItem="nO4-Ve-OiO" firstAttribute="centerX" secondItem="qpb-ag-Zb8" secondAttribute="centerX" id="gw3-SW-dNJ"/>  | 
            |
| 651 | 
                - <constraint firstItem="x2h-L3-H9s" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="300:180" id="rbh-jj-rpj"/>  | 
            |
| 652 | 
                - <constraint firstItem="qpb-ag-Zb8" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="55:180" id="sWn-3o-xfe"/>  | 
            |
| 653 | 
                - <constraint firstAttribute="bottom" secondItem="xa5-ke-ek6" secondAttribute="bottom" id="uCt-id-dos"/>  | 
            |
| 654 | 
                - <constraint firstItem="6ux-OL-8wy" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="xcU-1M-cr8"/>  | 
            |
| 678 | 
                + <constraint firstItem="KU1-aO-nLf" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="2U4-8e-O3g"/>  | 
            |
| 679 | 
                + <constraint firstItem="ZLk-gf-Jzh" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="300:180" id="3Kp-5r-ImR"/>  | 
            |
| 680 | 
                + <constraint firstItem="itC-HJ-ZaT" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="55:180" id="7D5-Uy-aAS"/>  | 
            |
| 681 | 
                + <constraint firstItem="W6V-MR-s2s" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="B2o-vs-NbY"/>  | 
            |
| 682 | 
                + <constraint firstItem="KU1-aO-nLf" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="220:180" id="HbQ-Ef-QBp"/>  | 
            |
| 683 | 
                + <constraint firstItem="ZLk-gf-Jzh" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="NSS-yv-eAq"/>  | 
            |
| 684 | 
                + <constraint firstItem="itC-HJ-ZaT" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="fRA-ze-0tQ"/>  | 
            |
| 685 | 
                + <constraint firstAttribute="height" constant="77" id="q4w-sh-fN4"/>  | 
            |
| 686 | 
                + <constraint firstItem="W6V-MR-s2s" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="138:180" id="tOg-mT-rNp"/>  | 
            |
| 655 | 687 | 
                </constraints>  | 
            
| 656 | 688 | 
                </view>  | 
            
| 657 | 689 | 
                </subviews>  | 
            
| 658 | 690 | 
                <gestureRecognizers/>  | 
            
| 659 | 691 | 
                <constraints>  | 
            
| 660 | 
                - <constraint firstItem="xUW-ue-yp5" firstAttribute="leading" secondItem="C6P-7J-fWs" secondAttribute="leading" id="Afy-jR-Jec"/>  | 
            |
| 661 | 
                - <constraint firstItem="C6P-7J-fWs" firstAttribute="bottom" secondItem="xUW-ue-yp5" secondAttribute="bottom" constant="127" id="hco-RD-Kle"/>  | 
            |
| 662 | 
                - <constraint firstItem="C6P-7J-fWs" firstAttribute="trailing" secondItem="xUW-ue-yp5" secondAttribute="trailing" id="lAd-Wf-RcE"/>  | 
            |
| 692 | 
                + <constraint firstItem="edT-EA-xhZ" firstAttribute="trailing" secondItem="C6P-7J-fWs" secondAttribute="trailing" id="6h4-ug-H2a"/>  | 
            |
| 693 | 
                + <constraint firstItem="edT-EA-xhZ" firstAttribute="leading" secondItem="C6P-7J-fWs" secondAttribute="leading" id="RS3-mc-Bi6"/>  | 
            |
| 694 | 
                + <constraint firstItem="C6P-7J-fWs" firstAttribute="bottom" secondItem="edT-EA-xhZ" secondAttribute="bottom" constant="127" id="iF3-AG-M9e"/>  | 
            |
| 663 | 695 | 
                </constraints>  | 
            
| 664 | 696 | 
                <viewLayoutGuide key="safeArea" id="C6P-7J-fWs"/>  | 
            
| 665 | 697 | 
                </view>  | 
            
| 666 | 698 | 
                <connections>  | 
            
| 667 | 
                - <outlet property="shareView" destination="xUW-ue-yp5" id="I5g-Zk-9uW"/>  | 
            |
| 699 | 
                + <outlet property="shareView" destination="edT-EA-xhZ" id="DNu-Ue-V2y"/>  | 
            |
| 668 | 700 | 
                </connections>  | 
            
| 669 | 701 | 
                </viewController>  | 
            
| 670 | 702 | 
                <placeholder placeholderIdentifier="IBFirstResponder" id="9LO-35-FRH" userLabel="First Responder" sceneMemberID="firstResponder"/>  | 
            
| 671 | 703 | 
                </objects>  | 
            
| 672 | 
                - <point key="canvasLocation" x="-513" y="1287"/>  | 
            |
| 704 | 
                + <point key="canvasLocation" x="-73" y="469"/>  | 
            |
| 673 | 705 | 
                </scene>  | 
            
| 674 | 706 | 
                <!--PhotoPreviewViewController-->  | 
            
| 675 | 707 | 
                <scene sceneID="yhk-2u-fiu">  | 
            
                @@ -779,20 +811,21 @@  | 
            ||
| 779 | 811 | 
                <resources>  | 
            
| 780 | 812 | 
                <image name="BTN-comment" width="138" height="138"/>  | 
            
| 781 | 813 | 
                <image name="BTN-download" width="96" height="96"/>  | 
            
| 814 | 
                + <image name="BTN-enterGroup" width="114" height="60"/>  | 
            |
| 782 | 815 | 
                <image name="BTN-rotate" width="96" height="96"/>  | 
            
| 816 | 
                + <image name="BTN-send" width="608" height="304"/>  | 
            |
| 783 | 817 | 
                <image name="BTN-share" width="138" height="138"/>  | 
            
| 784 | 818 | 
                <image name="BTN-thumbup" width="192" height="192"/>  | 
            
| 785 | 819 | 
                <image name="defaultAvatar" width="240" height="240"/>  | 
            
| 786 | 820 | 
                <image name="icon-comment" width="36" height="36"/>  | 
            
| 821 | 
                + <image name="icon-purchase-watermark" width="96" height="96"/>  | 
            |
| 787 | 822 | 
                <image name="icon-thumbup" width="36" height="36"/>  | 
            
| 788 | 823 | 
                <image name="icon-time" width="36" height="36"/>  | 
            
| 789 | 824 | 
                <image name="list-arrow" width="24" height="36"/>  | 
            
| 790 | 825 | 
                <image name="navigation-back" width="36" height="72"/>  | 
            
| 791 | 
                - <image name="分享-QQ" width="162" height="162"/>  | 
            |
| 792 | 
                - <image name="分享-微信好友" width="162" height="162"/>  | 
            |
| 793 | 
                - <image name="分享-微博" width="162" height="162"/>  | 
            |
| 794 | 
                - <image name="分享-朋友圈" width="162" height="162"/>  | 
            |
| 795 | 
                - <image name="购买-去水印" width="96" height="96"/>  | 
            |
| 796 | 
                - <image name="进入群" width="114" height="60"/>  | 
            |
| 826 | 
                + <image name="share-QQ" width="162" height="162"/>  | 
            |
| 827 | 
                + <image name="share-weibo" width="162" height="162"/>  | 
            |
| 828 | 
                + <image name="share-wx" width="162" height="162"/>  | 
            |
| 829 | 
                + <image name="share-wxCircle" width="162" height="162"/>  | 
            |
| 797 | 830 | 
                </resources>  | 
            
| 798 | 831 | 
                </document>  | 
            
                @@ -14,7 +14,7 @@ final class PhotoDetailCoordinator: Coordinator {
               | 
            ||
| 14 | 14 | 
                let photoDetailViewController: PhotoDetailViewController  | 
            
| 15 | 15 | 
                let shareListViewModel: PhotoDetailListViewModel  | 
            
| 16 | 16 | 
                 | 
            
| 17 | 
                - fileprivate var coordinators = [String: Coordinator]()  | 
            |
| 17 | 
                + fileprivate var coordinators = [CoordinatorKey: Coordinator]()  | 
            |
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                init(_ photoDetailVC: PhotoDetailViewController,  | 
            
| 20 | 20 | 
                nav: UINavigationController,  | 
            
                @@ -42,7 +42,7 @@ extension PhotoDetailCoordinator: PhotoDetailViewModelDelegate {
               | 
            ||
| 42 | 42 | 
                vc.viewModel = GroupViewModel(groupItem: item)  | 
            
| 43 | 43 | 
                let coordinator = GroupCoordinator(vc,  | 
            
| 44 | 44 | 
                navigationController: navigationController)  | 
            
| 45 | 
                - coordinators["group"] = coordinator  | 
            |
| 45 | 
                + coordinators[.group] = coordinator  | 
            |
| 46 | 46 | 
                 | 
            
| 47 | 47 | 
                navigationController.pushViewController(vc)  | 
            
| 48 | 48 | 
                }  | 
            
                @@ -44,6 +44,7 @@ final class PhotoDetailViewController: UIViewController {
               | 
            ||
| 44 | 44 | 
                @IBOutlet weak var waterMarkImage: UIImageView!  | 
            
| 45 | 45 | 
                @IBOutlet weak var waterMarkLabel: UILabel!  | 
            
| 46 | 46 | 
                 | 
            
| 47 | 
                + @IBOutlet var keyboardGestureRcognizer: UITapGestureRecognizer!  | 
            |
| 47 | 48 | 
                @IBOutlet weak var thumbupViewHeightConstraint: NSLayoutConstraint!  | 
            
| 48 | 49 | 
                @IBOutlet weak var commentEditYConstraint: NSLayoutConstraint!  | 
            
| 49 | 50 | 
                 | 
            
                @@ -56,6 +57,7 @@ final class PhotoDetailViewController: UIViewController {
               | 
            ||
| 56 | 57 | 
                // MARK: view function  | 
            
| 57 | 58 | 
                     override func viewDidLoad() {
               | 
            
| 58 | 59 | 
                super.viewDidLoad()  | 
            
| 60 | 
                + title = "详情"  | 
            |
| 59 | 61 | 
                binding()  | 
            
| 60 | 62 | 
                setup()  | 
            
| 61 | 63 | 
                }  | 
            
                @@ -80,19 +82,13 @@ final class PhotoDetailViewController: UIViewController {
               | 
            ||
| 80 | 82 | 
                }  | 
            
| 81 | 83 | 
                }  | 
            
| 82 | 84 | 
                 | 
            
| 83 | 
                -//MARK textField delegate  | 
            |
| 84 | 
                -extension PhotoDetailViewController: UIGestureRecognizerDelegate {
               | 
            |
| 85 | 
                - // MARK: textField  | 
            |
| 86 | 
                -  | 
            |
| 87 | 
                -    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
               | 
            |
| 88 | 
                - return commentTextField.isFirstResponder  | 
            |
| 89 | 
                - }  | 
            |
| 90 | 
                -  | 
            |
| 91 | 
                -}  | 
            |
| 92 | 
                -  | 
            |
| 93 | 
                -  | 
            |
| 94 | 85 | 
                /// bind storyboard gesture action  | 
            
| 95 | 86 | 
                 extension PhotoDetailViewController {
               | 
            
| 87 | 
                +  | 
            |
| 88 | 
                +    @IBAction func recyclingKeyboard(_ sender: UITapGestureRecognizer) {
               | 
            |
| 89 | 
                + commentTextField.resignFirstResponder()  | 
            |
| 90 | 
                + }  | 
            |
| 91 | 
                +  | 
            |
| 96 | 92 | 
                     @IBAction func purchase(_ sender: UITapGestureRecognizer) {
               | 
            
| 97 | 93 | 
                 | 
            
| 98 | 94 | 
                }  | 
            
                @@ -105,7 +101,7 @@ extension PhotoDetailViewController {
               | 
            ||
| 105 | 101 | 
                /// bind storyboard button action  | 
            
| 106 | 102 | 
                 extension PhotoDetailViewController {
               | 
            
| 107 | 103 | 
                     @IBAction func share() {
               | 
            
| 108 | 
                - let ctl = UIStoryboard.photoDetail.instantiateController(ShareController.self)  | 
            |
| 104 | 
                + let ctl = UIStoryboard.photoDetail.instantiateController(ShareViewController.self)  | 
            |
| 109 | 105 | 
                ctl.shareContent = "我使用拍爱分享了一张美图,你也快来试试吧"  | 
            
| 110 | 106 | 
                // ctl.shareImgUrlThumb = datas[currentPhotoIndex].photo_thumbnail_url  | 
            
| 111 | 107 | 
                // ctl.shareUrl = datas[currentPhotoIndex].photo_share_url  | 
            
                @@ -283,6 +279,9 @@ extension PhotoDetailViewController {
               | 
            ||
| 283 | 279 | 
                .notification(UIResponder.keyboardWillShowNotification)  | 
            
| 284 | 280 | 
                .takeUntil(self.rx.deallocated)  | 
            
| 285 | 281 | 
                             .subscribe { [unowned self] notification in
               | 
            
| 282 | 
                +  | 
            |
| 283 | 
                + self.keyboardGestureRcognizer.isEnabled = true  | 
            |
| 284 | 
                +  | 
            |
| 286 | 285 | 
                guard let userInfo = notification.element?.userInfo,  | 
            
| 287 | 286 | 
                let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,  | 
            
| 288 | 287 | 
                let timeInterval = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,  | 
            
                @@ -301,6 +300,8 @@ extension PhotoDetailViewController {
               | 
            ||
| 301 | 300 | 
                .notification(UIResponder.keyboardWillHideNotification)  | 
            
| 302 | 301 | 
                .takeUntil(self.rx.deallocated)  | 
            
| 303 | 302 | 
                             .subscribe { [unowned self] notification in
               | 
            
| 303 | 
                + self.keyboardGestureRcognizer.isEnabled = false  | 
            |
| 304 | 
                +  | 
            |
| 304 | 305 | 
                guard let userInfo = notification.element?.userInfo,  | 
            
| 305 | 306 | 
                let timeInterval = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,  | 
            
| 306 | 307 | 
                let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int  | 
            
                @@ -1,5 +1,5 @@  | 
            ||
| 1 | 1 | 
                //  | 
            
| 2 | 
                -// ShareController.swift  | 
            |
| 2 | 
                +// ShareViewController.swift  | 
            |
| 3 | 3 | 
                // PaiAi  | 
            
| 4 | 4 | 
                //  | 
            
| 5 | 5 | 
                // Created by zhengjianfei on 16/4/7.  | 
            
                @@ -10,24 +10,24 @@ import UIKit  | 
            ||
| 10 | 10 | 
                import PaiaiDataKit  | 
            
| 11 | 11 | 
                import PaiaiUIKit  | 
            
| 12 | 12 | 
                 | 
            
| 13 | 
                -final class ShareController: UIViewController {
               | 
            |
| 13 | 
                +final class ShareViewController: AlertViewController {
               | 
            |
| 14 | 14 | 
                 | 
            
| 15 | 
                - // MARK: Storyboard property  | 
            |
| 16 | 15 | 
                @IBOutlet weak var shareView: UIView!  | 
            
| 17 | 
                -  | 
            |
| 16 | 
                +  | 
            |
| 17 | 
                +    override var animationView: UIView? {
               | 
            |
| 18 | 
                + return shareView  | 
            |
| 19 | 
                + }  | 
            |
| 20 | 
                +  | 
            |
| 21 | 
                +    override var style: AlertViewController.Style {
               | 
            |
| 22 | 
                + return .actionSheet  | 
            |
| 23 | 
                + }  | 
            |
| 24 | 
                +  | 
            |
| 18 | 25 | 
                // MARK: parameter property  | 
            
| 19 | 26 | 
                var shareContent: String = ""  | 
            
| 20 | 27 | 
                var shareImg: UIImage?  | 
            
| 21 | 28 | 
                lazy var shareImgUrlThumb: String = ""  | 
            
| 22 | 29 | 
                lazy var shareUrl: String = ""  | 
            
| 23 | 
                -// let transitioning = FFTransitioning(alertStyle: .actionSheet)  | 
            |
| 24 | 
                -  | 
            |
| 25 | 
                -    required init?(coder aDecoder: NSCoder) {
               | 
            |
| 26 | 
                - super.init(coder: aDecoder)  | 
            |
| 27 | 
                -// transitioningDelegate = transitioning  | 
            |
| 28 | 
                - }  | 
            |
| 29 | 
                -  | 
            |
| 30 | 
                - // MARK: view function  | 
            |
| 30 | 
                +  | 
            |
| 31 | 31 | 
                     override func viewDidLoad() {
               | 
            
| 32 | 32 | 
                super.viewDidLoad()  | 
            
| 33 | 33 | 
                let imageView = UIImageView()  | 
            
                @@ -1,29 +0,0 @@  | 
            ||
| 1 | 
                -//  | 
            |
| 2 | 
                -// ShareView.swift  | 
            |
| 3 | 
                -// Paiai_iOS  | 
            |
| 4 | 
                -//  | 
            |
| 5 | 
                -// Created by ffib on 2019/3/21.  | 
            |
| 6 | 
                -// Copyright © 2019 yb. All rights reserved.  | 
            |
| 7 | 
                -//  | 
            |
| 8 | 
                -  | 
            |
| 9 | 
                -import UIKit  | 
            |
| 10 | 
                -  | 
            |
| 11 | 
                -class ShareView: UIView {
               | 
            |
| 12 | 
                -  | 
            |
| 13 | 
                -}  | 
            |
| 14 | 
                -  | 
            |
| 15 | 
                -  | 
            |
| 16 | 
                -  | 
            |
| 17 | 
                -extension ShareView {
               | 
            |
| 18 | 
                -  | 
            |
| 19 | 
                -    func activateConstraints() {
               | 
            |
| 20 | 
                -  | 
            |
| 21 | 
                - }  | 
            |
| 22 | 
                -  | 
            |
| 23 | 
                -    func activateConstraintsShareView() {
               | 
            |
| 24 | 
                -        guard let superView = superview else { return }
               | 
            |
| 25 | 
                -  | 
            |
| 26 | 
                - self.translatesAutoresizingMaskIntoConstraints = false  | 
            |
| 27 | 
                -  | 
            |
| 28 | 
                - }  | 
            |
| 29 | 
                -}  |