@@ -54,7 +54,7 @@ |
||
54 | 54 |
05130FD921CA1AE0004EF1BE /* CreateGroupConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFACF1E70047E0006FEE0 /* CreateGroupConfirmViewController.swift */; }; |
55 | 55 |
05130FDA21CA1AE0004EF1BE /* CreateGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD01E70047E0006FEE0 /* CreateGroupViewController.swift */; }; |
56 | 56 |
05130FDB21CA1AE0004EF1BE /* ScanQRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD71E70047E0006FEE0 /* ScanQRViewController.swift */; }; |
57 |
- 05130FDD21CA1B04004EF1BE /* GroupPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAAB1E7004700006FEE0 /* GroupPageController.swift */; }; |
|
57 |
+ 05130FDD21CA1B04004EF1BE /* GroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAAB1E7004700006FEE0 /* GroupViewController.swift */; }; |
|
58 | 58 |
05130FDF21CA1B04004EF1BE /* MemberCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAB61E7004700006FEE0 /* MemberCell.swift */; }; |
59 | 59 |
05130FE021CA1B04004EF1BE /* GroupDetailController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAB11E7004700006FEE0 /* GroupDetailController.swift */; }; |
60 | 60 |
05130FE121CA1B04004EF1BE /* GroupMemberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAB41E7004700006FEE0 /* GroupMemberController.swift */; }; |
@@ -117,7 +117,7 @@ |
||
117 | 117 |
0513103421CA1B67004EF1BE /* PhotoLocalStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420FDBEA1EA70A9600958CBD /* PhotoLocalStorage.swift */; }; |
118 | 118 |
0513103521CA1B67004EF1BE /* RecentGroupInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFB081E700B700006FEE0 /* RecentGroupInfo.swift */; }; |
119 | 119 |
0513103921CA1B67004EF1BE /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD51E70047E0006FEE0 /* HomeViewModel.swift */; }; |
120 |
- 0513103A21CA1B67004EF1BE /* GroupPageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAAC1E7004700006FEE0 /* GroupPageViewModel.swift */; }; |
|
120 |
+ 0513103A21CA1B67004EF1BE /* GroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAAC1E7004700006FEE0 /* GroupViewModel.swift */; }; |
|
121 | 121 |
0513103B21CA1B67004EF1BE /* GroupDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAB21E7004700006FEE0 /* GroupDetailViewModel.swift */; }; |
122 | 122 |
0513103C21CA1B67004EF1BE /* GroupMemberViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42CF50491EC0536000D23E9F /* GroupMemberViewModel.swift */; }; |
123 | 123 |
0513103D21CA1B67004EF1BE /* MineGroupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42CF50451EC0526C00D23E9F /* MineGroupViewModel.swift */; }; |
@@ -200,6 +200,9 @@ |
||
200 | 200 |
0543E80B21D1DF4000A42807 /* GroupMemberItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80A21D1DF4000A42807 /* GroupMemberItem.swift */; }; |
201 | 201 |
0543E80D21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80C21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift */; }; |
202 | 202 |
0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */; }; |
203 |
+ 0569F6152200438C000A75CA /* Group.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0569F613220042AF000A75CA /* Group.storyboard */; }; |
|
204 |
+ 0569F61822014B24000A75CA /* NavigationBarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0569F61722014B24000A75CA /* NavigationBarDelegate.swift */; }; |
|
205 |
+ 0569F61A22014B30000A75CA /* NavigationBarProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0569F61922014B30000A75CA /* NavigationBarProxy.swift */; }; |
|
203 | 206 |
0572B2C121E2FB3E00EAD2A2 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 0572B2BC21E2FB3C00EAD2A2 /* README.txt */; }; |
204 | 207 |
0572B2C221E2FB3E00EAD2A2 /* README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 0572B2BC21E2FB3C00EAD2A2 /* README.txt */; }; |
205 | 208 |
0572B2C321E2FB3E00EAD2A2 /* WXApiObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0572B2BD21E2FB3C00EAD2A2 /* WXApiObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; |
@@ -250,14 +253,15 @@ |
||
250 | 253 |
05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */; }; |
251 | 254 |
05C8D21B21ED9A020001E847 /* UIViewController+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */; }; |
252 | 255 |
05C8D21D21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */; }; |
253 |
- 05C8D22021EDD5F50001E847 /* NavigationBarInOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21F21EDD5F50001E847 /* NavigationBarInOut.swift */; }; |
|
256 |
+ 05C8D22021EDD5F50001E847 /* NavigationBarInOutAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */; }; |
|
254 | 257 |
05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */; }; |
255 | 258 |
05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */; }; |
256 |
- 05C8D22621EEE1EB0001E847 /* NavigationBarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22521EEE1EB0001E847 /* NavigationBarDelegate.swift */; }; |
|
257 | 259 |
05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */; }; |
258 | 260 |
05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */; }; |
259 | 261 |
05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C521FF010900A29A20 /* WebViewController.swift */; }; |
260 | 262 |
05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */; }; |
263 |
+ 05D3A3CD22000C3A00A29A20 /* GroupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */; }; |
|
264 |
+ 05D3A3D02200288400A29A20 /* Storyboarded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CF2200288400A29A20 /* Storyboarded.swift */; }; |
|
261 | 265 |
05E80E3021DF65D5006368C4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 05E80E2F21DF65D4006368C4 /* Assets.xcassets */; }; |
262 | 266 |
/* End PBXBuildFile section */ |
263 | 267 |
|
@@ -449,6 +453,9 @@ |
||
449 | 453 |
05468AF11F8B73A000B8F469 /* PhotoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoItem.swift; sourceTree = "<group>"; }; |
450 | 454 |
054863661FA326CB00A39DA0 /* PhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoCell.swift; sourceTree = "<group>"; }; |
451 | 455 |
054863671FA326CB00A39DA0 /* PhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhotoCell.xib; sourceTree = "<group>"; }; |
456 |
+ 0569F613220042AF000A75CA /* Group.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Group.storyboard; sourceTree = "<group>"; }; |
|
457 |
+ 0569F61722014B24000A75CA /* NavigationBarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarDelegate.swift; sourceTree = "<group>"; }; |
|
458 |
+ 0569F61922014B30000A75CA /* NavigationBarProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarProxy.swift; sourceTree = "<group>"; }; |
|
452 | 459 |
0572B2BC21E2FB3C00EAD2A2 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = "<group>"; }; |
453 | 460 |
0572B2BD21E2FB3C00EAD2A2 /* WXApiObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApiObject.h; sourceTree = "<group>"; }; |
454 | 461 |
0572B2BE21E2FB3D00EAD2A2 /* WechatAuthSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WechatAuthSDK.h; sourceTree = "<group>"; }; |
@@ -504,14 +511,15 @@ |
||
504 | 511 |
05C8D21821ED985C0001E847 /* UINavigationController+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+NavigationBack.swift"; sourceTree = "<group>"; }; |
505 | 512 |
05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Navigation.swift"; sourceTree = "<group>"; }; |
506 | 513 |
05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInteractivePopDeletegate.swift; sourceTree = "<group>"; }; |
507 |
- 05C8D21F21EDD5F50001E847 /* NavigationBarInOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInOut.swift; sourceTree = "<group>"; }; |
|
514 |
+ 05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInOutAnimator.swift; sourceTree = "<group>"; }; |
|
508 | 515 |
05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarInteractiveViewController.swift; sourceTree = "<group>"; }; |
509 | 516 |
05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarPushAndPopDelegate.swift; sourceTree = "<group>"; }; |
510 |
- 05C8D22521EEE1EB0001E847 /* NavigationBarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarDelegate.swift; sourceTree = "<group>"; }; |
|
511 | 517 |
05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerProxy.swift; sourceTree = "<group>"; }; |
512 | 518 |
05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerDelegate.swift; sourceTree = "<group>"; }; |
513 | 519 |
05D3A3C521FF010900A29A20 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = "<group>"; }; |
514 | 520 |
05D3A3C721FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GestureRecoginzier+NavigationBack.swift"; sourceTree = "<group>"; }; |
521 |
+ 05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupCoordinator.swift; sourceTree = "<group>"; }; |
|
522 |
+ 05D3A3CF2200288400A29A20 /* Storyboarded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storyboarded.swift; sourceTree = "<group>"; }; |
|
515 | 523 |
05E80E2F21DF65D4006368C4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; |
516 | 524 |
3864C06C1CAD27EC0048ADAD /* Swift-bridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swift-bridge.h"; sourceTree = "<group>"; }; |
517 | 525 |
420FDBEA1EA70A9600958CBD /* PhotoLocalStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoLocalStorage.swift; sourceTree = "<group>"; }; |
@@ -536,8 +544,8 @@ |
||
536 | 544 |
A69FFAA61E7004700006FEE0 /* ImageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCell.swift; sourceTree = "<group>"; wrapsLines = 0; }; |
537 | 545 |
A69FFAA81E7004700006FEE0 /* ShareController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareController.swift; sourceTree = "<group>"; }; |
538 | 546 |
A69FFAA91E7004700006FEE0 /* ShowFullPicController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowFullPicController.swift; sourceTree = "<group>"; }; |
539 |
- A69FFAAB1E7004700006FEE0 /* GroupPageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupPageController.swift; sourceTree = "<group>"; }; |
|
540 |
- A69FFAAC1E7004700006FEE0 /* GroupPageViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupPageViewModel.swift; sourceTree = "<group>"; }; |
|
547 |
+ A69FFAAB1E7004700006FEE0 /* GroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupViewController.swift; sourceTree = "<group>"; }; |
|
548 |
+ A69FFAAC1E7004700006FEE0 /* GroupViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupViewModel.swift; sourceTree = "<group>"; }; |
|
541 | 549 |
A69FFAAE1E7004700006FEE0 /* ChangeGroupNameController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeGroupNameController.swift; sourceTree = "<group>"; }; |
542 | 550 |
A69FFAB01E7004700006FEE0 /* GroupDetailModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupDetailModel.swift; sourceTree = "<group>"; }; |
543 | 551 |
A69FFAB11E7004700006FEE0 /* GroupDetailController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupDetailController.swift; sourceTree = "<group>"; }; |
@@ -674,6 +682,7 @@ |
||
674 | 682 |
children = ( |
675 | 683 |
42FECF071EE0339500D4C695 /* HardwareAuthorization.swift */, |
676 | 684 |
05C5285921FEABBB0090ECB5 /* UIKitDelegate */, |
685 |
+ 05D3A3CE2200281D00A29A20 /* Protocol */, |
|
677 | 686 |
0500C26121E7508B009A7013 /* Animationes */, |
678 | 687 |
05130F4D21C94B72004EF1BE /* UIKit */, |
679 | 688 |
0543272621C68C1900C6388D /* Extension */, |
@@ -754,11 +763,11 @@ |
||
754 | 763 |
isa = PBXGroup; |
755 | 764 |
children = ( |
756 | 765 |
0543E7F321CB911200A42807 /* UserInfoViewModel.swift */, |
757 |
- 0543E80121D0CD9900A42807 /* home */, |
|
758 |
- 0543E80321D0CD9E00A42807 /* message */, |
|
759 |
- 0543E80221D0CD9C00A42807 /* mine */, |
|
760 |
- 0543E80421D0CDA000A42807 /* groupDetail */, |
|
761 |
- 0543E80521D0CDDA00A42807 /* photoDetail */, |
|
766 |
+ 05D3A3CB21FFFA3500A29A20 /* Group */, |
|
767 |
+ 0543E80121D0CD9900A42807 /* Home */, |
|
768 |
+ 0543E80321D0CD9E00A42807 /* Message */, |
|
769 |
+ 0543E80221D0CD9C00A42807 /* Mine */, |
|
770 |
+ 0543E80521D0CDDA00A42807 /* PhotoDetail */, |
|
762 | 771 |
); |
763 | 772 |
path = PresentLayer; |
764 | 773 |
sourceTree = "<group>"; |
@@ -845,7 +854,7 @@ |
||
845 | 854 |
054863661FA326CB00A39DA0 /* PhotoCell.swift */, |
846 | 855 |
054863671FA326CB00A39DA0 /* PhotoCell.xib */, |
847 | 856 |
05D790AD1FC50E7C00469AD1 /* Home */, |
848 |
- 05D790AE1FC50E7C00469AD1 /* GroupDetail */, |
|
857 |
+ 05D790AF1FC50E7C00469AD1 /* Group */, |
|
849 | 858 |
05D790AA1FC50E7C00469AD1 /* Message */, |
850 | 859 |
05D790AC1FC50E7C00469AD1 /* Mine */, |
851 | 860 |
05D790AB1FC50E7C00469AD1 /* PhotoDetail */, |
@@ -999,51 +1008,59 @@ |
||
999 | 1008 |
path = UIKit; |
1000 | 1009 |
sourceTree = "<group>"; |
1001 | 1010 |
}; |
1002 |
- 0543E80121D0CD9900A42807 /* home */ = { |
|
1011 |
+ 0543E80121D0CD9900A42807 /* Home */ = { |
|
1003 | 1012 |
isa = PBXGroup; |
1004 | 1013 |
children = ( |
1005 | 1014 |
A69FFAD51E70047E0006FEE0 /* HomeViewModel.swift */, |
1006 |
- A69FFAAC1E7004700006FEE0 /* GroupPageViewModel.swift */, |
|
1007 | 1015 |
05130F2721C88D35004EF1BE /* ScanQRViewModel.swift */, |
1008 | 1016 |
05A0E8A821C782D700EAB9A2 /* CreateGroupConfirmViewModel.swift */, |
1009 | 1017 |
); |
1010 |
- path = home; |
|
1018 |
+ path = Home; |
|
1011 | 1019 |
sourceTree = "<group>"; |
1012 | 1020 |
}; |
1013 |
- 0543E80221D0CD9C00A42807 /* mine */ = { |
|
1021 |
+ 0543E80221D0CD9C00A42807 /* Mine */ = { |
|
1014 | 1022 |
isa = PBXGroup; |
1015 | 1023 |
children = ( |
1016 | 1024 |
42CF50451EC0526C00D23E9F /* MineGroupViewModel.swift */, |
1017 | 1025 |
42CF50471EC052B200D23E9F /* MineOrderViewModel.swift */, |
1018 | 1026 |
0543E80621D0CDFA00A42807 /* MineFeedbackViewModel.swift */, |
1019 | 1027 |
); |
1020 |
- path = mine; |
|
1028 |
+ path = Mine; |
|
1021 | 1029 |
sourceTree = "<group>"; |
1022 | 1030 |
}; |
1023 |
- 0543E80321D0CD9E00A42807 /* message */ = { |
|
1031 |
+ 0543E80321D0CD9E00A42807 /* Message */ = { |
|
1024 | 1032 |
isa = PBXGroup; |
1025 | 1033 |
children = ( |
1026 | 1034 |
059AA62A21BA85B000485188 /* MessageViewModel.swift */, |
1027 | 1035 |
A69FFADE1E70047E0006FEE0 /* MessageListViewModel.swift */, |
1028 | 1036 |
); |
1029 |
- path = message; |
|
1037 |
+ path = Message; |
|
1030 | 1038 |
sourceTree = "<group>"; |
1031 | 1039 |
}; |
1032 |
- 0543E80421D0CDA000A42807 /* groupDetail */ = { |
|
1040 |
+ 0543E80421D0CDA000A42807 /* GroupDetail */ = { |
|
1033 | 1041 |
isa = PBXGroup; |
1034 | 1042 |
children = ( |
1035 | 1043 |
A69FFAB21E7004700006FEE0 /* GroupDetailViewModel.swift */, |
1036 | 1044 |
42CF50491EC0536000D23E9F /* GroupMemberViewModel.swift */, |
1037 | 1045 |
); |
1038 |
- path = groupDetail; |
|
1046 |
+ path = GroupDetail; |
|
1039 | 1047 |
sourceTree = "<group>"; |
1040 | 1048 |
}; |
1041 |
- 0543E80521D0CDDA00A42807 /* photoDetail */ = { |
|
1049 |
+ 0543E80521D0CDDA00A42807 /* PhotoDetail */ = { |
|
1042 | 1050 |
isa = PBXGroup; |
1043 | 1051 |
children = ( |
1044 | 1052 |
A69FFAA41E7004700006FEE0 /* DetailPageViewModel.swift */, |
1045 | 1053 |
); |
1046 |
- path = photoDetail; |
|
1054 |
+ path = PhotoDetail; |
|
1055 |
+ sourceTree = "<group>"; |
|
1056 |
+ }; |
|
1057 |
+ 0569F61622014AF9000A75CA /* NavigationBarDelegate */ = { |
|
1058 |
+ isa = PBXGroup; |
|
1059 |
+ children = ( |
|
1060 |
+ 0569F61922014B30000A75CA /* NavigationBarProxy.swift */, |
|
1061 |
+ 0569F61722014B24000A75CA /* NavigationBarDelegate.swift */, |
|
1062 |
+ ); |
|
1063 |
+ path = NavigationBarDelegate; |
|
1047 | 1064 |
sourceTree = "<group>"; |
1048 | 1065 |
}; |
1049 | 1066 |
0572B2BB21E2FAEE00EAD2A2 /* wxSDK */ = { |
@@ -1129,6 +1146,7 @@ |
||
1129 | 1146 |
05C5285921FEABBB0090ECB5 /* UIKitDelegate */ = { |
1130 | 1147 |
isa = PBXGroup; |
1131 | 1148 |
children = ( |
1149 |
+ 0569F61622014AF9000A75CA /* NavigationBarDelegate */, |
|
1132 | 1150 |
05C5285C21FEAFAA0090ECB5 /* ViewControllerTransitioningDelegate */, |
1133 | 1151 |
05C5285421FE98E70090ECB5 /* GestureRecognizerDelegate */, |
1134 | 1152 |
05C8D22C21EF0F8E0001E847 /* NavigationControllerDelegate */, |
@@ -1160,8 +1178,7 @@ |
||
1160 | 1178 |
isa = PBXGroup; |
1161 | 1179 |
children = ( |
1162 | 1180 |
05C8D22121EED6860001E847 /* NavigationBarInteractiveViewController.swift */, |
1163 |
- 05C8D21F21EDD5F50001E847 /* NavigationBarInOut.swift */, |
|
1164 |
- 05C8D22521EEE1EB0001E847 /* NavigationBarDelegate.swift */, |
|
1181 |
+ 05C8D21F21EDD5F50001E847 /* NavigationBarInOutAnimator.swift */, |
|
1165 | 1182 |
05C8D21C21EDD3770001E847 /* NavigationBarInteractivePopDeletegate.swift */, |
1166 | 1183 |
05C8D22321EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift */, |
1167 | 1184 |
); |
@@ -1177,6 +1194,23 @@ |
||
1177 | 1194 |
path = NavigationControllerDelegate; |
1178 | 1195 |
sourceTree = "<group>"; |
1179 | 1196 |
}; |
1197 |
+ 05D3A3CB21FFFA3500A29A20 /* Group */ = { |
|
1198 |
+ isa = PBXGroup; |
|
1199 |
+ children = ( |
|
1200 |
+ A69FFAAC1E7004700006FEE0 /* GroupViewModel.swift */, |
|
1201 |
+ 0543E80421D0CDA000A42807 /* GroupDetail */, |
|
1202 |
+ ); |
|
1203 |
+ path = Group; |
|
1204 |
+ sourceTree = "<group>"; |
|
1205 |
+ }; |
|
1206 |
+ 05D3A3CE2200281D00A29A20 /* Protocol */ = { |
|
1207 |
+ isa = PBXGroup; |
|
1208 |
+ children = ( |
|
1209 |
+ 05D3A3CF2200288400A29A20 /* Storyboarded.swift */, |
|
1210 |
+ ); |
|
1211 |
+ path = Protocol; |
|
1212 |
+ sourceTree = "<group>"; |
|
1213 |
+ }; |
|
1180 | 1214 |
05D790AA1FC50E7C00469AD1 /* Message */ = { |
1181 | 1215 |
isa = PBXGroup; |
1182 | 1216 |
children = ( |
@@ -1233,7 +1267,6 @@ |
||
1233 | 1267 |
A69FFAD01E70047E0006FEE0 /* CreateGroupViewController.swift */, |
1234 | 1268 |
A69FFAD71E70047E0006FEE0 /* ScanQRViewController.swift */, |
1235 | 1269 |
A69FFB8E1E7018CC0006FEE0 /* Main.storyboard */, |
1236 |
- 05D790AF1FC50E7C00469AD1 /* Group */, |
|
1237 | 1270 |
); |
1238 | 1271 |
path = Home; |
1239 | 1272 |
sourceTree = "<group>"; |
@@ -1255,7 +1288,10 @@ |
||
1255 | 1288 |
05D790AF1FC50E7C00469AD1 /* Group */ = { |
1256 | 1289 |
isa = PBXGroup; |
1257 | 1290 |
children = ( |
1258 |
- A69FFAAB1E7004700006FEE0 /* GroupPageController.swift */, |
|
1291 |
+ 05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */, |
|
1292 |
+ A69FFAAB1E7004700006FEE0 /* GroupViewController.swift */, |
|
1293 |
+ 0569F613220042AF000A75CA /* Group.storyboard */, |
|
1294 |
+ 05D790AE1FC50E7C00469AD1 /* GroupDetail */, |
|
1259 | 1295 |
); |
1260 | 1296 |
path = Group; |
1261 | 1297 |
sourceTree = "<group>"; |
@@ -1537,6 +1573,7 @@ |
||
1537 | 1573 |
knownRegions = ( |
1538 | 1574 |
en, |
1539 | 1575 |
Base, |
1576 |
+ global, |
|
1540 | 1577 |
); |
1541 | 1578 |
mainGroup = 6CEBD0F61CA8D680004DBDE0; |
1542 | 1579 |
productRefGroup = 6CEBD1001CA8D680004DBDE0 /* Products */; |
@@ -1573,6 +1610,7 @@ |
||
1573 | 1610 |
isa = PBXResourcesBuildPhase; |
1574 | 1611 |
buildActionMask = 2147483647; |
1575 | 1612 |
files = ( |
1613 |
+ 0569F6152200438C000A75CA /* Group.storyboard in Resources */, |
|
1576 | 1614 |
0572B2C921E30D8000EAD2A2 /* PhotoCell.xib in Resources */, |
1577 | 1615 |
0513105B21CA1D50004EF1BE /* Mine.storyboard in Resources */, |
1578 | 1616 |
0513105821CA1D50004EF1BE /* Main.storyboard in Resources */, |
@@ -1669,9 +1707,8 @@ |
||
1669 | 1707 |
0513100021CA1B39004EF1BE /* CLLocationExt.swift in Sources */, |
1670 | 1708 |
059B58AA21F83B2E00FA64C2 /* CenterConfirmItem.swift in Sources */, |
1671 | 1709 |
05C5285E21FEB03F0090ECB5 /* ViewControllerTransitioningProxy.swift in Sources */, |
1672 |
- 05C8D22621EEE1EB0001E847 /* NavigationBarDelegate.swift in Sources */, |
|
1673 | 1710 |
057317A421F5C6C0009B2FCE /* BottomCancelItem.swift in Sources */, |
1674 |
- 05C8D22021EDD5F50001E847 /* NavigationBarInOut.swift in Sources */, |
|
1711 |
+ 05C8D22021EDD5F50001E847 /* NavigationBarInOutAnimator.swift in Sources */, |
|
1675 | 1712 |
0513100121CA1B39004EF1BE /* CGPointExt.swift in Sources */, |
1676 | 1713 |
0584FD7521F9C70D00FA1E3E /* SideAnimator.swift in Sources */, |
1677 | 1714 |
0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */, |
@@ -1698,6 +1735,7 @@ |
||
1698 | 1735 |
05C8D21221ED7B620001E847 /* UINavigationBar+FixSpace.swift in Sources */, |
1699 | 1736 |
05C8D21021ED7B280001E847 /* UIApplication+Swizzle.swift in Sources */, |
1700 | 1737 |
0513100E21CA1B39004EF1BE /* UIButtonExt.swift in Sources */, |
1738 |
+ 0569F61A22014B30000A75CA /* NavigationBarProxy.swift in Sources */, |
|
1701 | 1739 |
0513100F21CA1B39004EF1BE /* UIViewExt.swift in Sources */, |
1702 | 1740 |
053E125F21F16BA400A64893 /* ToastTextView.swift in Sources */, |
1703 | 1741 |
0513109B21CA3915004EF1BE /* QRCodeConfiguration.swift in Sources */, |
@@ -1710,6 +1748,7 @@ |
||
1710 | 1748 |
0513109921CA3915004EF1BE /* NotificationExt.swift in Sources */, |
1711 | 1749 |
0513101921CA1B39004EF1BE /* UIImageExt.swift in Sources */, |
1712 | 1750 |
05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */, |
1751 |
+ 05D3A3D02200288400A29A20 /* Storyboarded.swift in Sources */, |
|
1713 | 1752 |
05C0CEFB21F85A7700993DE2 /* ActionSheetController.swift in Sources */, |
1714 | 1753 |
05C8D21421ED8B9B0001E847 /* NavigationBackViewController.swift in Sources */, |
1715 | 1754 |
053E126121F16BB100A64893 /* ToastImageView.swift in Sources */, |
@@ -1732,6 +1771,7 @@ |
||
1732 | 1771 |
0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */, |
1733 | 1772 |
05130F5721C94C12004EF1BE /* AlertAnimator.swift in Sources */, |
1734 | 1773 |
0513109321CA3915004EF1BE /* ColorQR.swift in Sources */, |
1774 |
+ 0569F61822014B24000A75CA /* NavigationBarDelegate.swift in Sources */, |
|
1735 | 1775 |
05130F5C21C94C12004EF1BE /* ActionSheetAnimator.swift in Sources */, |
1736 | 1776 |
05130F5B21C94C12004EF1BE /* PresentAnimatable.swift in Sources */, |
1737 | 1777 |
0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */, |
@@ -1791,7 +1831,7 @@ |
||
1791 | 1831 |
0513103521CA1B67004EF1BE /* RecentGroupInfo.swift in Sources */, |
1792 | 1832 |
0513103921CA1B67004EF1BE /* HomeViewModel.swift in Sources */, |
1793 | 1833 |
0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */, |
1794 |
- 0513103A21CA1B67004EF1BE /* GroupPageViewModel.swift in Sources */, |
|
1834 |
+ 0513103A21CA1B67004EF1BE /* GroupViewModel.swift in Sources */, |
|
1795 | 1835 |
05C0D99021D2219A000B7B2A /* CommentItem.swift in Sources */, |
1796 | 1836 |
0513103B21CA1B67004EF1BE /* GroupDetailViewModel.swift in Sources */, |
1797 | 1837 |
05B2C62B21D750F1008063B3 /* FeedbackRemoteAPI.swift in Sources */, |
@@ -1824,13 +1864,14 @@ |
||
1824 | 1864 |
buildActionMask = 2147483647; |
1825 | 1865 |
files = ( |
1826 | 1866 |
051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */, |
1827 |
- 05130FDD21CA1B04004EF1BE /* GroupPageController.swift in Sources */, |
|
1867 |
+ 05130FDD21CA1B04004EF1BE /* GroupViewController.swift in Sources */, |
|
1828 | 1868 |
05130FDF21CA1B04004EF1BE /* MemberCell.swift in Sources */, |
1829 | 1869 |
05130FE021CA1B04004EF1BE /* GroupDetailController.swift in Sources */, |
1830 | 1870 |
05130FE121CA1B04004EF1BE /* GroupMemberController.swift in Sources */, |
1831 | 1871 |
05130FE221CA1B04004EF1BE /* ChangeGroupNameController.swift in Sources */, |
1832 | 1872 |
05130FE321CA1B04004EF1BE /* ShowGroupQRController.swift in Sources */, |
1833 | 1873 |
05130FE421CA1B04004EF1BE /* MessageCommentAndThumbupCell.swift in Sources */, |
1874 |
+ 05D3A3CD22000C3A00A29A20 /* GroupCoordinator.swift in Sources */, |
|
1834 | 1875 |
05130FE521CA1B04004EF1BE /* MessageSystemCell.swift in Sources */, |
1835 | 1876 |
05130FE621CA1B04004EF1BE /* MessageCoordinator.swift in Sources */, |
1836 | 1877 |
05130FE721CA1B04004EF1BE /* MessageViewController.swift in Sources */, |
@@ -18,7 +18,7 @@ struct GroupPhotoRepository { |
||
18 | 18 |
groupPhotoRemoteAPI = GroupPhotoRemoteAPI(groupId: groupId) |
19 | 19 |
} |
20 | 20 |
|
21 |
- func load(page: Int) -> Single<[PhotoItem]> { |
|
21 |
+ func load() -> Single<[PhotoItem]> { |
|
22 | 22 |
return groupPhotoRemoteAPI.loadContent() |
23 | 23 |
} |
24 | 24 |
|
@@ -32,18 +32,17 @@ struct GroupPhotoRemoteAPI { |
||
32 | 32 |
|
33 | 33 |
func loadContent() -> Single<[PhotoItem]> { |
34 | 34 |
let resource = ContentResource<[PhotoItem]>(path: .groupPhotoList, |
35 |
- parameter: ["user_id": "", |
|
35 |
+ parameter: ["user_id": ShareUserId, |
|
36 | 36 |
"group_id": groupId], |
37 | 37 |
parseJSON: parse) |
38 | 38 |
return resource.loadContent() |
39 | 39 |
} |
40 | 40 |
|
41 | 41 |
func uploadPhoto(data: Data) -> Single<PhotoItem> { |
42 |
- #warning("user_id") |
|
43 | 42 |
let name = groupId + "" + "\(Date.timeIntervalSinceReferenceDate)" |
44 | 43 |
let file = FileModel(name: name, fileData: data) |
45 | 44 |
let uploadResource = UploadResource<PhotoItem>(path: .photoUpload, |
46 |
- parameter: ["user_id": "", |
|
45 |
+ parameter: ["user_id": ShareUserId, |
|
47 | 46 |
"group_id": groupId, |
48 | 47 |
"photo": file], |
49 | 48 |
parseJSON: parseUpload) |
@@ -0,0 +1,100 @@ |
||
1 |
+// |
|
2 |
+// GroupViewModel.swift |
|
3 |
+// PaiAi |
|
4 |
+// |
|
5 |
+// Created by zhengjianfei on 2017/1/4. |
|
6 |
+// Copyright © 2017年 FFIB. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import Foundation |
|
10 |
+import UIKit |
|
11 |
+import RxSwift |
|
12 |
+import RxCocoa |
|
13 |
+import RxDataSources |
|
14 |
+ |
|
15 |
+public protocol GroupViewModelDelegate: class { |
|
16 |
+ func didSelect(_ item: PhotoItem) |
|
17 |
+ func navigateToGroupDetail() |
|
18 |
+ func presentGroupQR() |
|
19 |
+} |
|
20 |
+ |
|
21 |
+public class GroupViewModel { |
|
22 |
+ |
|
23 |
+ private let disposeBag = DisposeBag() |
|
24 |
+ |
|
25 |
+ private var respository: GroupPhotoRepository |
|
26 |
+ |
|
27 |
+ private var _isLoading = PublishSubject<Void>() |
|
28 |
+ private let items = BehaviorRelay<[PhotoItem]>(value: []) |
|
29 |
+ |
|
30 |
+ public var photographBtnTapped = PublishSubject<Void>() |
|
31 |
+ |
|
32 |
+ |
|
33 |
+ public var isLoading: Observable<Void> { |
|
34 |
+ return _isLoading.asObservable() |
|
35 |
+ } |
|
36 |
+ |
|
37 |
+ public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> { |
|
38 |
+ return items.map({ model in |
|
39 |
+ return [AnimatableSectionModel(model: 0, items: model)] |
|
40 |
+ }) |
|
41 |
+ } |
|
42 |
+ |
|
43 |
+ public weak var delegate: GroupViewModelDelegate? |
|
44 |
+ |
|
45 |
+ public init(groupItem: GroupItem) { |
|
46 |
+ self.respository = GroupPhotoRepository(groupId: groupItem.group_id) |
|
47 |
+ |
|
48 |
+ |
|
49 |
+ photographBtnTapped.subscribe({ |
|
50 |
+ [weak self] (_) in |
|
51 |
+ guard let `self` = self else { return } |
|
52 |
+// self.delegate?.scanQR() |
|
53 |
+ }).disposed(by: disposeBag) |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ public func reload() { |
|
57 |
+ respository.load() |
|
58 |
+ .subscribe(onSuccess: {[weak self] (result) in |
|
59 |
+ guard let `self` = self else { return } |
|
60 |
+ self._isLoading.onNext(()) |
|
61 |
+ self.items.accept(result) |
|
62 |
+ }, onError: {[weak self] (_) in |
|
63 |
+ guard let `self` = self else { return } |
|
64 |
+ self._isLoading.onNext(()) |
|
65 |
+ }).disposed(by: disposeBag) |
|
66 |
+ } |
|
67 |
+ |
|
68 |
+ public func submit(image: UIImage) { |
|
69 |
+ let edge = image.size.width > image.size.height ? image.size.height : image.size.width |
|
70 |
+// let newImage = image.scaledImage(1280 / edge), |
|
71 |
+ guard let data = image.jpegData(compressionQuality: 0.4) else { return } |
|
72 |
+ |
|
73 |
+ respository.upload(data: data) |
|
74 |
+ } |
|
75 |
+ |
|
76 |
+ public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize { |
|
77 |
+ let item = items.value[indexPath.row] |
|
78 |
+ let w = item.photo_thumbnail_w |
|
79 |
+ let h = item.photo_thumbnail_h |
|
80 |
+ |
|
81 |
+ // header 42, footer: 32 |
|
82 |
+ return CGSize(width: w, height: h + 74) |
|
83 |
+ } |
|
84 |
+} |
|
85 |
+ |
|
86 |
+/// GroupViewModelDelegate |
|
87 |
+public extension GroupViewModel { |
|
88 |
+ func didSelect(_ item: PhotoItem) { |
|
89 |
+ delegate?.didSelect(item) |
|
90 |
+ } |
|
91 |
+ |
|
92 |
+ @objc func navigateToGroupDetail() { |
|
93 |
+ delegate?.navigateToGroupDetail() |
|
94 |
+ } |
|
95 |
+ |
|
96 |
+ |
|
97 |
+ @objc func presentGroupQR() { |
|
98 |
+ delegate?.presentGroupQR() |
|
99 |
+ } |
|
100 |
+} |
@@ -51,14 +51,14 @@ public class HomeViewModel { |
||
51 | 51 |
public init() { |
52 | 52 |
self.respository = HomePhotoRepository() |
53 | 53 |
|
54 |
- scanBtnTapped.asObserver().subscribe(onNext: { |
|
55 |
- [weak self] in |
|
54 |
+ scanBtnTapped.subscribe({ |
|
55 |
+ [weak self] (_) in |
|
56 | 56 |
guard let `self` = self else { return } |
57 | 57 |
self.delegate?.scanQR() |
58 | 58 |
}).disposed(by: disposeBag) |
59 | 59 |
|
60 |
- createBtnTapped.asObserver().subscribe(onNext: { |
|
61 |
- [weak self] in |
|
60 |
+ createBtnTapped.subscribe({ |
|
61 |
+ [weak self] (_) in |
|
62 | 62 |
guard let `self` = self else { return } |
63 | 63 |
self.delegate?.createGroup() |
64 | 64 |
}).disposed(by: disposeBag) |
@@ -1,70 +0,0 @@ |
||
1 |
-// |
|
2 |
-// GroupPageViewModel.swift |
|
3 |
-// PaiAi |
|
4 |
-// |
|
5 |
-// Created by zhengjianfei on 2017/1/4. |
|
6 |
-// Copyright © 2017年 FFIB. All rights reserved. |
|
7 |
-// |
|
8 |
- |
|
9 |
-import Foundation |
|
10 |
-import UIKit |
|
11 |
-import RxSwift |
|
12 |
-import RxCocoa |
|
13 |
-import RxDataSources |
|
14 |
- |
|
15 |
-public protocol GroupPageViewModelDelegate: class { |
|
16 |
- func didSelect(_ item: PhotoItem) |
|
17 |
- func navigateToGroupDetail() |
|
18 |
- func navigateToGroupQR() |
|
19 |
-} |
|
20 |
- |
|
21 |
-public class GroupPageViewModel { |
|
22 |
- private let respository: GroupPhotoRepository |
|
23 |
- private let items: BehaviorRelay<[PhotoItem]> |
|
24 |
- |
|
25 |
- weak var delegate: GroupPageViewModelDelegate? |
|
26 |
- |
|
27 |
- init(groupId: String) { |
|
28 |
- respository = GroupPhotoRepository(groupId: groupId) |
|
29 |
- items = BehaviorRelay<[PhotoItem]>(value: []) |
|
30 |
- } |
|
31 |
- |
|
32 |
- public var groupPhotoContents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> { |
|
33 |
- return items.map({ model in |
|
34 |
- return [AnimatableSectionModel(model: 0, items: model)] |
|
35 |
- }) |
|
36 |
- } |
|
37 |
- |
|
38 |
- public func submit(image: UIImage) { |
|
39 |
- let edge = image.size.width > image.size.height ? image.size.height : image.size.width |
|
40 |
-// let newImage = image.scaledImage(1280 / edge), |
|
41 |
- guard let data = image.jpegData(compressionQuality: 0.4) else { return } |
|
42 |
- |
|
43 |
- respository.upload(data: data) |
|
44 |
- } |
|
45 |
- |
|
46 |
- public func reload() { |
|
47 |
- respository.load(page: 1) |
|
48 |
- } |
|
49 |
- |
|
50 |
- public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize { |
|
51 |
- let item = items.value[indexPath.row] |
|
52 |
- let w = item.photo_thumbnail_w |
|
53 |
- let h = item.photo_thumbnail_h |
|
54 |
- return CGSize(width: w, height: h) |
|
55 |
- } |
|
56 |
-} |
|
57 |
- |
|
58 |
-extension GroupPageViewModel { |
|
59 |
- public func didSelect(_ item: PhotoItem) { |
|
60 |
- delegate?.didSelect(item) |
|
61 |
- } |
|
62 |
- |
|
63 |
- public func navigateToGroupDetail() { |
|
64 |
- delegate?.navigateToGroupDetail() |
|
65 |
- } |
|
66 |
- |
|
67 |
- public func navigateToGroupQR() { |
|
68 |
- delegate?.navigateToGroupDetail() |
|
69 |
- } |
|
70 |
-} |
@@ -8,13 +8,13 @@ |
||
8 | 8 |
|
9 | 9 |
import UIKit |
10 | 10 |
|
11 |
-extension UIBarButtonItem { |
|
11 |
+public extension UIBarButtonItem { |
|
12 | 12 |
convenience init(space: CGFloat) { |
13 | 13 |
self.init(barButtonSystemItem: .fixedSpace, target: nil, action: nil) |
14 | 14 |
self.width = space |
15 | 15 |
} |
16 | 16 |
|
17 |
- convenience init(image: UIImage, target: Any, action: Selector) { |
|
17 |
+ convenience init(image: UIImage?, target: Any, action: Selector) { |
|
18 | 18 |
let button = UIButton(type: .custom) |
19 | 19 |
button.frame = CGRect(x: 0, y: 0, width: 40, height: 40) |
20 | 20 |
button.setImage(image, for: .normal) |
@@ -49,18 +49,30 @@ extension UIBarButtonItem { |
||
49 | 49 |
} |
50 | 50 |
|
51 | 51 |
convenience init(images: [UIImage?], btnSpace: CGFloat, target: Any, actions: [Selector]) { |
52 |
- let barView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 44)) |
|
53 |
- var lastX: CGFloat = 0 |
|
52 |
+ let barView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 36)) |
|
53 |
+ barView.backgroundColor = UIColor.cyan |
|
54 |
+ |
|
55 |
+ var last: UIButton? |
|
54 | 56 |
for (image, action) in zip(images, actions) { |
55 | 57 |
let button = UIButton(type: .custom) |
56 |
- button.frame = CGRect(x: lastX, y: 2, width: 40, height: 40) |
|
58 |
+ button.translatesAutoresizingMaskIntoConstraints = false |
|
57 | 59 |
button.setImage(image, for: .normal) |
58 | 60 |
button.addTarget(target, action: action, for: .touchDown) |
59 |
- button.center = CGPoint(x: button.center.x, y: barView.center.y) |
|
60 | 61 |
barView.addSubview(button) |
61 |
- lastX += button.width + btnSpace |
|
62 |
+ |
|
63 |
+ NSLayoutConstraint.activate([ |
|
64 |
+ button.widthAnchor.constraint(equalToConstant: 36), |
|
65 |
+ button.heightAnchor.constraint(equalToConstant: 36), |
|
66 |
+ button.centerYAnchor.constraint(equalTo: barView.centerYAnchor), |
|
67 |
+ button.leadingAnchor.constraint(equalTo: last?.trailingAnchor ?? barView.leadingAnchor) |
|
68 |
+ ]) |
|
69 |
+ last = button |
|
62 | 70 |
} |
63 |
- barView.width = lastX |
|
71 |
+ |
|
72 |
+ if let l = last { |
|
73 |
+ NSLayoutConstraint.activate([l.trailingAnchor.constraint(equalTo: barView.trailingAnchor)]) |
|
74 |
+ } |
|
75 |
+ |
|
64 | 76 |
self.init(customView: barView) |
65 | 77 |
} |
66 | 78 |
} |
@@ -20,9 +20,9 @@ public extension UIViewController { |
||
20 | 20 |
} |
21 | 21 |
|
22 | 22 |
|
23 |
- @objc func popController(animated: Bool = true) { |
|
24 |
- navigationController?.popViewController(animated: animated) |
|
25 |
- } |
|
23 |
+// @objc func popViewController(animated: Bool = true) { |
|
24 |
+// navigationController?.popViewController(animated: animated) |
|
25 |
+// } |
|
26 | 26 |
|
27 | 27 |
func popToController(_ vc: UIViewController, animated: Bool = true) { |
28 | 28 |
navigationController?.popToViewController(vc, animated: animated) |
@@ -0,0 +1,13 @@ |
||
1 |
+// |
|
2 |
+// Storyboarded.swift |
|
3 |
+// PaiaiUIKit |
|
4 |
+// |
|
5 |
+// Created by ffib on 2019/1/29. |
|
6 |
+// Copyright © 2019 yb. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import UIKit |
|
10 |
+ |
|
11 |
+public protocol Storyboarded where Self: UIViewController { |
|
12 |
+ static func instantiate() -> Self |
|
13 |
+} |
@@ -6,7 +6,7 @@ |
||
6 | 6 |
// Copyright © 2019 yb. All rights reserved. |
7 | 7 |
// |
8 | 8 |
|
9 |
-import UIKit |
|
9 |
+import Foundation |
|
10 | 10 |
|
11 | 11 |
public protocol NavigationBackDelegate: class { |
12 | 12 |
func setupNavigationBackItem() |
@@ -19,7 +19,7 @@ public extension NavigationBackDelegate where Self: UIViewController { |
||
19 | 19 |
btn.contentHorizontalAlignment = .left |
20 | 20 |
btn.frame = CGRect(x: 0, y: 0, width: 40 , height: 40) |
21 | 21 |
btn.setImage(UIImage(named: "navigation-back"), for: .normal) |
22 |
- btn.addTarget(self, action: #selector(navigationController?.popViewController(animated:)), for: .touchUpInside) |
|
22 |
+ btn.addTarget(self, action: #selector(backToViewController), for: .touchUpInside) |
|
23 | 23 |
|
24 | 24 |
let backItem = UIBarButtonItem(customView: btn) |
25 | 25 |
let spaceItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) |
@@ -28,3 +28,9 @@ public extension NavigationBackDelegate where Self: UIViewController { |
||
28 | 28 |
navigationItem.leftBarButtonItems = [spaceItem, backItem] |
29 | 29 |
} |
30 | 30 |
} |
31 |
+ |
|
32 |
+fileprivate extension UIViewController { |
|
33 |
+ @objc func backToViewController() { |
|
34 |
+ navigationController?.popViewController(animated: true) |
|
35 |
+ } |
|
36 |
+} |
@@ -11,9 +11,8 @@ import UIKit |
||
11 | 11 |
public extension UINavigationController { |
12 | 12 |
func pushViewController<T: UIViewController & NavigationBackViewController>(_ vc: T, animted: Bool = true) { |
13 | 13 |
vc.setupNavigationBackItem() |
14 |
+ (vc as? NavigationBarPushAndPopDelegate)?.setupNavigationBarPushAndPopDelegate() |
|
14 | 15 |
pushViewController(vc, animated: animted) |
15 |
- guard let recognizer = interactivePopGestureRecognizer else { return } |
|
16 |
- recognizer.isEnabled = true |
|
17 |
- recognizer.setDelegate(vc) |
|
16 |
+ (vc as? NavigationBarInteractivePopDeletegate)?.setupNavigationBarInteractivePopDelegate() |
|
18 | 17 |
} |
19 | 18 |
} |
@@ -1,20 +0,0 @@ |
||
1 |
-// |
|
2 |
-// NavigationBarDelegate.swift |
|
3 |
-// PaiaiUIKit |
|
4 |
-// |
|
5 |
-// Created by ffib on 2019/1/16. |
|
6 |
-// Copyright © 2019 yb. All rights reserved. |
|
7 |
-// |
|
8 |
- |
|
9 |
-import Foundation |
|
10 |
- |
|
11 |
-protocol NavigationBarDelegate { |
|
12 |
- func setupNavigationBarDelegate() |
|
13 |
-} |
|
14 |
- |
|
15 |
-extension NavigationBarDelegate where Self: NavigationBarPushAndPopDelegate & NavigationBarInteractivePopDeletegate { |
|
16 |
- func setupNavigationBarDelegate() { |
|
17 |
- setupNavigationBarPushAndPopDelegate() |
|
18 |
- setupNavigationBarInteractivePopDelegate() |
|
19 |
- } |
|
20 |
-} |
@@ -1,34 +0,0 @@ |
||
1 |
-// |
|
2 |
-// NavigationBarInOut.swift |
|
3 |
-// PaiaiUIKit |
|
4 |
-// |
|
5 |
-// Created by ffib on 2019/1/15. |
|
6 |
-// Copyright © 2019 yb. All rights reserved. |
|
7 |
-// |
|
8 |
- |
|
9 |
-import UIKit |
|
10 |
- |
|
11 |
-public protocol NavigationBarInOut: class { |
|
12 |
- var navigationView: UIView { get } |
|
13 |
- func navigationBarFadeIn() |
|
14 |
- func navigationBarFadeOut() |
|
15 |
- func navigationBarFadeOutWithPercentage(_ percentage: CGFloat) |
|
16 |
-} |
|
17 |
- |
|
18 |
-public extension NavigationBarInOut where Self: UIViewController { |
|
19 |
- func navigationBarFadeIn() { |
|
20 |
- UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: [], animations: { |
|
21 |
- self.navigationView.alpha = 0 |
|
22 |
- }, completion: nil) |
|
23 |
- } |
|
24 |
- |
|
25 |
- func navigationBarFadeOut() { |
|
26 |
- UIView.animate(withDuration: 0.5, animations: { |
|
27 |
- self.navigationView.alpha = 1 |
|
28 |
- }, completion: nil) |
|
29 |
- } |
|
30 |
- |
|
31 |
- func navigationBarFadeOutWithPercentage(_ percentage: CGFloat) { |
|
32 |
- self.navigationView.alpha = 1 * percentage |
|
33 |
- } |
|
34 |
-} |
@@ -0,0 +1,64 @@ |
||
1 |
+// |
|
2 |
+// NavigationBarInOutAnimator.swift |
|
3 |
+// PaiaiUIKit |
|
4 |
+// |
|
5 |
+// Created by ffib on 2019/1/15. |
|
6 |
+// Copyright © 2019 yb. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import UIKit |
|
10 |
+ |
|
11 |
+public protocol NavigationBarInOutAnimator: class { |
|
12 |
+ var navigationView: UIView { get } |
|
13 |
+ func navigationBarFadeIn() |
|
14 |
+ func navigationBarFadeOut() |
|
15 |
+ func navigationBarFadeAndMoveIn() |
|
16 |
+ func navigationBarFadeAndMoveOut() |
|
17 |
+ func navigationBarFadeOutWithPercentage(_ percentage: CGFloat) |
|
18 |
+ func navigationBarFadeInWithPercentage(_ percentage: CGFloat) |
|
19 |
+} |
|
20 |
+ |
|
21 |
+public extension NavigationBarInOutAnimator where Self: UIViewController & NavigationBarPushAndPopDelegate { |
|
22 |
+ func navigationBarFadeIn() { |
|
23 |
+ UIView.animate(withDuration: 0.3, animations: { |
|
24 |
+ self.navigationView.alpha = 1 |
|
25 |
+ }, completion: nil) |
|
26 |
+ } |
|
27 |
+ |
|
28 |
+ func navigationBarFadeOut() { |
|
29 |
+ UIView.animate(withDuration: 0.3, animations: { |
|
30 |
+ self.navigationView.alpha = 0 |
|
31 |
+ }, completion: nil) |
|
32 |
+ } |
|
33 |
+ |
|
34 |
+ func navigationBarFadeAndMoveIn() { |
|
35 |
+ setNavigationBar() |
|
36 |
+ navigationController?.navigationBar.layoutIfNeeded() |
|
37 |
+ |
|
38 |
+ let originX = navigationView.center.x |
|
39 |
+ navigationView.center.x = UIScreen.main.bounds.width |
|
40 |
+ |
|
41 |
+ UIView.animate(withDuration: 0.3, animations: { |
|
42 |
+ self.navigationView.alpha = 1 |
|
43 |
+ self.navigationView.center.x = originX |
|
44 |
+ }, completion: nil) |
|
45 |
+ } |
|
46 |
+ |
|
47 |
+ func navigationBarFadeAndMoveOut() { |
|
48 |
+ UIView.animate(withDuration: 0.3, animations: { |
|
49 |
+ self.navigationView.alpha = 0 |
|
50 |
+ self.navigationView.center.x = UIScreen.main.bounds.width |
|
51 |
+ }, completion: { _ in |
|
52 |
+ self.navigationView.removeFromSuperview() |
|
53 |
+ }) |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ func navigationBarFadeOutWithPercentage(_ percentage: CGFloat) { |
|
57 |
+ navigationView.alpha = 1 * (1 - 1.1 * percentage) |
|
58 |
+ navigationView.center.x = UIScreen.main.bounds.width / 2 * (1 + 1.1 * percentage) |
|
59 |
+ } |
|
60 |
+ |
|
61 |
+ func navigationBarFadeInWithPercentage(_ percentage: CGFloat) { |
|
62 |
+ navigationView.alpha = 1 * percentage |
|
63 |
+ } |
|
64 |
+} |
@@ -12,8 +12,7 @@ public protocol NavigationBarInteractivePopDeletegate: class { |
||
12 | 12 |
func setupNavigationBarInteractivePopDelegate() |
13 | 13 |
} |
14 | 14 |
|
15 |
-public extension NavigationBarInteractivePopDeletegate where Self: UIViewController & NavigationBarInOut { |
|
16 |
- |
|
15 |
+public extension NavigationBarInteractivePopDeletegate where Self: UIViewController & NavigationBarInOutAnimator { |
|
17 | 16 |
func setupNavigationBarInteractivePopDelegate() { |
18 | 17 |
guard let nav = navigationController else { return } |
19 | 18 |
nav.interactivePopGestureRecognizer?.addTarget(self, action: #selector(interactivePopAnimation(gesture:))) |
@@ -22,23 +21,43 @@ public extension NavigationBarInteractivePopDeletegate where Self: UIViewControl |
||
22 | 21 |
|
23 | 22 |
extension UIViewController { |
24 | 23 |
@objc func interactivePopAnimation(gesture: UIPanGestureRecognizer) { |
24 |
+ guard let `self` = self as? (NavigationBarInOutAnimator & UIViewController) else { return } |
|
25 | 25 |
let point = gesture.translation(in: view) |
26 | 26 |
let percentage = calculatePercentageOfOffsets(point: point) |
27 |
- (self as? NavigationBarInOut)?.navigationBarFadeOutWithPercentage(percentage) |
|
28 | 27 |
|
29 |
- switch gesture.state { |
|
30 |
- case .ended: |
|
31 |
- if percentage > 0.5 { |
|
32 |
- (self as? NavigationBarInOut)?.navigationBarFadeOut() |
|
33 |
- } else { |
|
34 |
- (self as? NavigationBarInOut)?.navigationBarFadeIn() |
|
35 |
- } |
|
36 |
- default: |
|
28 |
+ /// naivgationController == nil popped viewController |
|
29 |
+ /// navigationController?.visibleViewController == self pop to viewController |
|
30 |
+ |
|
31 |
+ let percentageAnimation: ((CGFloat) -> Void) |
|
32 |
+ let fadeInAnimation: (() -> Void) |
|
33 |
+ let fadeOutAnimation: (() -> Void) |
|
34 |
+ if navigationController == nil { |
|
35 |
+ percentageAnimation = self.navigationBarFadeOutWithPercentage |
|
36 |
+ fadeInAnimation = self.navigationBarFadeAndMoveIn |
|
37 |
+ fadeOutAnimation = self.navigationBarFadeAndMoveOut |
|
38 |
+ } else if navigationController?.visibleViewController == self { |
|
39 |
+ percentageAnimation = self.navigationBarFadeInWithPercentage |
|
40 |
+ fadeInAnimation = self.navigationBarFadeIn |
|
41 |
+ fadeOutAnimation = self.navigationBarFadeOut |
|
42 |
+ } else { |
|
37 | 43 |
return |
38 | 44 |
} |
45 |
+ |
|
46 |
+ percentageAnimation(percentage) |
|
47 |
+ |
|
48 |
+ guard gesture.state == .ended else { return } |
|
49 |
+ |
|
50 |
+ for vc in navigationController?.viewControllers ?? [] { print(vc) } |
|
51 |
+ if (percentage > 0.5 && navigationController == nil) || |
|
52 |
+ (percentage < 0.5 && navigationController?.visibleViewController == self) { |
|
53 |
+ fadeOutAnimation() |
|
54 |
+ } else if (percentage < 0.5 && navigationController == nil) || |
|
55 |
+ (percentage > 0.5 && navigationController?.visibleViewController == self) { |
|
56 |
+ fadeInAnimation() |
|
57 |
+ } |
|
39 | 58 |
} |
40 | 59 |
|
41 |
- func calculatePercentageOfOffsets(point: CGPoint) -> CGFloat { |
|
60 |
+ private func calculatePercentageOfOffsets(point: CGPoint) -> CGFloat { |
|
42 | 61 |
return point.x / view.bounds.width |
43 | 62 |
} |
44 | 63 |
} |
@@ -8,5 +8,5 @@ |
||
8 | 8 |
|
9 | 9 |
import Foundation |
10 | 10 |
|
11 |
-typealias NavigationBarInteractiveViewController = NavigationBarDelegate & NavigationBarInteractivePopDeletegate & NavigationBarPushAndPopDelegate & NavigationBarInOut & NavigationControllerDelegate |
|
11 |
+public typealias NavigationBarInteractiveViewController = NavigationBarInteractivePopDeletegate & NavigationBarPushAndPopDelegate & NavigationBarInOutAnimator & NavigationControllerDelegate |
|
12 | 12 |
|
@@ -10,21 +10,40 @@ import Foundation |
||
10 | 10 |
|
11 | 11 |
public protocol NavigationBarPushAndPopDelegate: class { |
12 | 12 |
func setupNavigationBarPushAndPopDelegate() |
13 |
+ func setNavigationBar() |
|
13 | 14 |
} |
14 | 15 |
|
15 | 16 |
public extension NavigationBarPushAndPopDelegate where Self: UIViewController & NavigationControllerDelegate { |
16 | 17 |
func setupNavigationBarPushAndPopDelegate() { |
17 | 18 |
navigationController?.setDelegate(self) |
18 | 19 |
} |
20 |
+ |
|
21 |
+ func setNavigationBar() {} |
|
19 | 22 |
} |
20 | 23 |
|
21 |
-public extension NavigationControllerDelegate where Self: UIViewController & NavigationBarInOut { |
|
24 |
+public extension NavigationControllerDelegate where Self: UIViewController { |
|
25 |
+ |
|
22 | 26 |
func navigationController(_ navigationController: UINavigationController, |
23 |
- willShow viewController: UIViewController, animated: Bool) { |
|
24 |
- if viewController != self { |
|
25 |
- navigationBarFadeIn() |
|
27 |
+ animationControllerFor operation: UINavigationController.Operation, |
|
28 |
+ from fromVC: UIViewController, |
|
29 |
+ to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { |
|
30 |
+ |
|
31 |
+ if operation == .push { |
|
32 |
+ (toVC as? NavigationBarInOutAnimator)?.navigationBarFadeAndMoveIn() |
|
33 |
+ (fromVC as? NavigationBarInOutAnimator)?.navigationBarFadeOut() |
|
26 | 34 |
} else { |
27 |
- navigationBarFadeOut() |
|
35 |
+ (toVC as? NavigationBarInOutAnimator)?.navigationBarFadeIn() |
|
36 |
+ (fromVC as? NavigationBarInOutAnimator)?.navigationBarFadeAndMoveOut() |
|
28 | 37 |
} |
38 |
+ |
|
39 |
+ return nil |
|
40 |
+ } |
|
41 |
+ |
|
42 |
+ func navigationController(_ navigationController: UINavigationController, |
|
43 |
+ didShow viewController: UIViewController, animated: Bool) { |
|
44 |
+ guard let recognizer = navigationController.interactivePopGestureRecognizer else { return } |
|
45 |
+ recognizer.isEnabled = true |
|
46 |
+ guard let vc = viewController as? GestureRecognizerDelegate else { return } |
|
47 |
+ recognizer.setDelegate(vc) |
|
29 | 48 |
} |
30 | 49 |
} |
@@ -72,7 +72,8 @@ open class PageViewController: UIViewController { |
||
72 | 72 |
constructViewHierarchy() |
73 | 73 |
activateConstraints() |
74 | 74 |
setMenuGestureRecognizer() |
75 |
- setupNavigationBarDelegate() |
|
75 |
+ setupNavigationBarPushAndPopDelegate() |
|
76 |
+ setupNavigationBarInteractivePopDelegate() |
|
76 | 77 |
} |
77 | 78 |
|
78 | 79 |
open override func viewDidLayoutSubviews() { |
@@ -367,7 +368,7 @@ fileprivate extension PageViewController { |
||
367 | 368 |
} |
368 | 369 |
} |
369 | 370 |
|
370 |
-extension PageViewController: NavigationBarInteractiveViewController { |
|
371 |
+extension PageViewController: NavigationBarInteractiveViewController { |
|
371 | 372 |
public var navigationView: UIView { |
372 | 373 |
return menuView |
373 | 374 |
} |
@@ -37,7 +37,7 @@ extension UIGestureRecognizer { |
||
37 | 37 |
set { objc_setAssociatedObject(self, &AssociatedKeys.proxyKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } |
38 | 38 |
} |
39 | 39 |
|
40 |
- func setDelegate<T: GestureRecognizerDelegate>(_ target: T) { |
|
40 |
+ func setDelegate(_ target: GestureRecognizerDelegate) { |
|
41 | 41 |
proxy = GestureRecognizerProxy(target: target) |
42 | 42 |
delegate = proxy |
43 | 43 |
} |
@@ -0,0 +1,19 @@ |
||
1 |
+// |
|
2 |
+// NavigationBarDelegate.swift |
|
3 |
+// PaiaiUIKit |
|
4 |
+// |
|
5 |
+// Created by ffib on 2019/1/30. |
|
6 |
+// Copyright © 2019 yb. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import Foundation |
|
10 |
+ |
|
11 |
+public protocol NavigationBarDelegate: class { |
|
12 |
+ func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool |
|
13 |
+} |
|
14 |
+ |
|
15 |
+public extension NavigationBarDelegate { |
|
16 |
+ func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool { |
|
17 |
+ return true |
|
18 |
+ } |
|
19 |
+} |
@@ -0,0 +1,38 @@ |
||
1 |
+// |
|
2 |
+// NavigationBarProxy.swift |
|
3 |
+// PaiaiUIKit |
|
4 |
+// |
|
5 |
+// Created by ffib on 2019/1/30. |
|
6 |
+// Copyright © 2019 yb. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import UIKit |
|
10 |
+ |
|
11 |
+class NavigationBarProxy: NSObject, UINavigationBarDelegate { |
|
12 |
+ weak var delegate: NavigationBarDelegate? |
|
13 |
+ |
|
14 |
+ init(target: NavigationBarDelegate) { |
|
15 |
+ delegate = target |
|
16 |
+ } |
|
17 |
+ |
|
18 |
+ func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool { |
|
19 |
+ guard let d = delegate else { return true } |
|
20 |
+ return d.navigationBar(navigationBar, shouldPush: item) |
|
21 |
+ } |
|
22 |
+} |
|
23 |
+ |
|
24 |
+extension UINavigationBar { |
|
25 |
+ private struct AssociatedKeys { |
|
26 |
+ static var proxyKey = "NavigationBarProxyKey" |
|
27 |
+ } |
|
28 |
+ |
|
29 |
+ private var proxy: NavigationBarProxy? { |
|
30 |
+ get { return objc_getAssociatedObject(self, &AssociatedKeys.proxyKey) as? NavigationBarProxy } |
|
31 |
+ set { objc_setAssociatedObject(self, &AssociatedKeys.proxyKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } |
|
32 |
+ } |
|
33 |
+ |
|
34 |
+ func setDelegate<T: NavigationBarDelegate>(_ target: T) { |
|
35 |
+ proxy = NavigationBarProxy(target: target) |
|
36 |
+ delegate = proxy |
|
37 |
+ } |
|
38 |
+} |
@@ -11,4 +11,27 @@ import Foundation |
||
11 | 11 |
public protocol NavigationControllerDelegate: class { |
12 | 12 |
func navigationController(_ navigationController: UINavigationController, |
13 | 13 |
willShow viewController: UIViewController, animated: Bool) |
14 |
+ |
|
15 |
+ func navigationController(_ navigationController: UINavigationController, |
|
16 |
+ didShow viewController: UIViewController, animated: Bool) |
|
17 |
+ |
|
18 |
+ func navigationController(_ navigationController: UINavigationController, |
|
19 |
+ animationControllerFor operation: UINavigationController.Operation, |
|
20 |
+ from fromVC: UIViewController, |
|
21 |
+ to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? |
|
22 |
+} |
|
23 |
+ |
|
24 |
+public extension NavigationControllerDelegate { |
|
25 |
+ |
|
26 |
+ func navigationController(_ navigationController: UINavigationController, |
|
27 |
+ willShow viewController: UIViewController, animated: Bool) {} |
|
28 |
+ |
|
29 |
+ func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {} |
|
30 |
+ |
|
31 |
+ func navigationController(_ navigationController: UINavigationController, |
|
32 |
+ animationControllerFor operation: UINavigationController.Operation, |
|
33 |
+ from fromVC: UIViewController, |
|
34 |
+ to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { |
|
35 |
+ return nil |
|
36 |
+ } |
|
14 | 37 |
} |
@@ -15,9 +15,21 @@ class NavigationControllerProxy: NSObject, UINavigationControllerDelegate { |
||
15 | 15 |
delegate = target |
16 | 16 |
} |
17 | 17 |
|
18 |
+ func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { |
|
19 |
+ delegate?.navigationController(navigationController, willShow: viewController, animated: true) |
|
20 |
+ } |
|
21 |
+ |
|
22 |
+ func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { |
|
23 |
+ delegate?.navigationController(navigationController, didShow: viewController, animated: true) |
|
24 |
+ } |
|
25 |
+ |
|
18 | 26 |
func navigationController(_ navigationController: UINavigationController, |
19 |
- willShow viewController: UIViewController, animated: Bool) { |
|
20 |
- delegate?.navigationController(navigationController, willShow: viewController, animated: animated) |
|
27 |
+ animationControllerFor operation: UINavigationController.Operation, |
|
28 |
+ from fromVC: UIViewController, |
|
29 |
+ to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { |
|
30 |
+ return delegate?.navigationController(navigationController, |
|
31 |
+ animationControllerFor: operation, |
|
32 |
+ from: fromVC, to: toVC) |
|
21 | 33 |
} |
22 | 34 |
} |
23 | 35 |
|
@@ -8,7 +8,7 @@ |
||
8 | 8 |
|
9 | 9 |
import Foundation |
10 | 10 |
|
11 |
-public protocol ViewControllerTransitioningDelegate where Self: UIViewController { |
|
11 |
+public protocol ViewControllerTransitioningDelegate: class { |
|
12 | 12 |
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? |
13 | 13 |
|
14 | 14 |
func animationController(forPresented presented: UIViewController, |
@@ -9,7 +9,7 @@ |
||
9 | 9 |
import Foundation |
10 | 10 |
|
11 | 11 |
class ViewControllerTransitioningProxy: NSObject, UIViewControllerTransitioningDelegate { |
12 |
- var delegate: ViewControllerTransitioningDelegate? |
|
12 |
+ weak var delegate: ViewControllerTransitioningDelegate? |
|
13 | 13 |
|
14 | 14 |
init(target: ViewControllerTransitioningDelegate) { |
15 | 15 |
delegate = target |
@@ -46,7 +46,9 @@ public final class AppCoordinator { |
||
46 | 46 |
viewController: messageVC)] |
47 | 47 |
|
48 | 48 |
let homeCoordinator = HomeCoordinator(homeVC, userInfoViewModel: shareUserInfoViewModel) |
49 |
- let messageCoordinator = MessageCoordinator(messageVC, userInfoViewModel: shareUserInfoViewModel) |
|
49 |
+ let messageCoordinator = MessageCoordinator(messageVC, |
|
50 |
+ navigationController: navigationController, |
|
51 |
+ userInfoViewModel: shareUserInfoViewModel) |
|
50 | 52 |
|
51 | 53 |
coordinators[.home] = homeCoordinator |
52 | 54 |
coordinators[.message] = messageCoordinator |
@@ -0,0 +1,24 @@ |
||
1 |
+// |
|
2 |
+// GroupCoordinator.swift |
|
3 |
+// Paiai_iOS |
|
4 |
+// |
|
5 |
+// Created by ffib on 2019/1/29. |
|
6 |
+// Copyright © 2019 yb. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import Foundation |
|
10 |
+ |
|
11 |
+class GroupCoordinator: Coordinator { |
|
12 |
+ |
|
13 |
+ var navigationController: UINavigationController |
|
14 |
+ |
|
15 |
+ init(navigationController: UINavigationController) { |
|
16 |
+ self.navigationController = navigationController |
|
17 |
+ } |
|
18 |
+} |
|
19 |
+ |
|
20 |
+extension UIStoryboard { |
|
21 |
+ static var group: UIStoryboard { |
|
22 |
+ return UIStoryboard(name: "Group", bundle: Bundle(identifier: "com.Paiai-iOS")) |
|
23 |
+ } |
|
24 |
+} |
@@ -0,0 +1,252 @@ |
||
1 |
+// |
|
2 |
+// GroupViewController.swift |
|
3 |
+// PaiAi |
|
4 |
+// |
|
5 |
+// Created by zhengjianfei on 16/3/28. |
|
6 |
+// Copyright © 2016年 FFIB. All rights reserved. |
|
7 |
+// |
|
8 |
+ |
|
9 |
+import UIKit |
|
10 |
+import RxSwift |
|
11 |
+import RxCocoa |
|
12 |
+import RxDataSources |
|
13 |
+import PaiaiUIKit |
|
14 |
+import PaiaiDataKit |
|
15 |
+import PullToRefresh |
|
16 |
+ |
|
17 |
+final class GroupViewController: UIViewController { |
|
18 |
+ |
|
19 |
+ // MARK: Storyboard property |
|
20 |
+ @IBOutlet var collectionView: UICollectionView! |
|
21 |
+ @IBOutlet weak var photographBtn: UIButton! |
|
22 |
+ |
|
23 |
+ // MARK: custom UI property |
|
24 |
+ var navigationBarView: UIView = { |
|
25 |
+ let view = UIView() |
|
26 |
+ view.alpha = 0 |
|
27 |
+ |
|
28 |
+ return view |
|
29 |
+ }() |
|
30 |
+ |
|
31 |
+ var navigationBarViewTitle: UILabel = { |
|
32 |
+ let label = UILabel() |
|
33 |
+ label.textColor = UIColor.white |
|
34 |
+ |
|
35 |
+ return label |
|
36 |
+ }() |
|
37 |
+ |
|
38 |
+ var navigationBarViewImage: UIImageView = { |
|
39 |
+ let image = UIImageView() |
|
40 |
+ image.cornerRadius = 20 |
|
41 |
+ return image |
|
42 |
+ }() |
|
43 |
+ |
|
44 |
+ // MARK: data property |
|
45 |
+ var viewModel: GroupViewModel! |
|
46 |
+ var groupItem: GroupItem! |
|
47 |
+ |
|
48 |
+ fileprivate var navigationViewNotReady = true |
|
49 |
+ fileprivate let disposeBag = DisposeBag() |
|
50 |
+ |
|
51 |
+ override func viewDidLoad() { |
|
52 |
+ super.viewDidLoad() |
|
53 |
+ initalize() |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ func initalize() { |
|
57 |
+ collectionView.register(UINib(nibName: "PhotoCell", |
|
58 |
+ bundle: Bundle(identifier: "com.Paiai-iOS")), |
|
59 |
+ forCellWithReuseIdentifier: "photoCell") |
|
60 |
+ setup() |
|
61 |
+ binding() |
|
62 |
+ } |
|
63 |
+ |
|
64 |
+ private func setup() { |
|
65 |
+ setupReloadControl() |
|
66 |
+ } |
|
67 |
+ |
|
68 |
+ private func setupReloadControl() { |
|
69 |
+ collectionView.addPullToRefresh(PullToRefresh()) { |
|
70 |
+ [unowned self] in |
|
71 |
+ self.viewModel.reload() |
|
72 |
+ } |
|
73 |
+ } |
|
74 |
+} |
|
75 |
+ |
|
76 |
+/// UI bindings |
|
77 |
+fileprivate extension GroupViewController { |
|
78 |
+ |
|
79 |
+ var dataSource: RxCollectionViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, PhotoItem>> { |
|
80 |
+ return RxCollectionViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, PhotoItem>>(configureCell: |
|
81 |
+ { (dataSource, collectionView, indexPath, item) -> UICollectionViewCell in |
|
82 |
+ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell |
|
83 |
+ cell.setInfo(item, source: .group) |
|
84 |
+ return cell |
|
85 |
+ }) |
|
86 |
+ } |
|
87 |
+ |
|
88 |
+ func binding() { |
|
89 |
+ bindInteraction() |
|
90 |
+ bindViewModelToRefreshing() |
|
91 |
+ bindCollectionViewDelegate() |
|
92 |
+ bindViewModelToCollectionView() |
|
93 |
+ bindCollectionViewToViewModel() |
|
94 |
+ bindViewModelToNavigationBarImage() |
|
95 |
+ bindViewModelToNavigationBarTitle() |
|
96 |
+ } |
|
97 |
+ |
|
98 |
+ func bindInteraction() { |
|
99 |
+ photographBtn.rx.tap.bind(to: viewModel.photographBtnTapped).disposed(by: disposeBag) |
|
100 |
+ } |
|
101 |
+ |
|
102 |
+ func bindViewModelToRefreshing() { |
|
103 |
+ viewModel.isLoading |
|
104 |
+ .subscribe(onNext: {[unowned self] flag in |
|
105 |
+ self.collectionView.endRefreshing(at: .top) |
|
106 |
+ }).disposed(by: disposeBag) |
|
107 |
+ } |
|
108 |
+ |
|
109 |
+ func bindCollectionViewDelegate() { |
|
110 |
+ collectionView.rx.setDelegate(self).disposed(by: disposeBag) |
|
111 |
+ } |
|
112 |
+ |
|
113 |
+ func bindViewModelToCollectionView() { |
|
114 |
+ viewModel.contents |
|
115 |
+ .bind(to: collectionView.rx.items(dataSource: dataSource)) |
|
116 |
+ .disposed(by: disposeBag) |
|
117 |
+ } |
|
118 |
+ |
|
119 |
+ func bindCollectionViewToViewModel() { |
|
120 |
+ collectionView.rx.modelSelected(PhotoItem.self) |
|
121 |
+ .asDriver() |
|
122 |
+ .drive(onNext: { [unowned self] in self.viewModel.didSelect($0) }) |
|
123 |
+ .disposed(by: disposeBag) |
|
124 |
+ } |
|
125 |
+ |
|
126 |
+ func bindViewModelToNavigationBarTitle() { |
|
127 |
+ navigationBarViewTitle.text = groupItem.group_name |
|
128 |
+ } |
|
129 |
+ |
|
130 |
+ func bindViewModelToNavigationBarImage() { |
|
131 |
+ navigationBarViewImage.setImage(groupItem.group_avatar, |
|
132 |
+ placeholder: UIImage(named: "Group\(groupItem.group_default_avatar)")) |
|
133 |
+ } |
|
134 |
+} |
|
135 |
+ |
|
136 |
+extension GroupViewController: NavigationBarInteractiveViewController { |
|
137 |
+ var navigationView: UIView { |
|
138 |
+ return navigationBarView |
|
139 |
+ } |
|
140 |
+ |
|
141 |
+ func setNavigationBar() { |
|
142 |
+ guard navigationViewNotReady else { return } |
|
143 |
+ setRightBarButtonItems() |
|
144 |
+ construvtNaivgationViewHierarchy() |
|
145 |
+ activateConstraintsNavigation() |
|
146 |
+ |
|
147 |
+ navigationViewNotReady = false |
|
148 |
+ } |
|
149 |
+ |
|
150 |
+ private func construvtNaivgationViewHierarchy() { |
|
151 |
+ navigationController?.navigationBar.addSubview(navigationBarView) |
|
152 |
+ navigationBarView.addSubview(navigationBarViewImage) |
|
153 |
+ navigationBarView.addSubview(navigationBarViewTitle) |
|
154 |
+ } |
|
155 |
+ |
|
156 |
+ private func setRightBarButtonItems() { |
|
157 |
+ let item = UIBarButtonItem(images: [UIImage(named: "navigation-QR"), |
|
158 |
+ UIImage(named: "navigation-right")], |
|
159 |
+ btnSpace: 6, |
|
160 |
+ target: self, |
|
161 |
+ actions: [#selector(viewModel!.presentGroupQR), |
|
162 |
+ #selector(viewModel!.navigateToGroupDetail)]) |
|
163 |
+ navigationItem.rightBarButtonItem = item |
|
164 |
+ } |
|
165 |
+} |
|
166 |
+ |
|
167 |
+/// layout |
|
168 |
+fileprivate extension GroupViewController { |
|
169 |
+ |
|
170 |
+ func activateConstraintsNavigation() { |
|
171 |
+ activateConstraintsNavigationBarView() |
|
172 |
+ activateConstraintsNavigationBarViewImage() |
|
173 |
+ activateConstraintsNavigationBarViewTitle() |
|
174 |
+ } |
|
175 |
+ |
|
176 |
+ func activateConstraintsNavigationBarView() { |
|
177 |
+ guard let barContentView = navigationController?.navigationBar else { return } |
|
178 |
+ |
|
179 |
+ navigationBarView.translatesAutoresizingMaskIntoConstraints = false |
|
180 |
+ |
|
181 |
+ NSLayoutConstraint.activate([ |
|
182 |
+ navigationBarView.topAnchor.constraint(equalTo: barContentView.topAnchor), |
|
183 |
+ navigationBarView.bottomAnchor.constraint(equalTo: barContentView.bottomAnchor), |
|
184 |
+ navigationBarView.centerXAnchor.constraint(equalTo: barContentView.centerXAnchor) |
|
185 |
+ ]) |
|
186 |
+ } |
|
187 |
+ |
|
188 |
+ func activateConstraintsNavigationBarViewTitle() { |
|
189 |
+ navigationBarViewTitle.translatesAutoresizingMaskIntoConstraints = false |
|
190 |
+ NSLayoutConstraint.activate([ |
|
191 |
+ navigationBarViewTitle.centerYAnchor.constraint(equalTo: navigationBarView.centerYAnchor), |
|
192 |
+ navigationBarViewTitle.leadingAnchor.constraint(equalTo: navigationBarViewImage.trailingAnchor, constant: 6), |
|
193 |
+ navigationBarViewTitle.trailingAnchor.constraint(equalTo: navigationBarView.trailingAnchor), |
|
194 |
+ navigationBarViewTitle.widthAnchor.constraint(lessThanOrEqualToConstant: view.width - 200) |
|
195 |
+ ]) |
|
196 |
+ } |
|
197 |
+ |
|
198 |
+ func activateConstraintsNavigationBarViewImage() { |
|
199 |
+ navigationBarViewImage.translatesAutoresizingMaskIntoConstraints = false |
|
200 |
+ |
|
201 |
+ NSLayoutConstraint.activate([ |
|
202 |
+ navigationBarViewImage.widthAnchor.constraint(equalToConstant: 40), |
|
203 |
+ navigationBarViewImage.heightAnchor.constraint(equalToConstant: 40), |
|
204 |
+ navigationBarViewImage.centerYAnchor.constraint(equalTo: navigationBarView.centerYAnchor), |
|
205 |
+ navigationBarViewImage.leadingAnchor.constraint(equalTo: navigationBarView.leadingAnchor), |
|
206 |
+ ]) |
|
207 |
+ } |
|
208 |
+} |
|
209 |
+ |
|
210 |
+extension GroupViewController: UICollectionViewDelegateFlowLayout { |
|
211 |
+ func collectionView(_ collectionView: UICollectionView, |
|
212 |
+ layout collectionViewLayout: UICollectionViewLayout, |
|
213 |
+ sizeForItemAt indexPath: IndexPath) -> CGSize { |
|
214 |
+ return viewModel.layoutSizeForIndexPath(indexPath) |
|
215 |
+ } |
|
216 |
+} |
|
217 |
+ |
|
218 |
+/// MARK: imagepicker delegate |
|
219 |
+extension GroupViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { |
|
220 |
+ |
|
221 |
+ @IBAction func takePhotoAction() { |
|
222 |
+ let vc = UIImagePickerController() |
|
223 |
+ #if (arch(i386) || arch(x86_64)) |
|
224 |
+ vc.sourceType = .photoLibrary |
|
225 |
+ #else |
|
226 |
+ vc.sourceType = .camera |
|
227 |
+ #endif |
|
228 |
+ vc.delegate = self |
|
229 |
+ present(vc, animated: true, completion: nil) |
|
230 |
+ } |
|
231 |
+ |
|
232 |
+ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { |
|
233 |
+ dismiss(animated: true, completion: nil) |
|
234 |
+ |
|
235 |
+ guard let image = info[.originalImage] as? UIImage else { return } |
|
236 |
+ |
|
237 |
+ viewModel.submit(image: image) |
|
238 |
+ } |
|
239 |
+ |
|
240 |
+ func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { |
|
241 |
+ dismiss(animated: true, completion: nil) |
|
242 |
+ } |
|
243 |
+} |
|
244 |
+ |
|
245 |
+extension GroupViewController: NavigationBackViewController {} |
|
246 |
+ |
|
247 |
+extension GroupViewController: Storyboarded { |
|
248 |
+ static func instantiate() -> GroupViewController { |
|
249 |
+ let vc = UIStoryboard.group.instantiateController(GroupViewController.self) |
|
250 |
+ return vc |
|
251 |
+ } |
|
252 |
+} |
@@ -54,7 +54,7 @@ final class CreateGroupConfirmViewController: AlertViewController { |
||
54 | 54 |
// } |
55 | 55 |
|
56 | 56 |
// func confirmAndJump() { |
57 |
-// let ctl = UIStoryboard.main.instantiateController(GroupPageController.self) |
|
57 |
+// let ctl = UIStoryboard.main.instantiateController(GroupViewController.self) |
|
58 | 58 |
// ctl.groupModel = group |
59 | 59 |
// ctl.isCreate = true |
60 | 60 |
// guard let parentController = presentingViewController as? UINavigationController else { |
@@ -1,140 +0,0 @@ |
||
1 |
-// |
|
2 |
-// GroupPageController.swift |
|
3 |
-// PaiAi |
|
4 |
-// |
|
5 |
-// Created by zhengjianfei on 16/3/28. |
|
6 |
-// Copyright © 2016年 FFIB. All rights reserved. |
|
7 |
-// |
|
8 |
- |
|
9 |
-import UIKit |
|
10 |
-import RxSwift |
|
11 |
-import RxCocoa |
|
12 |
-import RxDataSources |
|
13 |
-import PaiaiUIKit |
|
14 |
-import PaiaiDataKit |
|
15 |
- |
|
16 |
-final class GroupPageController: UIViewController { |
|
17 |
- |
|
18 |
- // MARK: Storyboard property |
|
19 |
- @IBOutlet var collectionView: UICollectionView! |
|
20 |
- @IBOutlet weak var photographLabel: UILabel! |
|
21 |
- @IBOutlet weak var photographBtn: UIButton! |
|
22 |
- |
|
23 |
- // MARK: custom UI property |
|
24 |
- var maskImageView = UIImageView() |
|
25 |
- var maskLabel = UILabel() |
|
26 |
- |
|
27 |
- // MARK: data property |
|
28 |
- var viewModel: GroupPageViewModel! |
|
29 |
- fileprivate let disposeBag = DisposeBag() |
|
30 |
- |
|
31 |
- // MARK: view function |
|
32 |
- override func viewDidLoad() { |
|
33 |
- super.viewDidLoad() |
|
34 |
- |
|
35 |
- collectionView.register(UINib(nibName: "PhotoCell", bundle: nil), |
|
36 |
- forCellWithReuseIdentifier: "photoCell") |
|
37 |
- |
|
38 |
- configurationRx() |
|
39 |
- |
|
40 |
- addReloadControl() |
|
41 |
- } |
|
42 |
- |
|
43 |
- override func viewWillAppear(_ animated: Bool) { |
|
44 |
- super.viewWillAppear(true) |
|
45 |
- makeNavigationBar() |
|
46 |
- } |
|
47 |
- |
|
48 |
- // MARK: init interface |
|
49 |
- func makeNavigationBar() { |
|
50 |
-// navigationItem.setRightBars(buttonSpace: 0, |
|
51 |
-// images: [UIImage(named: "二维码"), UIImage(named: "更多-右上角-1")], |
|
52 |
-// actions: [#selector(showEWM), #selector(pushToGroupDetailController)], |
|
53 |
-// target: self) |
|
54 |
-// titleWithbackBar = "" |
|
55 |
-// let barView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth - 150, height: 40)) |
|
56 |
-// let label = UILabel() |
|
57 |
-//// label.text = groupModel.group_name |
|
58 |
-// label.textColor = UIColor.white |
|
59 |
-// let labelWidth = min(label.sizeThatFits(CGSize(width: kScreenWidth - 200, height: 40)).width, kScreenWidth - 200) |
|
60 |
-// let imageView = UIImageView(frame: CGRect(x: 0, y: 2, width: 40, height: 40)) |
|
61 |
-// imageView.center = CGPoint(x: barView.center.x - labelWidth / 2, y: barView.center.y) |
|
62 |
-//// imageView.setImageWithNullableURL(groupModel.group_avatar, placeholderImage: UIImage(named: "Group\(groupModel.group_default_avatar)")) |
|
63 |
-// imageView.cornerRadius = 20 |
|
64 |
-// label.frame = CGRect(x: 40 + imageView.x + 5, y: 2, width: kScreenWidth - 200, height: 40) |
|
65 |
-// barView.addSubViews([imageView, label]) |
|
66 |
-// navigationItem.titleView = barView |
|
67 |
- } |
|
68 |
- |
|
69 |
- var dataSource: RxCollectionViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, PhotoItem>> { |
|
70 |
- return RxCollectionViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, PhotoItem>>(configureCell: { (dataSource, collectionView, indexPath, item) -> UICollectionViewCell in |
|
71 |
- let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell |
|
72 |
- cell.setInfo(item, source: .group) |
|
73 |
- return cell |
|
74 |
- }) |
|
75 |
- } |
|
76 |
- |
|
77 |
- func configurationRx() { |
|
78 |
- |
|
79 |
- collectionView.rx.setDelegate(self).disposed(by: disposeBag) |
|
80 |
- |
|
81 |
-// viewModel.isReload.subscribe(onNext: { |
|
82 |
-// [weak self] _ in |
|
83 |
-// guard let `self` = self else { return } |
|
84 |
-// self.collectionView.es.stopPullToRefresh() |
|
85 |
-// }).disposed(by: disposeBag) |
|
86 |
- |
|
87 |
- viewModel.groupPhotoContents |
|
88 |
- .bind(to: collectionView.rx.items(dataSource: dataSource)) |
|
89 |
- .disposed(by: disposeBag) |
|
90 |
- |
|
91 |
- collectionView.rx.modelSelected(PhotoItem.self) |
|
92 |
- .subscribe(onNext: { [unowned self] in self.viewModel.didSelect($0) }) |
|
93 |
- .disposed(by: disposeBag) |
|
94 |
- |
|
95 |
- collectionView.collectionViewLayout = WaterfallFlowLayout() |
|
96 |
- } |
|
97 |
- |
|
98 |
- func addReloadControl() { |
|
99 |
-// collectionView.es.addPullToRefresh { |
|
100 |
-// [unowned self] in |
|
101 |
-// self.viewModel.reload() |
|
102 |
-// } |
|
103 |
-// collectionView.es.startPullToRefresh() |
|
104 |
- } |
|
105 |
-} |
|
106 |
- |
|
107 |
-extension GroupPageController: UICollectionViewDelegateFlowLayout { |
|
108 |
- |
|
109 |
- func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { |
|
110 |
- return viewModel.layoutSizeForIndexPath(indexPath) |
|
111 |
- } |
|
112 |
-} |
|
113 |
- |
|
114 |
-// MARK: imagepicker delegate |
|
115 |
-extension GroupPageController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { |
|
116 |
- |
|
117 |
- @IBAction func takePhotoAction() { |
|
118 |
- let vc = UIImagePickerController() |
|
119 |
- #if (arch(i386) || arch(x86_64)) |
|
120 |
- vc.sourceType = .photoLibrary |
|
121 |
- #else |
|
122 |
- vc.sourceType = .camera |
|
123 |
- #endif |
|
124 |
- vc.delegate = self |
|
125 |
- present(vc, animated: true, completion: nil) |
|
126 |
- } |
|
127 |
- |
|
128 |
- func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { |
|
129 |
- dismiss(animated: true, completion: nil) |
|
130 |
- |
|
131 |
- guard let image = info[.originalImage] as? UIImage else { return } |
|
132 |
- |
|
133 |
- viewModel.submit(image: image) |
|
134 |
- } |
|
135 |
- |
|
136 |
- func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { |
|
137 |
- dismiss(animated: true, completion: nil) |
|
138 |
- } |
|
139 |
- |
|
140 |
-} |
@@ -21,7 +21,6 @@ final class HomeViewController: UIViewController { |
||
21 | 21 |
@IBOutlet weak var collectionView: UICollectionView! |
22 | 22 |
// MARK: data property |
23 | 23 |
fileprivate let disposeBag = DisposeBag() |
24 |
- fileprivate let refresher = PullToRefresh() |
|
25 | 24 |
|
26 | 25 |
internal var viewModel: HomeViewModel! |
27 | 26 |
internal var userInfoViewModel: UserInfoViewModel! |
@@ -158,80 +158,6 @@ |
||
158 | 158 |
</objects> |
159 | 159 |
<point key="canvasLocation" x="1705" y="-152"/> |
160 | 160 |
</scene> |
161 |
- <!--GroupPageController--> |
|
162 |
- <scene sceneID="ntn-JA-tbk"> |
|
163 |
- <objects> |
|
164 |
- <viewController storyboardIdentifier="GroupPageController" automaticallyAdjustsScrollViewInsets="NO" id="R29-hC-gNv" userLabel="GroupPageController" customClass="GroupPageController" customModule="PaiAi" sceneMemberID="viewController"> |
|
165 |
- <view key="view" contentMode="scaleToFill" id="ljL-8h-aZ0"> |
|
166 |
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> |
|
167 |
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
|
168 |
- <subviews> |
|
169 |
- <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="lAJ-ZU-GPi"> |
|
170 |
- <rect key="frame" x="6" y="25" width="363" height="642"/> |
|
171 |
- <color key="backgroundColor" red="0.8784313725490196" green="0.8784313725490196" blue="0.8784313725490196" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|
172 |
- <collectionViewLayout key="collectionViewLayout" id="D17-J3-rSa" customClass="WaterfallFlowLayout" customModule="Paiai_iOS" customModuleProvider="target"/> |
|
173 |
- <cells/> |
|
174 |
- <connections> |
|
175 |
- <outlet property="delegate" destination="R29-hC-gNv" id="XgJ-WA-ub2"/> |
|
176 |
- </connections> |
|
177 |
- </collectionView> |
|
178 |
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lOt-ls-oe7"> |
|
179 |
- <rect key="frame" x="199" y="493" width="168" height="168"/> |
|
180 |
- <state key="normal" image="BTN-拍照"/> |
|
181 |
- <state key="selected" image="BTN-拍照-press"/> |
|
182 |
- <connections> |
|
183 |
- <action selector="takePhotoAction" destination="R29-hC-gNv" eventType="touchUpInside" id="YIr-6E-LS2"/> |
|
184 |
- </connections> |
|
185 |
- </button> |
|
186 |
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6Ai-Cd-a0J"> |
|
187 |
- <rect key="frame" x="199" y="525" width="168" height="168"/> |
|
188 |
- <state key="normal" image="BTN-扫码"/> |
|
189 |
- <state key="selected" image="BTN-扫码-press"/> |
|
190 |
- </button> |
|
191 |
- <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="点我,拍摄照片" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zdv-Nb-P68"> |
|
192 |
- <rect key="frame" x="72.5" y="567" width="121.5" height="20.5"/> |
|
193 |
- <fontDescription key="fontDescription" type="system" pointSize="17"/> |
|
194 |
- <color key="textColor" red="0.1960784314" green="0.1960784314" blue="0.1960784314" alpha="1" colorSpace="calibratedRGB"/> |
|
195 |
- <nil key="highlightedColor"/> |
|
196 |
- </label> |
|
197 |
- <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="88M-NH-Qgh" customClass="FFProgress" customModule="Paiai_iOS" customModuleProvider="target"> |
|
198 |
- <rect key="frame" x="162.5" y="308.5" width="50" height="50"/> |
|
199 |
- <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/> |
|
200 |
- <constraints> |
|
201 |
- <constraint firstAttribute="height" constant="50" id="6A3-02-EsP"/> |
|
202 |
- <constraint firstAttribute="width" constant="50" id="g6l-6C-4jG"/> |
|
203 |
- </constraints> |
|
204 |
- </view> |
|
205 |
- </subviews> |
|
206 |
- <color key="backgroundColor" red="0.8784313725490196" green="0.8784313725490196" blue="0.8784313725490196" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|
207 |
- <constraints> |
|
208 |
- <constraint firstItem="efW-A4-fyT" firstAttribute="bottom" secondItem="lAJ-ZU-GPi" secondAttribute="bottom" id="23G-aq-F9a"/> |
|
209 |
- <constraint firstItem="efW-A4-fyT" firstAttribute="bottom" secondItem="lOt-ls-oe7" secondAttribute="bottom" constant="6" id="2ff-CO-xJk"/> |
|
210 |
- <constraint firstItem="lOt-ls-oe7" firstAttribute="leading" secondItem="zdv-Nb-P68" secondAttribute="trailing" constant="5" id="3cy-f1-xck"/> |
|
211 |
- <constraint firstItem="6Ai-Cd-a0J" firstAttribute="centerX" secondItem="lOt-ls-oe7" secondAttribute="centerX" id="9rZ-z1-OKI"/> |
|
212 |
- <constraint firstItem="lOt-ls-oe7" firstAttribute="top" secondItem="6Ai-Cd-a0J" secondAttribute="bottom" constant="-200" id="Chs-ne-dS2"/> |
|
213 |
- <constraint firstItem="88M-NH-Qgh" firstAttribute="centerX" secondItem="efW-A4-fyT" secondAttribute="centerX" id="IRY-CY-KnW"/> |
|
214 |
- <constraint firstItem="efW-A4-fyT" firstAttribute="trailing" secondItem="lOt-ls-oe7" secondAttribute="trailing" constant="8" id="IUI-dd-MNf"/> |
|
215 |
- <constraint firstItem="lAJ-ZU-GPi" firstAttribute="leading" secondItem="efW-A4-fyT" secondAttribute="leading" constant="6" id="TN2-dq-Bfm"/> |
|
216 |
- <constraint firstItem="zdv-Nb-P68" firstAttribute="centerY" secondItem="lOt-ls-oe7" secondAttribute="centerY" id="Tkh-kV-puR"/> |
|
217 |
- <constraint firstItem="efW-A4-fyT" firstAttribute="trailing" secondItem="lAJ-ZU-GPi" secondAttribute="trailing" constant="6" id="j5S-4o-gNP"/> |
|
218 |
- <constraint firstItem="88M-NH-Qgh" firstAttribute="centerY" secondItem="ljL-8h-aZ0" secondAttribute="centerY" id="qMc-hm-LSD"/> |
|
219 |
- <constraint firstItem="lAJ-ZU-GPi" firstAttribute="top" secondItem="efW-A4-fyT" secondAttribute="top" constant="5" id="tdF-Kt-yAO"/> |
|
220 |
- </constraints> |
|
221 |
- <viewLayoutGuide key="safeArea" id="efW-A4-fyT"/> |
|
222 |
- </view> |
|
223 |
- <navigationItem key="navigationItem" id="aeg-ac-MGk"/> |
|
224 |
- <connections> |
|
225 |
- <outlet property="collectionView" destination="lAJ-ZU-GPi" id="MGB-rX-4dB"/> |
|
226 |
- <outlet property="photographBtn" destination="lOt-ls-oe7" id="ynl-na-505"/> |
|
227 |
- <outlet property="photographLabel" destination="zdv-Nb-P68" id="NJO-Ae-y4X"/> |
|
228 |
- <outlet property="progressView" destination="88M-NH-Qgh" id="2bw-7m-FfB"/> |
|
229 |
- </connections> |
|
230 |
- </viewController> |
|
231 |
- <placeholder placeholderIdentifier="IBFirstResponder" id="Wws-ea-mVh" sceneMemberID="firstResponder"/> |
|
232 |
- </objects> |
|
233 |
- <point key="canvasLocation" x="700" y="57.121439280359823"/> |
|
234 |
- </scene> |
|
235 | 161 |
<!--CreateGroupViewController--> |
236 | 162 |
<scene sceneID="AAe-LB-J2k"> |
237 | 163 |
<objects> |
@@ -556,8 +482,6 @@ |
||
556 | 482 |
<resources> |
557 | 483 |
<image name="BTN-扫码" width="168" height="168"/> |
558 | 484 |
<image name="BTN-扫码-press" width="168" height="168"/> |
559 |
- <image name="BTN-拍照" width="168" height="168"/> |
|
560 |
- <image name="BTN-拍照-press" width="168" height="168"/> |
|
561 | 485 |
<image name="BTN-新增" width="168" height="168"/> |
562 | 486 |
<image name="BTN-新增-press" width="168" height="168"/> |
563 | 487 |
<image name="guide1" width="1462" height="2600"/> |
@@ -63,7 +63,7 @@ extension ScanQRViewController: QRCodeScanViewDelegate { |
||
63 | 63 |
|
64 | 64 |
// let request = GroupNetworkRequest(path: .joinTourGroup, parameter: params) |
65 | 65 |
// NetworkApi.share.post(request: request, handler: { (res) in |
66 |
-// let ctl = UIStoryboard.main.instantiateController(GroupPageController.self) |
|
66 |
+// let ctl = UIStoryboard.main.instantiateController(GroupViewController.self) |
|
67 | 67 |
// ctl.isCreate = true |
68 | 68 |
// ctl.isScan = true |
69 | 69 |
// ctl.groupModel = res[0] |
@@ -101,7 +101,7 @@ extension ScanQRViewController: QRCodeScanViewDelegate { |
||
101 | 101 |
|
102 | 102 |
// let request = GroupNetworkRequest(path: path, parameter: params) |
103 | 103 |
// NetworkApi.share.post(request: request, handler: { (res) in |
104 |
-// let ctl = UIStoryboard.main.instantiateController(GroupPageController.self) |
|
104 |
+// let ctl = UIStoryboard.main.instantiateController(GroupViewController.self) |
|
105 | 105 |
// ctl.isCreate = true |
106 | 106 |
// ctl.isScan = true |
107 | 107 |
// ctl.groupModel = res[0] |
@@ -11,10 +11,14 @@ import PaiaiDataKit |
||
11 | 11 |
|
12 | 12 |
class MessageCoordinator: Coordinator { |
13 | 13 |
let messageViewController: MessageViewController |
14 |
+ let navigationController: UINavigationController |
|
14 | 15 |
var shareUserInfoViewModel: UserInfoViewModel |
15 | 16 |
|
16 |
- init(_ messageVC: MessageViewController, userInfoViewModel: UserInfoViewModel) { |
|
17 |
+ init(_ messageVC: MessageViewController, |
|
18 |
+ navigationController: UINavigationController, |
|
19 |
+ userInfoViewModel: UserInfoViewModel) { |
|
17 | 20 |
messageViewController = messageVC |
21 |
+ self.navigationController = navigationController |
|
18 | 22 |
shareUserInfoViewModel = userInfoViewModel |
19 | 23 |
messageViewController.viewModel.delegate = self |
20 | 24 |
} |
@@ -33,7 +37,7 @@ extension MessageCoordinator { |
||
33 | 37 |
extension MessageCoordinator: MessageViewModelDelegate { |
34 | 38 |
func didSelect(type: MessageType) { |
35 | 39 |
let messageListVC = makeMessageListViewContorller(type: type) |
36 |
- messageViewController.pushViewController(messageListVC) |
|
40 |
+ navigationController.pushViewController(messageListVC) |
|
37 | 41 |
} |
38 | 42 |
} |
39 | 43 |
|
@@ -46,7 +46,7 @@ fileprivate extension MineAboutViewController { |
||
46 | 46 |
.subscribe { (_) in |
47 | 47 |
let webVC = WebViewController(title: "联系我们", |
48 | 48 |
path: "https://pai.ai/page/contact_us") |
49 |
- self.pushViewController(webVC) |
|
49 |
+ self.navigationController?.pushViewController(webVC) |
|
50 | 50 |
}.disposed(by: disposeBag) |
51 | 51 |
} |
52 | 52 |
|
@@ -67,7 +67,7 @@ fileprivate extension MineAboutViewController { |
||
67 | 67 |
.subscribe { (_) in |
68 | 68 |
let webVC = WebViewController(title: "用户协议", |
69 | 69 |
path: "https://pai.ai/page/user_agreement") |
70 |
- self.pushViewController(webVC) |
|
70 |
+ self.navigationController?.pushViewController(webVC) |
|
71 | 71 |
}.disposed(by: disposeBag) |
72 | 72 |
} |
73 | 73 |
} |
@@ -14,9 +14,10 @@ class MineCoordinator: Coordinator { |
||
14 | 14 |
|
15 | 15 |
let mineViewController: MineViewController |
16 | 16 |
let navigationController: UINavigationController |
17 |
+ var childCoordinator = [String: Coordinator]() |
|
17 | 18 |
// let shareUserInfoViewModel |
18 | 19 |
|
19 |
- init(_ mineViewController: MineViewController, containerViewController: UINavigationController) { |
|
20 |
+ init(_ mineViewController: MineViewController, navigationController: UINavigationController) { |
|
20 | 21 |
self.mineViewController = mineViewController |
21 | 22 |
self.navigationController = navigationController |
22 | 23 |
self.mineViewController.delegate = self |
@@ -30,7 +31,7 @@ class MineCoordinator: Coordinator { |
||
30 | 31 |
extension MineCoordinator: MineViewControllerDelegate { |
31 | 32 |
func logout() { |
32 | 33 |
let vc = makeLoginViewController() |
33 |
- containerViewController.presentController(vc) |
|
34 |
+ navigationController.presentController(vc) |
|
34 | 35 |
} |
35 | 36 |
|
36 | 37 |
func didSelect(_ item: MineItem) { |
@@ -39,17 +40,17 @@ extension MineCoordinator: MineViewControllerDelegate { |
||
39 | 40 |
switch item { |
40 | 41 |
case .group: |
41 | 42 |
let vc = makeMineGroupViewController() |
42 |
- navigationController |
|
43 |
- containerViewController.pushViewController(vc) |
|
43 |
+ vc.viewModel.delegate = self |
|
44 |
+ navigationController.pushViewController(vc) |
|
44 | 45 |
case .order: |
45 | 46 |
let vc = makeMineOrderViewController() |
46 |
- containerViewController.pushViewController(vc) |
|
47 |
+ navigationController.pushViewController(vc) |
|
47 | 48 |
case .feedback: |
48 | 49 |
let vc = makeMineFeedbackViewController() |
49 |
- containerViewController.pushViewController(vc) |
|
50 |
+ navigationController.pushViewController(vc) |
|
50 | 51 |
case .about: |
51 | 52 |
let vc = makeMineAboutViewController() |
52 |
- containerViewController.pushViewController(vc) |
|
53 |
+ navigationController.pushViewController(vc) |
|
53 | 54 |
} |
54 | 55 |
} |
55 | 56 |
|
@@ -57,6 +58,16 @@ extension MineCoordinator: MineViewControllerDelegate { |
||
57 | 58 |
} |
58 | 59 |
} |
59 | 60 |
|
61 |
+extension MineCoordinator: MineGroupViewModelDelegate { |
|
62 |
+ func didSelect(_ item: GroupItem) { |
|
63 |
+ let vc = makeGroupViewController(item: item) |
|
64 |
+ let coordinator = GroupCoordinator(navigationController: navigationController) |
|
65 |
+ childCoordinator["group"] = coordinator |
|
66 |
+ |
|
67 |
+ navigationController.pushViewController(vc) |
|
68 |
+ } |
|
69 |
+} |
|
70 |
+ |
|
60 | 71 |
fileprivate extension MineCoordinator { |
61 | 72 |
func makeLoginViewController() -> LoginViewController { |
62 | 73 |
let vc = UIStoryboard.main.instantiateController(LoginViewController.self) |
@@ -86,6 +97,13 @@ fileprivate extension MineCoordinator { |
||
86 | 97 |
let vc = UIStoryboard.mine.instantiateController(MineAboutViewController.self) |
87 | 98 |
return vc |
88 | 99 |
} |
100 |
+ |
|
101 |
+ func makeGroupViewController(item: GroupItem) -> GroupViewController { |
|
102 |
+ let vc = GroupViewController.instantiate() |
|
103 |
+ vc.viewModel = GroupViewModel(groupItem: item) |
|
104 |
+ vc.groupItem = item |
|
105 |
+ return vc |
|
106 |
+ } |
|
89 | 107 |
} |
90 | 108 |
|
91 | 109 |
extension UIStoryboard { |
@@ -32,7 +32,7 @@ final class MineFeedbackViewController: UIViewController { |
||
32 | 32 |
@IBAction func sendFeedBack() { |
33 | 33 |
feedbackAPI.submit(text: textView.text).subscribe(onCompleted: {[weak self] in |
34 | 34 |
guard let `self` = self else { return } |
35 |
- self.popController() |
|
35 |
+ self.navigationController?.popViewController(animated: true) |
|
36 | 36 |
Toast.show(message: "感谢您的建议") |
37 | 37 |
}) { (error) in |
38 | 38 |
|
@@ -65,7 +65,7 @@ final class DetailPageController: UIViewController { |
||
65 | 65 |
//// last.mainViewModel.models.value = datas |
66 | 66 |
// } |
67 | 67 |
// |
68 |
-// if let last = navigationController?.viewControllers[(navigationController?.viewControllers.count)! - 1] as? GroupPageController { |
|
68 |
+// if let last = navigationController?.viewControllers[(navigationController?.viewControllers.count)! - 1] as? GroupViewController { |
|
69 | 69 |
//// last.MineGroupViewModel.models.value = datas |
70 | 70 |
// } |
71 | 71 |
// } |
@@ -287,7 +287,7 @@ extension DetailPageController: CellDelegate { |
||
287 | 287 |
} |
288 | 288 |
|
289 | 289 |
func pushNext() { |
290 |
- let ctl = UIStoryboard.main.instantiateController(GroupPageController.self) |
|
290 |
+ let ctl = UIStoryboard.main.instantiateController(GroupViewController.self) |
|
291 | 291 |
|
292 | 292 |
// ctl.groupModel = GroupModel(map: Map(mappingType: .fromJSON, JSON: datas[currentPhotoIndex].toJSON())) |
293 | 293 |
show(ctl, sender: nil) |