e" href="#diff-125">PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift
  • 0 6
      PaiAi/Paiai_iOS/App/AppCoordinator.swift
  • 18 0
      PaiAi/Paiai_iOS/App/CoordinatorKey.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Group/Group.storyboard
  • 3 3
      PaiAi/Paiai_iOS/App/Group/GroupCoordinator.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetail.storyboard
  • 2 1
      PaiAi/Paiai_iOS/App/Group/GroupViewController.swift
  • 0 7
      PaiAi/Paiai_iOS/App/Home/HomeCoordinator.swift
  • 2 1
      PaiAi/Paiai_iOS/App/Home/HomeViewController.swift
  • 10 10
      PaiAi/Paiai_iOS/App/Home/Main.storyboard
  • 11 7
      PaiAi/Paiai_iOS/App/Message/Message.storyboard
  • 20 16
      PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift
  • 95 121
      PaiAi/Paiai_iOS/App/Mine/Mine.storyboard
  • 2 2
      PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift
  • 14 8
      PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift
  • 4 3
      PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift
  • 8 10
      PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift
  • 4 4
      PaiAi/Paiai_iOS/App/PhotoCell.xib
  • 131 98
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetail.storyboard
  • 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift
  • 13 12
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift
  • 12 12
      PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift
  • 0 29
      PaiAi/Paiai_iOS/App/PhotoDetail/ShareView.swift
  • 二进制
    PaiAi/.DS_Store


    + 19 - 55
    PaiAi/Paiai.xcodeproj/project.pbxproj

    @@ -97,7 +97,6 @@
    97 97
     		0513102521CA1B67004EF1BE /* NetworkApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */; };
    98 98
     		0513102621CA1B67004EF1BE /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34B1F7E4024009E4ED2 /* Resource.swift */; };
    99 99
     		0513102821CA1B67004EF1BE /* NetWorkCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */; };
    100
    -		0513102921CA1B67004EF1BE /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0594845921B66DA500074EFC /* Result.swift */; };
    101 100
     		0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD61E70047E0006FEE0 /* HomeRepository.swift */; };
    102 101
     		0513102C21CA1B67004EF1BE /* OrderRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAED1E70047E0006FEE0 /* OrderRepository.swift */; };
    103 102
     		0513102D21CA1B67004EF1BE /* GroupPhotoRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */; };
    @@ -138,14 +137,10 @@
    138 137
     		0513106721CA290B004EF1BE /* DateExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543274721C68C1900C6388D /* DateExt.swift */; };
    139 138
     		0513106921CA34D6004EF1BE /* GroupDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */; };
    140 139
     		0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */; };
    141
    -		0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106D21CA3907004EF1BE /* FFAlertController.swift */; };
    142 140
     		0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106F21CA3907004EF1BE /* CancelAlertAction.swift */; };
    143
    -		0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */; };
    144 141
     		0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */; };
    145 142
     		0513108021CA3907004EF1BE /* ActionSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107221CA3907004EF1BE /* ActionSheetView.swift */; };
    146 143
     		0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */; };
    147
    -		0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107421CA3907004EF1BE /* FFSheetActionCell.swift */; };
    148
    -		0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107521CA3907004EF1BE /* FFAlertLabel.swift */; };
    149 144
     		0513109321CA3915004EF1BE /* ColorQR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108A21CA3914004EF1BE /* ColorQR.swift */; };
    150 145
     		0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */; };
    151 146
     		0513109521CA3915004EF1BE /* QRCodeScanDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */; };
    @@ -166,7 +161,6 @@
    166 161
     		051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543276621C68C3300C6388D /* UIImageView+Kingfisher.swift */; };
    167 162
     		051310B821CB6958004EF1BE /* UserInfoStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310B721CB6958004EF1BE /* UserInfoStore.swift */; };
    168 163
     		051310C021CB6EF4004EF1BE /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310BF21CB6EF4004EF1BE /* UserInfo.swift */; };
    169
    -		0521145421F083F20047C55A /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
    170 164
     		052BF1C821E344020010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
    171 165
     		052BF1C921E344280010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
    172 166
     		0530951B221AB3EC00408D34 /* GroupDetailMemeberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0530951A221AB3EC00408D34 /* GroupDetailMemeberView.swift */; };
    @@ -174,11 +168,7 @@
    174 168
     		0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0535D6DA21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift */; };
    175 169
     		053E126521F1718E00A64893 /* PageOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126421F1718E00A64893 /* PageOption.swift */; };
    176 170
     		053E126721F1719F00A64893 /* PageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126621F1719F00A64893 /* PageItem.swift */; };
    177
    -		053E126921F171C500A64893 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
    178
    -		053E126B21F5696E00A64893 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
    179
    -		053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
    180
    -		053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
    181
    -		053E127521F5A72000A64893 /* DataError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* DataError.swift */; };
    171
    +		053E127521F5A72000A64893 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* Error.swift */; };
    182 172
     		053E127821F5B6E400A64893 /* AlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127721F5B6E400A64893 /* AlertController.swift */; };
    183 173
     		0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E7F321CB911200A42807 /* UserInfoViewModel.swift */; };
    184 174
     		0543E80721D0CDFA00A42807 /* MineFeedbackViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80621D0CDFA00A42807 /* MineFeedbackViewModel.swift */; };
    @@ -186,7 +176,6 @@
    186 176
     		0543E80D21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80C21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift */; };
    187 177
     		0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */; };
    188 178
     		0546D9852242460700742939 /* OriginData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D9842242460700742939 /* OriginData.swift */; };
    189
    -		0546D98E2243782300742939 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D98D2243782300742939 /* ShareView.swift */; };
    190 179
     		054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */; };
    191 180
     		054B6C46223F966A00939FE6 /* RxDataSources.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05130FC421CA1997004EF1BE /* RxDataSources.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
    192 181
     		05594BFF2240BEDE002D4910 /* PhotoDetailListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05594BFE2240BEDE002D4910 /* PhotoDetailListViewModel.swift */; };
    @@ -217,6 +206,12 @@
    217 206
     		0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */; };
    218 207
     		0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */; };
    219 208
     		0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */; };
    209
    +		058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */; };
    210
    +		058D0CA02249FCF6006CA488 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
    211
    +		058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
    212
    +		058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
    213
    +		058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
    214
    +		058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
    220 215
     		059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B589E21F7103100FA64C2 /* AlertItem.swift */; };
    221 216
     		059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A521F7235D00FA64C2 /* AlertAction.swift */; };
    222 217
     		059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A721F83B1600FA64C2 /* CenterCancelItem.swift */; };
    @@ -370,14 +365,10 @@
    370 365
     		0513106121CA22B5004EF1BE /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = "<group>"; };
    371 366
     		0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailCoordinator.swift; sourceTree = "<group>"; };
    372 367
     		0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailCoordinator.swift; sourceTree = "<group>"; };
    373
    -		0513106D21CA3907004EF1BE /* FFAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertController.swift; sourceTree = "<group>"; };
    374 368
     		0513106F21CA3907004EF1BE /* CancelAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CancelAlertAction.swift; sourceTree = "<group>"; };
    375
    -		0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertControllerRepresentable.swift; sourceTree = "<group>"; };
    376 369
     		0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DestructiveAlertAction.swift; sourceTree = "<group>"; };
    377 370
     		0513107221CA3907004EF1BE /* ActionSheetView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetView.swift; sourceTree = "<group>"; };
    378 371
     		0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmAlertAction.swift; sourceTree = "<group>"; };
    379
    -		0513107421CA3907004EF1BE /* FFSheetActionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFSheetActionCell.swift; sourceTree = "<group>"; };
    380
    -		0513107521CA3907004EF1BE /* FFAlertLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertLabel.swift; sourceTree = "<group>"; };
    381 372
     		0513108A21CA3914004EF1BE /* ColorQR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorQR.swift; sourceTree = "<group>"; };
    382 373
     		0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeMaskView.swift; sourceTree = "<group>"; };
    383 374
     		0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeScanDelegate.swift; sourceTree = "<group>"; };
    @@ -403,7 +394,7 @@
    403 394
     		053E126A21F5696E00A64893 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = "<group>"; };
    404 395
     		053E126C21F5767300A64893 /* ToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastAnimator.swift; sourceTree = "<group>"; };
    405 396
     		053E126E21F5774700A64893 /* FadeToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FadeToastAnimator.swift; sourceTree = "<group>"; };
    406
    -		053E127421F5A72000A64893 /* DataError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataError.swift; sourceTree = "<group>"; };
    397
    +		053E127421F5A72000A64893 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
    407 398
     		053E127721F5B6E400A64893 /* AlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertController.swift; sourceTree = "<group>"; };
    408 399
     		0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupPhotoRepository.swift; sourceTree = "<group>"; };
    409 400
     		0540C8B21F8CA07E0044FCC5 /* FileModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileModel.swift; sourceTree = "<group>"; };
    @@ -428,7 +419,6 @@
    428 419
     		0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailItem.swift; sourceTree = "<group>"; };
    429 420
     		05468AF11F8B73A000B8F469 /* PhotoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoItem.swift; sourceTree = "<group>"; };
    430 421
     		0546D9842242460700742939 /* OriginData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OriginData.swift; sourceTree = "<group>"; };
    431
    -		0546D98D2243782300742939 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
    432 422
     		054863661FA326CB00A39DA0 /* PhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoCell.swift; sourceTree = "<group>"; };
    433 423
     		054863671FA326CB00A39DA0 /* PhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhotoCell.xib; sourceTree = "<group>"; };
    434 424
     		054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailRemoteAPI.swift; sourceTree = "<group>"; };
    @@ -459,8 +449,8 @@
    459 449
     		0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentAnimatorDelegate.swift; sourceTree = "<group>"; };
    460 450
     		0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentExtension.swift; sourceTree = "<group>"; };
    461 451
     		0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentViewController.swift; sourceTree = "<group>"; };
    452
    +		058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorKey.swift; sourceTree = "<group>"; };
    462 453
     		0594845721B528FE00074EFC /* Interfaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = "<group>"; };
    463
    -		0594845921B66DA500074EFC /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
    464 454
     		059AA5D921BA1A2000485188 /* MessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCoordinator.swift; sourceTree = "<group>"; };
    465 455
     		059AA62821BA855000485188 /* MessageRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRepository.swift; sourceTree = "<group>"; };
    466 456
     		059AA62A21BA85B000485188 /* MessageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewModel.swift; sourceTree = "<group>"; };
    @@ -662,11 +652,9 @@
    662 652
     			children = (
    663 653
     				055BB53F220AEA4E009548AA /* Nibless */,
    664 654
     				0584FD7A21FABA0300FA1E3E /* Present */,
    665
    -				0521145521F083FA0047C55A /* Toast */,
    666 655
     				05C8D21E21EDD5A80001E847 /* NavigationBar */,
    667 656
     				05C8D21721ED911D0001E847 /* NavigationBack */,
    668 657
     				0513108921CA3914004EF1BE /* QR */,
    669
    -				0513106C21CA3907004EF1BE /* Alert */,
    670 658
     				05130F4E21C94C12004EF1BE /* AlertViewController */,
    671 659
     				05130F6121C94C79004EF1BE /* PageViewController */,
    672 660
     				05130F5F21C94C79004EF1BE /* SideViewController */,
    @@ -806,6 +794,7 @@
    806 794
     		05130FBA21C9EE82004EF1BE /* App */ = {
    807 795
     			isa = PBXGroup;
    808 796
     			children = (
    797
    +				058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */,
    809 798
     				050E210F21B8CE8A008E1352 /* AppCoordinator.swift */,
    810 799
     				05087F6721B8F9530024A117 /* ContainerViewController.swift */,
    811 800
     				A69FFA791E7002970006FEE0 /* LoginViewController.swift */,
    @@ -820,25 +809,6 @@
    820 809
     			path = App;
    821 810
     			sourceTree = "<group>";
    822 811
     		};
    823
    -		0513106C21CA3907004EF1BE /* Alert */ = {
    824
    -			isa = PBXGroup;
    825
    -			children = (
    826
    -				0513106D21CA3907004EF1BE /* FFAlertController.swift */,
    827
    -				0513106E21CA3907004EF1BE /* Views */,
    828
    -			);
    829
    -			path = Alert;
    830
    -			sourceTree = "<group>";
    831
    -		};
    832
    -		0513106E21CA3907004EF1BE /* Views */ = {
    833
    -			isa = PBXGroup;
    834
    -			children = (
    835
    -				0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */,
    836
    -				0513107421CA3907004EF1BE /* FFSheetActionCell.swift */,
    837
    -				0513107521CA3907004EF1BE /* FFAlertLabel.swift */,
    838
    -			);
    839
    -			path = Views;
    840
    -			sourceTree = "<group>";
    841
    -		};
    842 812
     		0513108921CA3914004EF1BE /* QR */ = {
    843 813
     			isa = PBXGroup;
    844 814
     			children = (
    @@ -895,8 +865,9 @@
    895 865
     		053E127221F5A6D400A64893 /* Resuable */ = {
    896 866
     			isa = PBXGroup;
    897 867
     			children = (
    868
    +				0521145521F083FA0047C55A /* Toast */,
    898 869
     				053E127321F5A6E200A64893 /* Extension */,
    899
    -				053E127421F5A72000A64893 /* DataError.swift */,
    870
    +				053E127421F5A72000A64893 /* Error.swift */,
    900 871
     			);
    901 872
     			path = Resuable;
    902 873
     			sourceTree = "<group>";
    @@ -1212,7 +1183,6 @@
    1212 1183
     				A69FFA9E1E7004700006FEE0 /* PhotoDetailCommentCell.swift */,
    1213 1184
     				05594C022240E94E002D4910 /* PhotoDetailImageCell.swift */,
    1214 1185
     				A69FFAA61E7004700006FEE0 /* ImageCell.swift */,
    1215
    -				0546D98D2243782300742939 /* ShareView.swift */,
    1216 1186
     				A69FFAA81E7004700006FEE0 /* ShareController.swift */,
    1217 1187
     				A69FFAA91E7004700006FEE0 /* PhotoPreviewViewController.swift */,
    1218 1188
     				A69FFB881E7018CC0006FEE0 /* PhotoDetail.storyboard */,
    @@ -1346,7 +1316,6 @@
    1346 1316
     			children = (
    1347 1317
     				0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */,
    1348 1318
     				0505B34B1F7E4024009E4ED2 /* Resource.swift */,
    1349
    -				0594845921B66DA500074EFC /* Result.swift */,
    1350 1319
     				0594845721B528FE00074EFC /* Interfaces.swift */,
    1351 1320
     				A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */,
    1352 1321
     			);
    @@ -1626,7 +1595,6 @@
    1626 1595
     				05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */,
    1627 1596
     				05130FFD21CA1B39004EF1BE /* HardwareAuthorization.swift in Sources */,
    1628 1597
     				0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */,
    1629
    -				053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */,
    1630 1598
     				05130FFE21CA1B39004EF1BE /* WaterfallFlowLayout.swift in Sources */,
    1631 1599
     				05130FFF21CA1B39004EF1BE /* WaterfallFlowConfiguration.swift in Sources */,
    1632 1600
     				055BB53E220AEA3B009548AA /* NiblessViewController.swift in Sources */,
    @@ -1638,20 +1606,16 @@
    1638 1606
     				0513100121CA1B39004EF1BE /* CGPointExt.swift in Sources */,
    1639 1607
     				0584FD7521F9C70D00FA1E3E /* SideAnimator.swift in Sources */,
    1640 1608
     				0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */,
    1641
    -				0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */,
    1642 1609
     				0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */,
    1643 1610
     				059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */,
    1644 1611
     				059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */,
    1645 1612
     				0513109821CA3915004EF1BE /* QRCodeScanResult.swift in Sources */,
    1646 1613
     				0513100221CA1B39004EF1BE /* CGSizeExt.swift in Sources */,
    1647
    -				053E126921F171C500A64893 /* ToastOption.swift in Sources */,
    1648 1614
     				0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */,
    1649
    -				0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */,
    1650 1615
     				05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */,
    1651 1616
     				0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,
    1652 1617
     				0513100721CA1B39004EF1BE /* UIViewController+UIBarButtonItem.swift in Sources */,
    1653 1618
     				05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,
    1654
    -				053E126B21F5696E00A64893 /* Toast.swift in Sources */,
    1655 1619
     				0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */,
    1656 1620
     				057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,
    1657 1621
     				0513106021CA1E53004EF1BE /* UIStoryboardExt.swift in Sources */,
    @@ -1684,7 +1648,6 @@
    1684 1648
     				05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */,
    1685 1649
     				05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */,
    1686 1650
     				05130F5A21C94C12004EF1BE /* PresentDisappearAnimatedTransitioning.swift in Sources */,
    1687
    -				053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */,
    1688 1651
     				053E126721F1719F00A64893 /* PageItem.swift in Sources */,
    1689 1652
     				053E127821F5B6E400A64893 /* AlertController.swift in Sources */,
    1690 1653
     				05C5285621FE98F50090ECB5 /* GestureRecognizerProxy.swift in Sources */,
    @@ -1692,15 +1655,12 @@
    1692 1655
     				0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */,
    1693 1656
     				0513109721CA3915004EF1BE /* QRCodeScanner.swift in Sources */,
    1694 1657
     				05130F5E21C94C12004EF1BE /* PresentAppearAnimatedTransitioning.swift in Sources */,
    1695
    -				0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */,
    1696 1658
     				05130F5721C94C12004EF1BE /* AlertAnimator.swift in Sources */,
    1697 1659
     				0513109321CA3915004EF1BE /* ColorQR.swift in Sources */,
    1698 1660
     				0569F61822014B24000A75CA /* NavigationBarDelegate.swift in Sources */,
    1699 1661
     				05130F5C21C94C12004EF1BE /* ActionSheetAnimator.swift in Sources */,
    1700 1662
     				05130F5B21C94C12004EF1BE /* PresentAnimatable.swift in Sources */,
    1701
    -				0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */,
    1702 1663
     				05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */,
    1703
    -				0521145421F083F20047C55A /* ToastView.swift in Sources */,
    1704 1664
     				05C5285821FE995F0090ECB5 /* GestureRecognizerDelegate.swift in Sources */,
    1705 1665
     				05130F6321C94C7A004EF1BE /* SideViewController.swift in Sources */,
    1706 1666
     				05130F6421C94C7A004EF1BE /* PageViewController.swift in Sources */,
    @@ -1711,6 +1671,11 @@
    1711 1671
     			isa = PBXSourcesBuildPhase;
    1712 1672
     			buildActionMask = 2147483647;
    1713 1673
     			files = (
    1674
    +				058D0CA02249FCF6006CA488 /* Toast.swift in Sources */,
    1675
    +				058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */,
    1676
    +				058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */,
    1677
    +				058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */,
    1678
    +				058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */,
    1714 1679
     				0513106521CA290B004EF1BE /* UserDefaultsExt.swift in Sources */,
    1715 1680
     				0513106621CA290B004EF1BE /* StringExt.swift in Sources */,
    1716 1681
     				0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */,
    @@ -1730,7 +1695,6 @@
    1730 1695
     				0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */,
    1731 1696
     				05B2C63121D75A1B008063B3 /* ContentResource.swift in Sources */,
    1732 1697
     				057CA9CA21DCA70B00FB7D03 /* GroupRepository.swift in Sources */,
    1733
    -				0513102921CA1B67004EF1BE /* Result.swift in Sources */,
    1734 1698
     				05C0D9A421D28591000B7B2A /* UserInfoRemoteAPI.swift in Sources */,
    1735 1699
     				0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */,
    1736 1700
     				0535D6D921D32A89008D9403 /* WXUserInfoRemoteAPI.swift in Sources */,
    @@ -1763,7 +1727,7 @@
    1763 1727
     				0513103F21CA1B67004EF1BE /* PhotoDetailViewModel.swift in Sources */,
    1764 1728
     				054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */,
    1765 1729
     				0513104021CA1B67004EF1BE /* MessageListViewModel.swift in Sources */,
    1766
    -				053E127521F5A72000A64893 /* DataError.swift in Sources */,
    1730
    +				053E127521F5A72000A64893 /* Error.swift in Sources */,
    1767 1731
     				05B2C61D21D710C5008063B3 /* GroupRemoteAPI.swift in Sources */,
    1768 1732
     				0513104121CA1B67004EF1BE /* MessageViewModel.swift in Sources */,
    1769 1733
     				0513104221CA1B67004EF1BE /* CreateGroupViewModel.swift in Sources */,
    @@ -1785,7 +1749,6 @@
    1785 1749
     			isa = PBXSourcesBuildPhase;
    1786 1750
     			buildActionMask = 2147483647;
    1787 1751
     			files = (
    1788
    -				0546D98E2243782300742939 /* ShareView.swift in Sources */,
    1789 1752
     				051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */,
    1790 1753
     				05130FDD21CA1B04004EF1BE /* GroupViewController.swift in Sources */,
    1791 1754
     				05130FDF21CA1B04004EF1BE /* GroupMemberCell.swift in Sources */,
    @@ -1811,6 +1774,7 @@
    1811 1774
     				05130FF021CA1B04004EF1BE /* MineOrderViewController.swift in Sources */,
    1812 1775
     				05130FF121CA1B04004EF1BE /* MineAboutViewController.swift in Sources */,
    1813 1776
     				05130FF721CA1B04004EF1BE /* PhotoDetailCommentCell.swift in Sources */,
    1777
    +				058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */,
    1814 1778
     				0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */,
    1815 1779
     				05130FF821CA1B04004EF1BE /* ImageCell.swift in Sources */,
    1816 1780
     				05130FF921CA1B04004EF1BE /* PhotoDetailViewController.swift in Sources */,

    二进制
    PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate


    二进制
    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
    +}

    二进制
    PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Logo@3x.png


    二进制
    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
    -}

    二进制
    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


    二进制
    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
    -}

    adminSystem - Gogs: Go Git Service

    Brak opisu

    test-parser.js 3.8KB

      var Parser = require('../lib/parser'), parseListEntry = Parser.parseListEntry; var path = require('path'), assert = require('assert'), inspect = require('util').inspect; var group = path.basename(__filename, '.js') + '/'; [ { source: 'drwxr-xr-x 10 root root 4096 Dec 21 2012 usr', expected: { type: 'd', name: 'usr', target: undefined, sticky: false, rights: { user: 'rwx', group: 'rx', other: 'rx' }, acl: false, owner: 'root', group: 'root', size: 4096, date: new Date('2012-12-21T00:00') }, what: 'Normal directory' }, { source: 'drwxrwxrwx 1 owner group 0 Aug 31 2012 e-books', expected: { type: 'd', name: 'e-books', target: undefined, sticky: false, rights: { user: 'rwx', group: 'rwx', other: 'rwx' }, acl: false, owner: 'owner', group: 'group', size: 0, date: new Date('2012-08-31T00:00') }, what: 'Normal directory #2' }, { source: '-rw-rw-rw- 1 owner group 7045120 Sep 02 2012 music.mp3', expected: { type: '-', name: 'music.mp3', target: undefined, sticky: false, rights: { user: 'rw', group: 'rw', other: 'rw' }, acl: false, owner: 'owner', group: 'group', size: 7045120, date: new Date('2012-09-02T00:00') }, what: 'Normal file' }, { source: '-rw-rw-rw-+ 1 owner group 7045120 Sep 02 2012 music.mp3', expected: { type: '-', name: 'music.mp3', target: undefined, sticky: false, rights: { user: 'rw', group: 'rw', other: 'rw' }, acl: true, owner: 'owner', group: 'group', size: 7045120, date: new Date('2012-09-02T00:00') }, what: 'File with ACL set' }, { source: 'drwxrwxrwt 7 root root 4096 May 19 2012 tmp', expected: { type: 'd', name: 'tmp', target: undefined, sticky: true, rights: { user: 'rwx', group: 'rwx', other: 'rwx' }, acl: false, owner: 'root', group: 'root', size: 4096, date: new Date('2012-05-19T00:00') }, what: 'Directory with sticky bit and executable for others' }, { source: 'drwxrwx--t 7 root root 4096 May 19 2012 tmp', expected: { type: 'd', name: 'tmp', target: undefined, sticky: true, rights: { user: 'rwx', group: 'rwx', other: 'x' }, acl: false, owner: 'root', group: 'root', size: 4096, date: new Date('2012-05-19T00:00') }, what: 'Directory with sticky bit and executable for others #2' }, { source: 'drwxrwxrwT 7 root root 4096 May 19 2012 tmp', expected: { type: 'd', name: 'tmp', target: undefined, sticky: true, rights: { user: 'rwx', group: 'rwx', other: 'rw' }, acl: false, owner: 'root', group: 'root', size: 4096, date: new Date('2012-05-19T00:00') }, what: 'Directory with sticky bit and not executable for others' }, { source: 'drwxrwx--T 7 root root 4096 May 19 2012 tmp', expected: { type: 'd', name: 'tmp', target: undefined, sticky: true, rights: { user: 'rwx', group: 'rwx', other: '' }, acl: false, owner: 'root', group: 'root', size: 4096, date: new Date('2012-05-19T00:00') }, what: 'Directory with sticky bit and not executable for others #2' }, { source: 'total 871', expected: null, what: 'Ignored line' }, ].forEach(function(v) { var result = parseListEntry(v.source), msg = '[' + group + v.what + ']: parsed output mismatch.\n' + 'Saw: ' + inspect(result) + '\n' + 'Expected: ' + inspect(v.expected); assert.deepEqual(result, v.expected, msg); });