dfb837d7f842L761">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)
|