ld"> 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 */,

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


BIN
PaiAi/Paiai/Assets.xcassets/.DS_Store


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-comment.imageset/icon-评论-2.png → PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/icon-评论-2.png


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-thumbup.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-thumbup.imageset/icon-赞-2.png → PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/icon-赞-2.png


+ 21 - 0
PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Contents.json

@@ -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
+}

BIN
PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Logo@3x.png


BIN
PaiAi/Paiai/Assets.xcassets/MainPage/.DS_Store


+ 0 - 21
PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/Contents.json

@@ -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
-}

BIN
PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/FEED_λ_@3x.png


PaiAi/Paiai/Assets.xcassets/MainPage/Contents.json → PaiAi/Paiai/Assets.xcassets/module/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-新增.imageset/BTN-新增.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/BTN-新增.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-新增.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-拍照.imageset/BTN-拍照.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/BTN-拍照.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-拍照.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/delete.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/delete.imageset/delete.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/delete.png


PaiAi/Paiai/Assets.xcassets/MainPage/闪光灯-默认70%透明度,按压100%.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/闪光灯-默认70%透明度,按压100%.imageset/闪光灯-默认70%透明度,按压100%.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/闪光灯-默认70%透明度,按压100%.png


PaiAi/Paiai/Assets.xcassets/MainPage/从相册选取-默认70%透明度,按压100%.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/从相册选取-默认70%透明度,按压100%.imageset/从相册选取-默认70%透明度,按压100%.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/从相册选取-默认70%透明度,按压100%.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-扫码.imageset/BTN-扫码.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/BTN-扫码.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-扫码.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/空白页-无内容.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/空白页-无内容.imageset/空白页-无内容.png → PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/空白页-无内容.png


PaiAi/Paiai/Assets.xcassets/login/微信.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/login/微信.imageset/FE4EEB304DC91AB1789FFFA9B1AA4A03.png → PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/FE4EEB304DC91AB1789FFFA9B1AA4A03.png


PaiAi/Paiai/Assets.xcassets/login/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png → PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide1.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png → PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide2.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png → PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide3.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-comment.imageset/消息-评论.png → PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/消息-评论.png


PaiAi/Paiai/Assets.xcassets/message/message-system.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-system.imageset/消息-官方提示.png → PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/消息-官方提示.png


PaiAi/Paiai/Assets.xcassets/message/message-thumpub.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-thumpub.imageset/消息-赞.png → PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/消息-赞.png


PaiAi/Paiai/Assets.xcassets/MainPage/注销切图.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/注销切图.imageset/注销切图@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/注销切图@3x.png


PaiAi/Paiai/Assets.xcassets/mine/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-contactUs.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-contactUs.imageset/我的-客服 @3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/我的-客服 @3x.png


PaiAi/Paiai/Assets.xcassets/mine/about-score.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-score.imageset/关于-用户协议 @3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/关于-用户协议 @3x.png


PaiAi/Paiai/Assets.xcassets/mine/about-userAgreement.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-userAgreement.imageset/Contents.json


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


PaiAi/Paiai/Assets.xcassets/mine/mine-about.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-about.imageset/关于@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/关于@3x.png


PaiAi/Paiai/Assets.xcassets/mine/mine-feedback.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-feedback.imageset/我的-意见反馈 copy.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/我的-意见反馈 copy.png


PaiAi/Paiai/Assets.xcassets/mine/mine-group.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-group.imageset/群组@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/群组@3x.png


PaiAi/Paiai/Assets.xcassets/mine/mine-order.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-order.imageset/订单@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/订单@3x.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-comment.imageset/BTN-评论.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/BTN-评论.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-download.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-download.imageset/大图模式-下载.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/大图模式-下载.png


PaiAi/Paiai/Assets.xcassets/photoDetail/进入群.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/进入群.imageset/进入群.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/进入群.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-rotate.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-rotate.imageset/旋转.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/旋转.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-share.imageset/BTN-分享.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/BTN-分享.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-share.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-thumbup.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-thumbup.imageset/Oval 491.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Oval 491.png


PaiAi/Paiai/Assets.xcassets/photoDetail/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-去水印.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-去水印.imageset/购买-去水印.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/购买-去水印.png


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-time.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-time.imageset/icon-记录.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/icon-记录.png


PaiAi/Paiai/Assets.xcassets/photoDetail/purchase-background.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/purchase-background.imageset/获取高清图.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/获取高清图.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-QQ.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-QQ.imageset/分享-QQ.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/分享-QQ.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-weibo.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-weibo.imageset/分享-微博.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/分享-微博.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wx.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wx.imageset/分享-微信好友.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/分享-微信好友.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wxCircle.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wxCircle.imageset/分享-朋友圈.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/分享-朋友圈.png


PaiAi/Paiai/Assets.xcassets/photoDetail/去除水印.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/去除水印.imageset/去除水印.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/去除水印.png


PaiAi/Paiai/Assets.xcassets/MainPage/提示弹窗-勾.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/提示弹窗-勾.imageset/提示弹窗-勾.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/提示弹窗-勾.png


PaiAi/Paiai/Assets.xcassets/MainPage/收起.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/收起.imageset/列表箭头.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/列表箭头.png


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-HD.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-HD.imageset/购买-HD.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/购买-HD.png


BIN
PaiAi/PaiaiDataKit/.DS_Store


+ 1 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupRemoteAPI.swift

@@ -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
     }

+ 1 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/MessageRemoteAPI.swift

@@ -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
     }

+ 2 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/OrderRemoteAPI.swift

@@ -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
     }

+ 4 - 6
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetworkApi.swift

@@ -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):

+ 0 - 42
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/Result.swift

@@ -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
-}

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

@@ -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
 }

+ 10 - 14
PaiAi/PaiaiDataKit/PresentLayer/Message/MessageListViewModel.swift

@@ -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) {

+ 1 - 6
PaiAi/PaiaiDataKit/PresentLayer/Mine/MineGroupViewModel.swift

@@ -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) {

+ 4 - 3
PaiAi/PaiaiDataKit/Resuable/DataError.swift

@@ -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 {}

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/FadeToastAnimator.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 class FadeToastAnimator: ToastAnimator {
12 12
     func toastIn(in view: UIView, completion: ((Bool) -> Void)?) {

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/Toast.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 private let globalInstance = Toast()
12 12
 

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastAnimator.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public protocol ToastAnimator {
12 12
     func toastIn(in view: UIView, completion: ((Bool) -> Void)?)

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastOption.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public struct ToastOption {
12 12
     var tintColor: UIColor = UIColor.white

+ 6 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastView.swift

@@ -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

+ 6 - 0
PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIImageExt.swift

@@ -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)

+ 3 - 22
PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UITextViewExt.swift

@@ -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
     

+ 0 - 187
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/FFAlertController.swift

@@ -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
-//}

+ 0 - 21
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertControllerRepresentable.swift

@@ -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
-//}

+ 0 - 29
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertLabel.swift

@@ -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
-}

+ 0 - 41
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFSheetActionCell.swift

@@ -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 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/ActionSheetView.swift

@@ -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:

+ 1 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/AlertItem.swift

@@ -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)

+ 0 - 32
PaiAi/PaiaiUIKit/Reusable/UIKit/FFProgress.swift

@@ -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
-}

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

@@ -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
         }

+ 6 - 0
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift

@@ -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
 }

+ 5 - 0
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift

@@ -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)

+ 0 - 6
PaiAi/Paiai_iOS/App/AppCoordinator.swift

@@ -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

+ 18 - 0
PaiAi/Paiai_iOS/App/CoordinatorKey.swift

@@ -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
+}

+ 2 - 2
PaiAi/Paiai_iOS/App/Group/Group.storyboard

@@ -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>

+ 3 - 3
PaiAi/Paiai_iOS/App/Group/GroupCoordinator.swift

@@ -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
     }

+ 2 - 2
PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetail.storyboard

@@ -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"/>

+ 2 - 1
PaiAi/Paiai_iOS/App/Group/GroupViewController.swift

@@ -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)

+ 0 - 7
PaiAi/Paiai_iOS/App/Home/HomeCoordinator.swift

@@ -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

+ 2 - 1
PaiAi/Paiai_iOS/App/Home/HomeViewController.swift

@@ -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
     }

+ 10 - 10
PaiAi/Paiai_iOS/App/Home/Main.storyboard

@@ -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>

+ 11 - 7
PaiAi/Paiai_iOS/App/Message/Message.storyboard

@@ -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"/>

+ 20 - 16
PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift

@@ -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
     

+ 95 - 121
PaiAi/Paiai_iOS/App/Mine/Mine.storyboard

@@ -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>

+ 2 - 2
PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift

@@ -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 - 8
PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

@@ -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)!}

+ 4 - 3
PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift

@@ -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
     }

+ 8 - 10
PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift

@@ -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)

+ 4 - 4
PaiAi/Paiai_iOS/App/PhotoCell.xib

@@ -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>

+ 131 - 98
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetail.storyboard

@@ -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>

+ 2 - 2
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift

@@ -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
     }

+ 13 - 12
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift

@@ -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

+ 12 - 12
PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift

@@ -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()

+ 0 - 29
PaiAi/Paiai_iOS/App/PhotoDetail/ShareView.swift

@@ -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
-}

kodo - Gogs: Go Git Service

Nav apraksta

Brightcells: 8263625d9c new website 10 gadi atpakaļ
..
migrations 3114315824 add pc official website 10 gadi atpakaļ
static 8263625d9c new website 10 gadi atpakaļ
templates 8d6858fb00 adjust website content 10 gadi atpakaļ
__init__.py 3114315824 add pc official website 10 gadi atpakaļ
admin.py fabef63211 set line_length=200 for isort 10 gadi atpakaļ
models.py fabef63211 set line_length=200 for isort 10 gadi atpakaļ
tests.py fabef63211 set line_length=200 for isort 10 gadi atpakaļ
views.py fab8ef6c5e add term of service page 10 gadi atpakaļ