diff --git a/Podfile b/Podfile index 6071ae5d..d0ef74be 100644 --- a/Podfile +++ b/Podfile @@ -20,6 +20,8 @@ target 'xplan-ios' do pod 'SDWebImage' #输入 pod 'SZTextView' + #轮播图 + pod 'SDCycleScrollView' #登录的 pod 'mob_sharesdk' pod 'mob_sharesdk/ShareSDKPlatforms/QQ' diff --git a/Podfile.lock b/Podfile.lock index 0d8dd91d..080121d6 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -35,6 +35,8 @@ PODS: - MOBFoundation (3.2.27) - NTESQuickPass (2.1.9) - ReactiveObjC (3.1.1) + - SDCycleScrollView (1.82): + - SDWebImage (>= 5.0.0) - SDWebImage (5.11.1): - SDWebImage/Core (= 5.11.1) - SDWebImage/Core (5.11.1) @@ -53,6 +55,7 @@ DEPENDENCIES: - mob_sharesdk/ShareSDKPlatforms/WeChat - NTESQuickPass (~> 2.1.6) - ReactiveObjC + - SDCycleScrollView - SDWebImage - SZTextView - YYText @@ -68,6 +71,7 @@ SPEC REPOS: - MOBFoundation - NTESQuickPass - ReactiveObjC + - SDCycleScrollView - SDWebImage - SZTextView - YYText @@ -82,10 +86,11 @@ SPEC CHECKSUMS: MOBFoundation: efdc3ce6b843fbc10ae8c1c6122a02b0d845b39b NTESQuickPass: 8431dc52737c95883cd382c2ee75664d58f39377 ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040 + SDCycleScrollView: a0d74c3384caa72bdfc81470bdbc8c14b3e1fbcf SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SZTextView: 094dc6acc9beec537685c545d6e3e0d4975174e1 YYText: 5c461d709e24d55a182d1441c41dc639a18a4849 -PODFILE CHECKSUM: d5910ffe3f02430dd36728a17554f28258564c74 +PODFILE CHECKSUM: a4cc983fad6d0cd9a7283a7dc7e989a39c24fc18 COCOAPODS: 1.10.1 diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index bd4fb5eb..f4fb170e 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -133,6 +133,8 @@ E88B5CB826FB325200DA9178 /* XPMineTeenagerPwdPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CB726FB325200DA9178 /* XPMineTeenagerPwdPresenter.m */; }; E88B5CBA26FB329C00DA9178 /* XPMineTeenagerPwdProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CB926FB327500DA9178 /* XPMineTeenagerPwdProtocol.h */; }; E88B5CBD26FB3BDF00DA9178 /* XPTeenagerAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CBC26FB3BDF00DA9178 /* XPTeenagerAlertView.m */; }; + E88B5CC126FB407B00DA9178 /* XPMineUserInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CC026FB407B00DA9178 /* XPMineUserInfoViewController.m */; }; + E88B5CC526FB42B000DA9178 /* XPMineUserInfoHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = E88B5CC426FB42B000DA9178 /* XPMineUserInfoHeaderView.m */; }; E8AC720D26F435F5007D6E91 /* UIImageView+LoadImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC720C26F435F5007D6E91 /* UIImageView+LoadImage.m */; }; E8AC721026F43955007D6E91 /* UIImageConstant.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC720F26F43955007D6E91 /* UIImageConstant.m */; }; E8AC721326F46ADD007D6E91 /* XPMineSettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8AC721226F46ADD007D6E91 /* XPMineSettingViewController.m */; }; @@ -168,6 +170,21 @@ E8E70D8C26F2F5A500F03460 /* XPMineMatchCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E70D8B26F2F5A500F03460 /* XPMineMatchCollectionViewCell.m */; }; E8E70D8F26F2F5DB00F03460 /* XPMineMenuTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E70D8E26F2F5DB00F03460 /* XPMineMenuTableViewCell.m */; }; E8E70D9226F2F60C00F03460 /* XPMineItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E8E70D9126F2F60C00F03460 /* XPMineItemModel.m */; }; + E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */; }; + E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */; }; + E8EEB8F426FC2050007C6EBA /* SDBrowserImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8EE26FC2050007C6EBA /* SDBrowserImageView.m */; }; + E8EEB8F726FC2673007C6EBA /* UserPhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8F626FC2673007C6EBA /* UserPhoto.m */; }; + E8EEB8FB26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8FA26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m */; }; + E8EEB8FE26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB8FD26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m */; }; + E8EEB90126FC31B6007C6EBA /* XPMineUserInfoPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90026FC31B6007C6EBA /* XPMineUserInfoPresenter.m */; }; + E8EEB90326FC31DC007C6EBA /* XPMineUserInfoProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90226FC31CE007C6EBA /* XPMineUserInfoProtocol.h */; }; + E8EEB90626FC5772007C6EBA /* XPMineUserInfoEditViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90526FC5772007C6EBA /* XPMineUserInfoEditViewController.m */; }; + E8EEB90926FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90826FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m */; }; + E8EEB90C26FC5EBC007C6EBA /* XPMineUserInfoEditModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90B26FC5EBC007C6EBA /* XPMineUserInfoEditModel.m */; }; + E8EEB90F26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB90E26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.m */; }; + E8EEB91126FC6AE2007C6EBA /* XPMineUserInfoEditProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB91026FC6AD3007C6EBA /* XPMineUserInfoEditProtocol.h */; }; + E8EEB91426FC7786007C6EBA /* XPMineUserInfoNickViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB91326FC7786007C6EBA /* XPMineUserInfoNickViewController.m */; }; + E8EEB91726FC7B35007C6EBA /* XPMineUserInfoDesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E8EEB91626FC7B35007C6EBA /* XPMineUserInfoDesViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -409,6 +426,10 @@ E88B5CB926FB327500DA9178 /* XPMineTeenagerPwdProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineTeenagerPwdProtocol.h; sourceTree = ""; }; E88B5CBB26FB3BDF00DA9178 /* XPTeenagerAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPTeenagerAlertView.h; sourceTree = ""; }; E88B5CBC26FB3BDF00DA9178 /* XPTeenagerAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPTeenagerAlertView.m; sourceTree = ""; }; + E88B5CBF26FB407B00DA9178 /* XPMineUserInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoViewController.h; sourceTree = ""; }; + E88B5CC026FB407B00DA9178 /* XPMineUserInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoViewController.m; sourceTree = ""; }; + E88B5CC326FB42B000DA9178 /* XPMineUserInfoHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoHeaderView.h; sourceTree = ""; }; + E88B5CC426FB42B000DA9178 /* XPMineUserInfoHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoHeaderView.m; sourceTree = ""; }; E8AC720B26F435F5007D6E91 /* UIImageView+LoadImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIImageView+LoadImage.h"; sourceTree = ""; }; E8AC720C26F435F5007D6E91 /* UIImageView+LoadImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+LoadImage.m"; sourceTree = ""; }; E8AC720E26F43955007D6E91 /* UIImageConstant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIImageConstant.h; sourceTree = ""; }; @@ -477,6 +498,35 @@ E8E70D8E26F2F5DB00F03460 /* XPMineMenuTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineMenuTableViewCell.m; sourceTree = ""; }; E8E70D9026F2F60C00F03460 /* XPMineItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineItemModel.h; sourceTree = ""; }; E8E70D9126F2F60C00F03460 /* XPMineItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineItemModel.m; sourceTree = ""; }; + E8EEB8EB26FC2050007C6EBA /* SDPhotoBrowserConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDPhotoBrowserConfig.h; sourceTree = ""; }; + E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDPhotoBrowser.m; sourceTree = ""; }; + E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWaitingView.m; sourceTree = ""; }; + E8EEB8EE26FC2050007C6EBA /* SDBrowserImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDBrowserImageView.m; sourceTree = ""; }; + E8EEB8EF26FC2050007C6EBA /* SDWaitingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWaitingView.h; sourceTree = ""; }; + E8EEB8F026FC2050007C6EBA /* SDPhotoBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDPhotoBrowser.h; sourceTree = ""; }; + E8EEB8F126FC2050007C6EBA /* SDBrowserImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDBrowserImageView.h; sourceTree = ""; }; + E8EEB8F526FC2673007C6EBA /* UserPhoto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserPhoto.h; sourceTree = ""; }; + E8EEB8F626FC2673007C6EBA /* UserPhoto.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserPhoto.m; sourceTree = ""; }; + E8EEB8F926FC2874007C6EBA /* XPMineUserInfoTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoTableViewCell.h; sourceTree = ""; }; + E8EEB8FA26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoTableViewCell.m; sourceTree = ""; }; + E8EEB8FC26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoCustomNavView.h; sourceTree = ""; }; + E8EEB8FD26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoCustomNavView.m; sourceTree = ""; }; + E8EEB8FF26FC31B6007C6EBA /* XPMineUserInfoPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoPresenter.h; sourceTree = ""; }; + E8EEB90026FC31B6007C6EBA /* XPMineUserInfoPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoPresenter.m; sourceTree = ""; }; + E8EEB90226FC31CE007C6EBA /* XPMineUserInfoProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoProtocol.h; sourceTree = ""; }; + E8EEB90426FC5772007C6EBA /* XPMineUserInfoEditViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditViewController.h; sourceTree = ""; }; + E8EEB90526FC5772007C6EBA /* XPMineUserInfoEditViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditViewController.m; sourceTree = ""; }; + E8EEB90726FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditTableViewCell.h; sourceTree = ""; }; + E8EEB90826FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditTableViewCell.m; sourceTree = ""; }; + E8EEB90A26FC5EBC007C6EBA /* XPMineUserInfoEditModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditModel.h; sourceTree = ""; }; + E8EEB90B26FC5EBC007C6EBA /* XPMineUserInfoEditModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditModel.m; sourceTree = ""; }; + E8EEB90D26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditPresenter.h; sourceTree = ""; }; + E8EEB90E26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoEditPresenter.m; sourceTree = ""; }; + E8EEB91026FC6AD3007C6EBA /* XPMineUserInfoEditProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoEditProtocol.h; sourceTree = ""; }; + E8EEB91226FC7786007C6EBA /* XPMineUserInfoNickViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoNickViewController.h; sourceTree = ""; }; + E8EEB91326FC7786007C6EBA /* XPMineUserInfoNickViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoNickViewController.m; sourceTree = ""; }; + E8EEB91526FC7B35007C6EBA /* XPMineUserInfoDesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineUserInfoDesViewController.h; sourceTree = ""; }; + E8EEB91626FC7B35007C6EBA /* XPMineUserInfoDesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMineUserInfoDesViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -729,6 +779,8 @@ 18E7B31D26F0984C0064BC9B /* UserLevelVo.m */, 18E7B31F26F098650064BC9B /* UserInfoSkillVo.h */, 18E7B32026F098650064BC9B /* UserInfoSkillVo.m */, + E8EEB8F526FC2673007C6EBA /* UserPhoto.h */, + E8EEB8F626FC2673007C6EBA /* UserPhoto.m */, ); path = Model; sourceTree = ""; @@ -855,6 +907,7 @@ 189DD5A726DFA09700AB55B1 /* Tool */ = { isa = PBXGroup; children = ( + E8EEB8EA26FC2050007C6EBA /* SDPhotoBrowser */, E81366E426F0A4820076364C /* NSString */, E82109AA26F1C86E00FC3319 /* CountDown */, E81C278726EAFABF0031E639 /* Security */, @@ -1098,6 +1151,30 @@ path = Teenager; sourceTree = ""; }; + E88B5CBE26FB404800DA9178 /* MineInfo */ = { + isa = PBXGroup; + children = ( + E88B5CBF26FB407B00DA9178 /* XPMineUserInfoViewController.h */, + E88B5CC026FB407B00DA9178 /* XPMineUserInfoViewController.m */, + E8EEB90426FC5772007C6EBA /* XPMineUserInfoEditViewController.h */, + E8EEB90526FC5772007C6EBA /* XPMineUserInfoEditViewController.m */, + E8EEB91226FC7786007C6EBA /* XPMineUserInfoNickViewController.h */, + E8EEB91326FC7786007C6EBA /* XPMineUserInfoNickViewController.m */, + E8EEB91526FC7B35007C6EBA /* XPMineUserInfoDesViewController.h */, + E8EEB91626FC7B35007C6EBA /* XPMineUserInfoDesViewController.m */, + ); + path = MineInfo; + sourceTree = ""; + }; + E88B5CC226FB429C00DA9178 /* MineInfo */ = { + isa = PBXGroup; + children = ( + E88B5CC326FB42B000DA9178 /* XPMineUserInfoHeaderView.h */, + E88B5CC426FB42B000DA9178 /* XPMineUserInfoHeaderView.m */, + ); + path = MineInfo; + sourceTree = ""; + }; E8AC720A26F435AF007D6E91 /* UIImageView */ = { isa = PBXGroup; children = ( @@ -1150,6 +1227,8 @@ E8AC722E26F49610007D6E91 /* XPMineNotificationItemModel.m */, E8AC723826F49AAE007D6E91 /* XPMineNotifyStatus.h */, E8AC723926F49AAE007D6E91 /* XPMineNotifyStatus.m */, + E8EEB90A26FC5EBC007C6EBA /* XPMineUserInfoEditModel.h */, + E8EEB90B26FC5EBC007C6EBA /* XPMineUserInfoEditModel.m */, ); path = Model; sourceTree = ""; @@ -1177,6 +1256,7 @@ E824545526F5E51900BE8163 /* XPMineVerifIdentityViewController.m */, E824545F26F5F4E400BE8163 /* XPMineResetPayPwdViewController.h */, E824546026F5F4E400BE8163 /* XPMineResetPayPwdViewController.m */, + E88B5CBE26FB404800DA9178 /* MineInfo */, E88B5CA926FB15B900DA9178 /* Teenager */, ); path = View; @@ -1205,6 +1285,10 @@ E88B5CAF26FB1C6500DA9178 /* XPMineTeenagerPresenter.m */, E88B5CB626FB325200DA9178 /* XPMineTeenagerPwdPresenter.h */, E88B5CB726FB325200DA9178 /* XPMineTeenagerPwdPresenter.m */, + E8EEB8FF26FC31B6007C6EBA /* XPMineUserInfoPresenter.h */, + E8EEB90026FC31B6007C6EBA /* XPMineUserInfoPresenter.m */, + E8EEB90D26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.h */, + E8EEB90E26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.m */, ); path = Presenter; sourceTree = ""; @@ -1222,6 +1306,8 @@ E824546526F5FF5100BE8163 /* XPMineResetPayPasswordProtocol.h */, E88B5CB126FB1CC100DA9178 /* XPMineTeenagerProtocol.h */, E88B5CB926FB327500DA9178 /* XPMineTeenagerPwdProtocol.h */, + E8EEB90226FC31CE007C6EBA /* XPMineUserInfoProtocol.h */, + E8EEB91026FC6AD3007C6EBA /* XPMineUserInfoEditProtocol.h */, ); path = Protocol; sourceTree = ""; @@ -1229,6 +1315,7 @@ E8E70D7F26F2F39000F03460 /* SubViews */ = { isa = PBXGroup; children = ( + E88B5CC226FB429C00DA9178 /* MineInfo */, E88B5CAA26FB168200DA9178 /* Teenager */, E8E70D8126F2F51A00F03460 /* XPMineHeadView.h */, E8E70D8226F2F51A00F03460 /* XPMineHeadView.m */, @@ -1247,6 +1334,7 @@ E8E70D8026F2F3C500F03460 /* Cell */ = { isa = PBXGroup; children = ( + E8EEB8F826FC285B007C6EBA /* MineInfo */, E8E70D8726F2F58F00F03460 /* XPMineMatchTableViewCell.h */, E8E70D8826F2F58F00F03460 /* XPMineMatchTableViewCell.m */, E8E70D8A26F2F5A500F03460 /* XPMineMatchCollectionViewCell.h */, @@ -1261,6 +1349,33 @@ path = Cell; sourceTree = ""; }; + E8EEB8EA26FC2050007C6EBA /* SDPhotoBrowser */ = { + isa = PBXGroup; + children = ( + E8EEB8EB26FC2050007C6EBA /* SDPhotoBrowserConfig.h */, + E8EEB8EC26FC2050007C6EBA /* SDPhotoBrowser.m */, + E8EEB8ED26FC2050007C6EBA /* SDWaitingView.m */, + E8EEB8EE26FC2050007C6EBA /* SDBrowserImageView.m */, + E8EEB8EF26FC2050007C6EBA /* SDWaitingView.h */, + E8EEB8F026FC2050007C6EBA /* SDPhotoBrowser.h */, + E8EEB8F126FC2050007C6EBA /* SDBrowserImageView.h */, + ); + path = SDPhotoBrowser; + sourceTree = ""; + }; + E8EEB8F826FC285B007C6EBA /* MineInfo */ = { + isa = PBXGroup; + children = ( + E8EEB8F926FC2874007C6EBA /* XPMineUserInfoTableViewCell.h */, + E8EEB8FA26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m */, + E8EEB8FC26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.h */, + E8EEB8FD26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m */, + E8EEB90726FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.h */, + E8EEB90826FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m */, + ); + path = MineInfo; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1394,6 +1509,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E8EEB91126FC6AE2007C6EBA /* XPMineUserInfoEditProtocol.h in Sources */, + E8EEB90326FC31DC007C6EBA /* XPMineUserInfoProtocol.h in Sources */, E88B5CBA26FB329C00DA9178 /* XPMineTeenagerPwdProtocol.h in Sources */, E88B5CB226FB1CFF00DA9178 /* XPMineTeenagerProtocol.h in Sources */, E824546626F5FF6000BE8163 /* XPMineResetPayPasswordProtocol.h in Sources */, @@ -1410,6 +1527,7 @@ E81366F826F0C12A0076364C /* LoginFullInfoProtocol.h in Sources */, E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */, E824543D26F58C3A00BE8163 /* XPLoginBindSuccessView.m in Sources */, + E8EEB8F726FC2673007C6EBA /* UserPhoto.m in Sources */, E81C27A226EF23490031E639 /* XPEnum.h in Sources */, E88B5CB526FB20B800DA9178 /* XPMineTeenagerPwdView.m in Sources */, E81C279826EB3AC40031E639 /* LoginForgetPasswordProtocol.h in Sources */, @@ -1419,6 +1537,7 @@ E8B825CA26EA1231009E8E9F /* LoginVerifCodeViewController.m in Sources */, 189DD76226E60DDC00AB55B1 /* Api+Login.m in Sources */, 18E7B22626E8CDCF0064BC9B /* XplanFlutterBoostDelegate.m in Sources */, + E8EEB8F326FC2050007C6EBA /* SDWaitingView.m in Sources */, E824544026F58F9400BE8163 /* XPMinePayPwdViewController.m in Sources */, E8AC723D26F4B6AA007D6E91 /* XPLoginBindPhoneResultViewController.m in Sources */, 189DD73E26E21C3F00AB55B1 /* YYUtility.m in Sources */, @@ -1430,6 +1549,7 @@ 189DD53426DE255300AB55B1 /* TabbarViewController.m in Sources */, E8AC722F26F49610007D6E91 /* XPMineNotificationItemModel.m in Sources */, E8E70D7A26F2F16600F03460 /* XPMinePresent.m in Sources */, + E8EEB8F226FC2050007C6EBA /* SDPhotoBrowser.m in Sources */, E81C27AB26EF2D920031E639 /* ThirdUserInfo.m in Sources */, E81C279D26EEEC620031E639 /* XPConstant.m in Sources */, 187EEEFE26E8A82C002833B2 /* NSObject+AutoCoding.m in Sources */, @@ -1442,6 +1562,7 @@ E81C27AE26EF39AB0031E639 /* AppDelegate+ThirdConfig.m in Sources */, E8E70D8326F2F51A00F03460 /* XPMineHeadView.m in Sources */, E8B825D026EA3825009E8E9F /* LoginPasswordViewController.m in Sources */, + E8EEB90C26FC5EBC007C6EBA /* XPMineUserInfoEditModel.m in Sources */, 18E7B31826F097E00064BC9B /* UserInfoModel.m in Sources */, E8AC721326F46ADD007D6E91 /* XPMineSettingViewController.m in Sources */, 18E7B32126F098650064BC9B /* UserInfoSkillVo.m in Sources */, @@ -1454,9 +1575,11 @@ 18E7B26926E8D5D60064BC9B /* XCCurrentVCStackManager.m in Sources */, E824544326F58FCE00BE8163 /* XPMinePayPwdInputView.m in Sources */, 9B0E1C5926E77022005D4442 /* BaseNavigationController.m in Sources */, + E8EEB8F426FC2050007C6EBA /* SDBrowserImageView.m in Sources */, E824544626F5934700BE8163 /* XPMinePayPwdPresenter.m in Sources */, 186A536A26FC6F2E00D67B2C /* XCShareItem.m in Sources */, 189DD54B26DE338800AB55B1 /* BaseViewController.m in Sources */, + E8EEB91726FC7B35007C6EBA /* XPMineUserInfoDesViewController.m in Sources */, E8E70D8626F2F55C00F03460 /* XPMineAccountView.m in Sources */, E81C279026EB314D0031E639 /* LoginForgetEditView.m in Sources */, E8AC721026F43955007D6E91 /* UIImageConstant.m in Sources */, @@ -1472,6 +1595,8 @@ E824545626F5E51900BE8163 /* XPMineVerifIdentityViewController.m in Sources */, 186A534726FC6ED900D67B2C /* TTAlertConfig.m in Sources */, 18E7B31E26F0984C0064BC9B /* UserLevelVo.m in Sources */, + E8EEB90626FC5772007C6EBA /* XPMineUserInfoEditViewController.m in Sources */, + E8EEB91426FC7786007C6EBA /* XPMineUserInfoNickViewController.m in Sources */, 18E7B31B26F0982E0064BC9B /* UserExpand.m in Sources */, E824543526F57D6E00BE8163 /* XPLoginVerifBindPhoneViewController.m in Sources */, E8B825CD26EA18C8009E8E9F /* ThemeColor.m in Sources */, @@ -1486,14 +1611,18 @@ E81C279326EB394D0031E639 /* LoginForgetPasswordViewController.m in Sources */, E81C278D26EAFAF60031E639 /* DESEncrypt.m in Sources */, E81366E726F0A49E0076364C /* NSString+Regex.m in Sources */, + E8EEB90126FC31B6007C6EBA /* XPMineUserInfoPresenter.m in Sources */, 189DD56526DE465A00AB55B1 /* LoginViewController.m in Sources */, E824544B26F5BBB800BE8163 /* XPMineModifPayPwdViewController.m in Sources */, + E8EEB8FE26FC2DF8007C6EBA /* XPMineUserInfoCustomNavView.m in Sources */, E88B5CAD26FB16A800DA9178 /* XPMineTeenagerDesView.m in Sources */, E824545126F5CE6E00BE8163 /* XPMineModifPayPwdPresenter.m in Sources */, + E8EEB90F26FC6AB8007C6EBA /* XPMineUserInfoEditPresenter.m in Sources */, E8AC723A26F49AAE007D6E91 /* XPMineNotifyStatus.m in Sources */, 18E7B33226F317A20064BC9B /* XPWebViewController.m in Sources */, E8AC721C26F4720B007D6E91 /* XPMineSettingPresent.m in Sources */, E88B5CA526FB088600DA9178 /* XPMineTeenagerViewController.m in Sources */, + E8EEB90926FC579A007C6EBA /* XPMineUserInfoEditTableViewCell.m in Sources */, 18C17A5D26F338F300C48E11 /* XplanFBFlutterViewContainer.m in Sources */, 186A536926FC6F2E00D67B2C /* XCShareView.m in Sources */, 186A534C26FC6ED900D67B2C /* TTAlertView.m in Sources */, @@ -1508,6 +1637,7 @@ E81366FC26F0D2980076364C /* UIButton+EnlargeTouchArea.m in Sources */, E824546426F5FF1C00BE8163 /* XPMineResetPayPasswordPresenter.m in Sources */, 186A534D26FC6ED900D67B2C /* TTActionSheetView.m in Sources */, + E88B5CC126FB407B00DA9178 /* XPMineUserInfoViewController.m in Sources */, E824545926F5E65900BE8163 /* XPMineVerifIdentityView.m in Sources */, 189DD74026E21C3F00AB55B1 /* YYUtility+App.m in Sources */, 189DD74526E21CCC00AB55B1 /* YYReachability.m in Sources */, @@ -1515,6 +1645,8 @@ E8E70D8F26F2F5DB00F03460 /* XPMineMenuTableViewCell.m in Sources */, 187EEEE126E89BFB002833B2 /* AccountModel.m in Sources */, E8AC722126F47E23007D6E91 /* XPMineAboutUsViewController.m in Sources */, + E88B5CC526FB42B000DA9178 /* XPMineUserInfoHeaderView.m in Sources */, + E8EEB8FB26FC2874007C6EBA /* XPMineUserInfoTableViewCell.m in Sources */, E8AC721626F46B06007D6E91 /* XPMineSettingTableViewCell.m in Sources */, 189DD75026E21D9000AB55B1 /* GCDHelper.m in Sources */, 186A534826FC6ED900D67B2C /* TTAlertButtonConfig.m in Sources */, diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/Contents.json b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/Contents.json new file mode 100644 index 00000000..2f7932f3 --- /dev/null +++ b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_user_info_edit@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_user_info_edit@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@2x.png b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@2x.png new file mode 100644 index 00000000..b1db8e55 Binary files /dev/null and b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@2x.png differ diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@3x.png b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@3x.png new file mode 100644 index 00000000..f18f5c52 Binary files /dev/null and b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit.imageset/mine_user_info_edit@3x.png differ diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/Contents.json b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/Contents.json new file mode 100644 index 00000000..0f9f58ac --- /dev/null +++ b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "mine_user_info_edit_clear@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "mine_user_info_edit_clear@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@2x.png b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@2x.png new file mode 100644 index 00000000..365a329c Binary files /dev/null and b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@2x.png differ diff --git a/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@3x.png b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@3x.png new file mode 100644 index 00000000..c3f13c8a Binary files /dev/null and b/xplan-ios/Assets.xcassets/Mine/mine_user_info_edit_clear.imageset/mine_user_info_edit_clear@3x.png differ diff --git a/xplan-ios/Base/MVP/Model/UserInfoModel.h b/xplan-ios/Base/MVP/Model/UserInfoModel.h index bd1d4915..3350daf3 100644 --- a/xplan-ios/Base/MVP/Model/UserInfoModel.h +++ b/xplan-ios/Base/MVP/Model/UserInfoModel.h @@ -9,6 +9,7 @@ #import "UserExpand.h" #import "UserLevelVo.h" #import "UserInfoSkillVo.h" +#import "UserPhoto.h" NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, GenderType) { @@ -47,6 +48,12 @@ typedef NS_ENUM(NSInteger, GenderType) { @property (nonatomic , assign) BOOL isBindPaymentPwd; @property (nonatomic , assign) BOOL isBindXCZAccount; @property (nonatomic , assign) BOOL isBindAlipay; +///相册 +@property (nonatomic, strong) NSArray *privatePhoto;//相册 +///签名 +@property (nonatomic,copy) NSString *userDesc; +///出生日期 +@property (nonatomic,assign) long birth; @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Base/MVP/Model/UserInfoModel.m b/xplan-ios/Base/MVP/Model/UserInfoModel.m index 1efc252e..e434c2cc 100644 --- a/xplan-ios/Base/MVP/Model/UserInfoModel.m +++ b/xplan-ios/Base/MVP/Model/UserInfoModel.m @@ -9,4 +9,10 @@ @implementation UserInfoModel ++ (NSDictionary *)objectClassInArray { + return @{ + @"privatePhoto":UserPhoto.class + }; +} + @end diff --git a/xplan-ios/Base/MVP/Model/UserPhoto.h b/xplan-ios/Base/MVP/Model/UserPhoto.h new file mode 100644 index 00000000..840d5483 --- /dev/null +++ b/xplan-ios/Base/MVP/Model/UserPhoto.h @@ -0,0 +1,17 @@ +// +// UserPhoto.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "BaseObject.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface UserPhoto : BaseObject +@property (copy, nonatomic) NSString *photoUrl; +@property (copy, nonatomic) NSString *pid; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Base/MVP/Model/UserPhoto.m b/xplan-ios/Base/MVP/Model/UserPhoto.m new file mode 100644 index 00000000..59326f48 --- /dev/null +++ b/xplan-ios/Base/MVP/Model/UserPhoto.m @@ -0,0 +1,13 @@ +// +// UserPhoto.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "UserPhoto.h" + +@implementation UserPhoto + + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.h b/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.h new file mode 100755 index 00000000..ec33ceca --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.h @@ -0,0 +1,27 @@ +// +// SDBrowserImageView.h +// SDPhotoBrowser +// +// Created by aier on 15-2-6. +// Copyright (c) 2015年 GSD. All rights reserved. +// + +#import +#import "SDWaitingView.h" + + +@interface SDBrowserImageView : UIImageView + +@property (nonatomic, assign) CGFloat progress; +@property (nonatomic, assign, readonly) BOOL isScaled; +@property (nonatomic, assign) BOOL hasLoadedImage; + +- (void)eliminateScale; // 清除缩放 + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; + +- (void)doubleTapToZommWithScale:(CGFloat)scale; + +- (void)clear; + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.m b/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.m new file mode 100755 index 00000000..6de9d0cd --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDBrowserImageView.m @@ -0,0 +1,237 @@ +// +// SDBrowserImageView.m +// SDPhotoBrowser +// +// Created by aier on 15-2-6. +// Copyright (c) 2015年 GSD. All rights reserved. +// + +#import "SDBrowserImageView.h" +#import "UIImageView+WebCache.h" +#import "SDPhotoBrowserConfig.h" + +@implementation SDBrowserImageView +{ + __weak SDWaitingView *_waitingView; + BOOL _didCheckSize; + UIScrollView *_scroll; + UIImageView *_scrollImageView; + UIScrollView *_zoomingScroolView; + UIImageView *_zoomingImageView; + CGFloat _totalScale; +} + + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + self.userInteractionEnabled = YES; + self.contentMode = UIViewContentModeScaleAspectFit; + _totalScale = 1.0; + + // 捏合手势缩放图片 + UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomImage:)]; + pinch.delegate = self; + [self addGestureRecognizer:pinch]; + + + + } + return self; +} + +- (BOOL)isScaled +{ + return 1.0 != _totalScale; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + _waitingView.center = CGPointMake(self.frame.size.width * 0.5, self.frame.size.height * 0.5); + + CGSize imageSize = self.image.size; + + if (self.bounds.size.width * (imageSize.height / imageSize.width) > self.bounds.size.height) { + if (!_scroll) { + UIScrollView *scroll = [[UIScrollView alloc] init]; + scroll.backgroundColor = [UIColor whiteColor]; + UIImageView *imageView = [[UIImageView alloc] init]; + imageView.image = self.image; + _scrollImageView = imageView; + [scroll addSubview:imageView]; + scroll.backgroundColor = SDPhotoBrowserBackgrounColor; + _scroll = scroll; + [self addSubview:scroll]; + if (_waitingView) { + [self bringSubviewToFront:_waitingView]; + } + } + _scroll.frame = self.bounds; + + CGFloat imageViewH = self.bounds.size.width * (imageSize.height / imageSize.width); + + _scrollImageView.bounds = CGRectMake(0, 0, _scroll.frame.size.width, imageViewH); + _scrollImageView.center = CGPointMake(_scroll.frame.size.width * 0.5, _scrollImageView.frame.size.height * 0.5); + _scroll.contentSize = CGSizeMake(0, _scrollImageView.bounds.size.height); + + } else { + if (_scroll) [_scroll removeFromSuperview]; // 防止旋转时适配的scrollView的影响 + } + +} + + + +- (void)setProgress:(CGFloat)progress +{ + _progress = progress; + _waitingView.progress = progress; + +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder +{ + SDWaitingView *waiting = [[SDWaitingView alloc] init]; + waiting.bounds = CGRectMake(0, 0, 100, 100); + waiting.mode = SDWaitingViewProgressMode; + _waitingView = waiting; + [self addSubview:waiting]; + + + __weak SDBrowserImageView *imageViewWeak = self; + + + [self sd_setImageWithURL:url placeholderImage:placeholder options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { + imageViewWeak.progress = (CGFloat)receivedSize / expectedSize; + } completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) { + [imageViewWeak removeWaitingView]; + + + if (error) { + UILabel *label = [[UILabel alloc] init]; + label.bounds = CGRectMake(0, 0, 160, 30); + label.center = CGPointMake(imageViewWeak.bounds.size.width * 0.5, imageViewWeak.bounds.size.height * 0.5); + label.text = @"图片加载失败"; + label.font = [UIFont systemFontOfSize:16]; + label.textColor = [UIColor whiteColor]; + label.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.8]; + label.layer.cornerRadius = 5; + label.clipsToBounds = YES; + label.textAlignment = NSTextAlignmentCenter; + [imageViewWeak addSubview:label]; + } else { + _scrollImageView.image = image; + [_scrollImageView setNeedsDisplay]; + } + + }]; + +} + +- (void)zoomImage:(UIPinchGestureRecognizer *)recognizer +{ + [self prepareForImageViewScaling]; + CGFloat scale = recognizer.scale; + CGFloat temp = _totalScale + (scale - 1); + [self setTotalScale:temp]; + recognizer.scale = 1.0; +} + +- (void)setTotalScale:(CGFloat)totalScale +{ + if ((_totalScale < 0.5 && totalScale < _totalScale) || (_totalScale > 2.0 && totalScale > _totalScale)) return; // 最大缩放 2倍,最小0.5倍 + + [self zoomWithScale:totalScale]; +} + +- (void)zoomWithScale:(CGFloat)scale +{ + _totalScale = scale; + + _zoomingImageView.transform = CGAffineTransformMakeScale(scale, scale); + + if (scale > 1) { + CGFloat contentW = _zoomingImageView.frame.size.width; + CGFloat contentH = MAX(_zoomingImageView.frame.size.height, self.frame.size.height); + + _zoomingImageView.center = CGPointMake(contentW * 0.5, contentH * 0.5); + _zoomingScroolView.contentSize = CGSizeMake(contentW, contentH); + + + CGPoint offset = _zoomingScroolView.contentOffset; + offset.x = (contentW - _zoomingScroolView.frame.size.width) * 0.5; +// offset.y = (contentH - _zoomingImageView.frame.size.height) * 0.5; + _zoomingScroolView.contentOffset = offset; + + } else { + _zoomingScroolView.contentSize = _zoomingScroolView.frame.size; + _zoomingScroolView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); + _zoomingImageView.center = _zoomingScroolView.center; + } +} + +- (void)doubleTapToZommWithScale:(CGFloat)scale +{ + [self prepareForImageViewScaling]; + [UIView animateWithDuration:0.5 animations:^{ + [self zoomWithScale:scale]; + } completion:^(BOOL finished) { + if (scale == 1) { + [self clear]; + } + }]; +} + +- (void)prepareForImageViewScaling +{ + if (!_zoomingScroolView) { + _zoomingScroolView = [[UIScrollView alloc] initWithFrame:self.bounds]; + _zoomingScroolView.backgroundColor = SDPhotoBrowserBackgrounColor; + _zoomingScroolView.contentSize = self.bounds.size; + UIImageView *zoomingImageView = [[UIImageView alloc] initWithImage:self.image]; + CGSize imageSize = zoomingImageView.image.size; + CGFloat imageViewH = self.bounds.size.height; + if (imageSize.width > 0) { + imageViewH = self.bounds.size.width * (imageSize.height / imageSize.width); + } + zoomingImageView.bounds = CGRectMake(0, 0, self.bounds.size.width, imageViewH); + zoomingImageView.center = _zoomingScroolView.center; + zoomingImageView.contentMode = UIViewContentModeScaleAspectFit; + _zoomingImageView = zoomingImageView; + [_zoomingScroolView addSubview:zoomingImageView]; + [self addSubview:_zoomingScroolView]; + } +} + +- (void)scaleImage:(CGFloat)scale +{ + [self prepareForImageViewScaling]; + [self setTotalScale:scale]; +} + +// 清除缩放 +- (void)eliminateScale +{ + [self clear]; + _totalScale = 1.0; +} + +- (void)clear +{ + [_zoomingScroolView removeFromSuperview]; + _zoomingScroolView = nil; + _zoomingImageView = nil; + +} + +- (void)removeWaitingView +{ + [_waitingView removeFromSuperview]; +} + + + + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.h b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.h new file mode 100755 index 00000000..b6c35046 --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.h @@ -0,0 +1,38 @@ +// +// SDPhotoBrowser.h +// photobrowser +// +// Created by aier on 15-2-3. +// Copyright (c) 2015年 aier. All rights reserved. +// + +#import + + +@class SDButton, SDPhotoBrowser; + +@protocol SDPhotoBrowserDelegate + +@required + +- (UIImage *)photoBrowser:(SDPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index; + +@optional + +- (NSURL *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index; + +@end + + +@interface SDPhotoBrowser : UIView + +@property (nonatomic, weak) UIView *sourceImagesContainerView; +@property (nonatomic, assign) NSInteger currentImageIndex; +@property (nonatomic, assign) NSInteger imageCount; +@property (nonatomic, assign) BOOL isMe; +@property (nonatomic, assign) CGRect sourceImagesFrame; +@property (nonatomic, strong) id delegate; +@property (nonatomic, assign) BOOL isHaveUserAdd; // 为了区分当前页面的cell是否第一个是添加图片的Icon +- (void)show; + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.m b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.m new file mode 100755 index 00000000..ae0a7e52 --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowser.m @@ -0,0 +1,393 @@ +// +// SDPhotoBrowser.m +// photobrowser +// +// Created by aier on 15-2-3. +// Copyright (c) 2015年 aier. All rights reserved. +// + +#import "SDPhotoBrowser.h" +#import "UIImageView+WebCache.h" +#import "SDBrowserImageView.h" + +#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO) //判断是否iPhoneX + +#define iPhoneX_NavSafeArea ([[UIScreen mainScreen] bounds].size.height >= 812.0 ? 24 : 0) // 如果是iphoneX 顶部安全区域 24 + +// ============在这里方便配置样式相关设置=========== + +// || +// || +// || +// \\// +// \/ + +#import "SDPhotoBrowserConfig.h" + +// ============================================= + +@implementation SDPhotoBrowser +{ + UIScrollView *_scrollView; + BOOL _hasShowedFistView; + UILabel *_indexLabel; + UIButton *_saveButton; + UIActivityIndicatorView *_indicatorView; + BOOL _willDisappear; + UIWindow *currentWindows; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + + if (self) { + self.backgroundColor = SDPhotoBrowserBackgrounColor; + _isMe = NO; + } + return self; +} + + +- (void)didMoveToSuperview +{ + [self setupScrollView]; + + [self setupToolbars]; +} + +- (void)dealloc +{ + [currentWindows removeObserver:self forKeyPath:@"frame"]; + self.delegate = nil; +} + + +- (void)setupToolbars +{ + // 1. 序标 + UILabel *indexLabel = [[UILabel alloc] init]; + indexLabel.bounds = CGRectMake(0, 0, 80, 30); + indexLabel.textAlignment = NSTextAlignmentCenter; + indexLabel.textColor = [UIColor whiteColor]; + indexLabel.font = [UIFont boldSystemFontOfSize:20]; + indexLabel.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; + indexLabel.layer.cornerRadius = indexLabel.bounds.size.height * 0.5; + indexLabel.clipsToBounds = YES; + if (self.imageCount >= 1) { + indexLabel.text = [NSString stringWithFormat:@"1/%ld", (long)self.imageCount]; + } + _indexLabel = indexLabel; + [self addSubview:indexLabel]; + + // 2.保存按钮 + UIButton *saveButton = [[UIButton alloc] init]; + [saveButton setTitle:@"保存" forState:UIControlStateNormal]; + [saveButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + saveButton.backgroundColor = [UIColor colorWithRed:0.1f green:0.1f blue:0.1f alpha:0.90f]; + saveButton.layer.cornerRadius = 5; + saveButton.clipsToBounds = YES; + [saveButton addTarget:self action:@selector(saveImage) forControlEvents:UIControlEventTouchUpInside]; + _saveButton = saveButton; + [self addSubview:saveButton]; +} + +- (void)saveImage +{ + int index = _scrollView.contentOffset.x / _scrollView.bounds.size.width; + UIImageView *currentImageView = _scrollView.subviews[index]; + + UIImageWriteToSavedPhotosAlbum(currentImageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); + + if (_indicatorView == nil) { + _indicatorView = [[UIActivityIndicatorView alloc] init]; + _indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; + _indicatorView.center = self.center; + [[UIApplication sharedApplication].keyWindow addSubview:_indicatorView]; + } + + [_indicatorView startAnimating]; +} + +- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo; +{ + [_indicatorView stopAnimating]; + + UILabel *label = [[UILabel alloc] init]; + label.textColor = [UIColor whiteColor]; + label.backgroundColor = [UIColor colorWithRed:0.1f green:0.1f blue:0.1f alpha:0.90f]; + label.layer.cornerRadius = 5; + label.clipsToBounds = YES; + label.bounds = CGRectMake(0, 0, 150, 30); + label.center = self.center; + label.textAlignment = NSTextAlignmentCenter; + label.font = [UIFont boldSystemFontOfSize:17]; + [[UIApplication sharedApplication].keyWindow addSubview:label]; + [[UIApplication sharedApplication].keyWindow bringSubviewToFront:label]; + if (error) { + label.text = SDPhotoBrowserSaveImageFailText; + } else { + label.text = SDPhotoBrowserSaveImageSuccessText; + } + [label performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:1.0]; +} + +- (void)setupScrollView +{ + _scrollView = [[UIScrollView alloc] init]; + _scrollView.delegate = self; + _scrollView.showsHorizontalScrollIndicator = NO; + _scrollView.showsVerticalScrollIndicator = NO; + _scrollView.pagingEnabled = YES; + [self addSubview:_scrollView]; + + for (int i = 0; i < self.imageCount; i++) { + SDBrowserImageView *imageView = [[SDBrowserImageView alloc] init]; + imageView.tag = i; + + // 单击图片 + UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoClick:)]; + + // 双击放大图片 + UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageViewDoubleTaped:)]; + doubleTap.numberOfTapsRequired = 2; + + [singleTap requireGestureRecognizerToFail:doubleTap]; + + [imageView addGestureRecognizer:singleTap]; + [imageView addGestureRecognizer:doubleTap]; + [_scrollView addSubview:imageView]; + } + + [self setupImageOfImageViewForIndex:self.currentImageIndex]; + +} + +// 加载图片 +- (void)setupImageOfImageViewForIndex:(NSInteger)index +{ + SDBrowserImageView *imageView = _scrollView.subviews[index]; + self.currentImageIndex = index; + if (imageView.hasLoadedImage) return; + if ([self highQualityImageURLForIndex:index]) { + [imageView setImageWithURL:[self highQualityImageURLForIndex:index] placeholderImage:[self placeholderImageForIndex:index]]; + } else { + imageView.image = [self placeholderImageForIndex:index]; + } + imageView.hasLoadedImage = YES; +} + +- (void)photoClick:(UITapGestureRecognizer *)recognizer +{ + _scrollView.hidden = YES; + _willDisappear = YES; + + SDBrowserImageView *currentImageView = (SDBrowserImageView *)recognizer.view; + NSInteger currentIndex = currentImageView.tag; + if (self.isHaveUserAdd) { + currentIndex = currentImageView.tag + 1; + } + + UIView *sourceView = nil; + if ([self.sourceImagesContainerView isKindOfClass:UICollectionView.class]) { + UICollectionView *view = (UICollectionView *)self.sourceImagesContainerView; + NSIndexPath *path = [NSIndexPath indexPathForItem:currentIndex inSection:0]; + sourceView = [view cellForItemAtIndexPath:path]; + }else { + if (self.currentImageIndex margin || (x - index * self.bounds.size.width) < - margin) { + SDBrowserImageView *imageView = _scrollView.subviews[index]; + if (imageView.isScaled) { + [UIView animateWithDuration:0.5 animations:^{ + imageView.transform = CGAffineTransformIdentity; + } completion:^(BOOL finished) { + [imageView eliminateScale]; + }]; + } + } + + + if (!_willDisappear) { + if (self.isMe) { + if (self.isHaveUserAdd) { + _indexLabel.text = [NSString stringWithFormat:@"%d/%ld", index + 1, (long)self.imageCount]; + } else { + _indexLabel.text = [NSString stringWithFormat:@"%d/%ld", index, (long)self.imageCount]; + } + }else{ + _indexLabel.text = [NSString stringWithFormat:@"%d/%ld", index + 1, (long)self.imageCount]; + } + + } + [self setupImageOfImageViewForIndex:index]; +} + + + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowserConfig.h b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowserConfig.h new file mode 100755 index 00000000..f87039b9 --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDPhotoBrowserConfig.h @@ -0,0 +1,42 @@ +// +// SDPhotoBrowserConfig.h +// SDPhotoBrowser +// +// Created by aier on 15-2-9. +// Copyright (c) 2015年 GSD. All rights reserved. +// + + +typedef enum { + SDWaitingViewModeLoopDiagram, // 环形 + SDWaitingViewModePieDiagram // 饼型 +} SDWaitingViewMode; + +// 图片保存成功提示文字 +#define SDPhotoBrowserSaveImageSuccessText @" ^_^ 保存成功 "; + +// 图片保存失败提示文字 +#define SDPhotoBrowserSaveImageFailText @" >_< 保存失败 "; + +// browser背景颜色 +#define SDPhotoBrowserBackgrounColor [UIColor colorWithRed:0 green:0 blue:0 alpha:0.95] + +// browser中图片间的margin +#define SDPhotoBrowserImageViewMargin 10 + +// browser中显示图片动画时长 +#define SDPhotoBrowserShowImageAnimationDuration 0.4f + +// browser中显示图片动画时长 +#define SDPhotoBrowserHideImageAnimationDuration 0.4f + +// 图片下载进度指示进度显示样式(SDWaitingViewModeLoopDiagram 环形,SDWaitingViewModePieDiagram 饼型) +#define SDWaitingViewProgressMode SDWaitingViewModeLoopDiagram + +// 图片下载进度指示器背景色 +#define SDWaitingViewBackgroundColor [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7] + +// 图片下载进度指示器内部控件间的间距 +#define SDWaitingViewItemMargin 10 + + diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.h b/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.h new file mode 100755 index 00000000..fa601710 --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.h @@ -0,0 +1,17 @@ +// +// SDWaitingView.h +// SDPhotoBrowser +// +// Created by aier on 15-2-6. +// Copyright (c) 2015年 GSD. All rights reserved. +// + +#import +#import "SDPhotoBrowserConfig.h" + +@interface SDWaitingView : UIView + +@property (nonatomic, assign) CGFloat progress; +@property (nonatomic, assign) int mode; + +@end diff --git a/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.m b/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.m new file mode 100755 index 00000000..598f0dac --- /dev/null +++ b/xplan-ios/Base/Tool/SDPhotoBrowser/SDWaitingView.m @@ -0,0 +1,93 @@ +// +// SDWaitingView.m +// SDPhotoBrowser +// +// Created by aier on 15-2-6. +// Copyright (c) 2015年 GSD. All rights reserved. +// + +#import "SDWaitingView.h" + +//// 图片下载进度指示器背景色 +//#define SDWaitingViewBackgroundColor [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7] +// +//// 图片下载进度指示器内部控件间的间距 +// +//#define SDWaitingViewItemMargin 10 + + +@implementation SDWaitingView + + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + self.backgroundColor = SDWaitingViewBackgroundColor; + self.layer.cornerRadius = 5; + self.clipsToBounds = YES; + self.mode = SDWaitingViewModeLoopDiagram; + } + return self; +} + +- (void)setProgress:(CGFloat)progress +{ + _progress = progress; +// NSLog(@"%@",[NSThread currentThread]); + //将重绘操作放在主线程,解决自动布局控制台报错的问题 + dispatch_async(dispatch_get_main_queue(), ^{ + + [self setNeedsDisplay]; + if (progress >= 1) { + [self removeFromSuperview]; + } + }); +} + +- (void)drawRect:(CGRect)rect +{ + CGContextRef ctx = UIGraphicsGetCurrentContext(); + + CGFloat xCenter = rect.size.width * 0.5; + CGFloat yCenter = rect.size.height * 0.5; + [[UIColor whiteColor] set]; + + switch (self.mode) { + case SDWaitingViewModePieDiagram: + { + CGFloat radius = MIN(rect.size.width * 0.5, rect.size.height * 0.5) - SDWaitingViewItemMargin; + + + CGFloat w = radius * 2 + SDWaitingViewItemMargin; + CGFloat h = w; + CGFloat x = (rect.size.width - w) * 0.5; + CGFloat y = (rect.size.height - h) * 0.5; + CGContextAddEllipseInRect(ctx, CGRectMake(x, y, w, h)); + CGContextFillPath(ctx); + + [SDWaitingViewBackgroundColor set]; + CGContextMoveToPoint(ctx, xCenter, yCenter); + CGContextAddLineToPoint(ctx, xCenter, 0); + CGFloat to = - M_PI * 0.5 + self.progress * M_PI * 2 + 0.001; // 初始值 + CGContextAddArc(ctx, xCenter, yCenter, radius, - M_PI * 0.5, to, 1); + CGContextClosePath(ctx); + + CGContextFillPath(ctx); + } + break; + + default: + { + CGContextSetLineWidth(ctx, 15); + CGContextSetLineCap(ctx, kCGLineCapRound); + CGFloat to = - M_PI * 0.5 + self.progress * M_PI * 2 + 0.05; // 初始值0.05 + CGFloat radius = MIN(rect.size.width, rect.size.height) * 0.5 - SDWaitingViewItemMargin; + CGContextAddArc(ctx, xCenter, yCenter, radius, - M_PI * 0.5, to, 0); + CGContextStrokePath(ctx); + } + break; + } +} + +@end diff --git a/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.h b/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.h new file mode 100644 index 00000000..b11774fe --- /dev/null +++ b/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.h @@ -0,0 +1,33 @@ +// +// XPMineUserInfoEditModel.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +typedef NS_ENUM(NSInteger, XPMineUserInfoEditType) { + XPMineUserInfoEditType_Avatar,///头像 + XPMineUserInfoEditType_Nick,///名字 + XPMineUserInfoEditType_Birth,///生日 + XPMineUserInfoEditType_Photo,///相册 + XPMineUserInfoEditType_UseDes,///用户描述 +}; + +@interface XPMineUserInfoEditModel : NSObject +///类型 +@property (nonatomic,assign) XPMineUserInfoEditType type; +///标题 +@property (nonatomic,copy) NSString *title; +///副标题 +@property (nonatomic,copy) NSString *subTitle; +///头像 +@property (nonatomic,copy) NSString *avatarUrl; +///相册 +@property (nonatomic,copy) NSArray *photoArray; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.m b/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.m new file mode 100644 index 00000000..50259226 --- /dev/null +++ b/xplan-ios/Main/Mine/Model/XPMineUserInfoEditModel.m @@ -0,0 +1,12 @@ +// +// XPMineUserInfoEditModel.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoEditModel.h" + +@implementation XPMineUserInfoEditModel + +@end diff --git a/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.h b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.h new file mode 100644 index 00000000..e2fb2553 --- /dev/null +++ b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.h @@ -0,0 +1,19 @@ +// +// XPMineUserInfoEditPresenter.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "BaseMvpPresenter.h" + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel; +@interface XPMineUserInfoEditPresenter : BaseMvpPresenter + +///获取个人资料页编辑的数据源 +- (void)getUserInfoEditDataSourceWithUserInfo:(UserInfoModel *)userInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.m b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.m new file mode 100644 index 00000000..2dbec1c7 --- /dev/null +++ b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoEditPresenter.m @@ -0,0 +1,126 @@ +// +// XPMineUserInfoEditPresenter.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoEditPresenter.h" + +///Model +#import "XPMineUserInfoEditModel.h" +#import "UserInfoModel.h" +///P +#import "XPMineUserInfoEditProtocol.h" +@interface XPMineUserInfoEditPresenter () +///昵称 +@property (nonatomic,strong) XPMineUserInfoEditModel *nickItem; +///头像 +@property (nonatomic,strong) XPMineUserInfoEditModel *avatarItem; +///生日 +@property (nonatomic,strong) XPMineUserInfoEditModel *birthItem; +///相册 +@property (nonatomic,strong) XPMineUserInfoEditModel *photoItem; +///介绍 +@property (nonatomic,strong) XPMineUserInfoEditModel *desItem; +/// +@property (nonatomic,strong) NSMutableArray *editArray; +///日期的格式 +@property (nonatomic,strong) NSDateFormatter *dateFormatter; +@end + +@implementation XPMineUserInfoEditPresenter + +///获取个人资料页编辑的数据源 +- (void)getUserInfoEditDataSourceWithUserInfo:(UserInfoModel *)userInfo { + ///数据组装 + if (self.editArray.count <= 0) { + [self.editArray addObject:self.avatarItem]; + [self.editArray addObject:self.nickItem]; + [self.editArray addObject:self.birthItem]; + [self.editArray addObject:self.photoItem]; + [self.editArray addObject:self.desItem]; + } + + if (userInfo.avatar.length > 0) { + self.avatarItem.avatarUrl = userInfo.avatar; + } + + self.nickItem.subTitle = userInfo.nick; + NSString *dateStr = [self.dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:userInfo.birth/1000]]; + self.birthItem.subTitle = dateStr; + + if (userInfo.privatePhoto.count > 0) { + self.photoItem.photoArray = userInfo.privatePhoto; + } + self.desItem.subTitle = userInfo.userDesc.length > 0 ? userInfo.userDesc : @""; + ///数据回传 + [[self getView] getUserInfoEditDataSourceSuccess:self.editArray]; +} + + + + +- (XPMineUserInfoEditModel *)nickItem { + if (!_nickItem) { + _nickItem = [[XPMineUserInfoEditModel alloc] init]; + _nickItem.type = XPMineUserInfoEditType_Nick; + _nickItem.title = @"昵称:"; + } + return _nickItem; +} + +- (XPMineUserInfoEditModel *)avatarItem { + if (!_avatarItem) { + _avatarItem = [[XPMineUserInfoEditModel alloc] init]; + _avatarItem.type = XPMineUserInfoEditType_Avatar; + _avatarItem.title = @"头像:"; + } + return _avatarItem; +} + + +- (XPMineUserInfoEditModel *)birthItem { + if (!_birthItem) { + _birthItem = [[XPMineUserInfoEditModel alloc] init]; + _birthItem.type = XPMineUserInfoEditType_Birth; + _birthItem.title = @"生日:"; + } + return _birthItem; +} + +- (XPMineUserInfoEditModel *)photoItem { + if (!_photoItem) { + _photoItem = [[XPMineUserInfoEditModel alloc] init]; + _photoItem.type = XPMineUserInfoEditType_Photo; + _photoItem.title = @"相册:"; + } + return _photoItem; +} + +- (XPMineUserInfoEditModel *)desItem { + if (!_desItem) { + _desItem = [[XPMineUserInfoEditModel alloc] init]; + _desItem.type = XPMineUserInfoEditType_UseDes; + _desItem.title = @"个人介绍:"; + } + return _desItem; +} + +- (NSMutableArray *)editArray { + if (!_editArray) { + _editArray = [NSMutableArray array]; + } + return _editArray; +} + +- (NSDateFormatter *)dateFormatter { + if (!_dateFormatter) { + _dateFormatter = [[NSDateFormatter alloc] init]; + _dateFormatter.dateFormat = @"YYYY-MM-dd"; + } + return _dateFormatter; +} + + +@end diff --git a/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.h b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.h new file mode 100644 index 00000000..f18a5440 --- /dev/null +++ b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoPresenter.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "BaseMvpPresenter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoPresenter : BaseMvpPresenter +// 获取用户信息 +- (void)getUserInfoWithUid:(NSString *)uid; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.m b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.m new file mode 100644 index 00000000..188d01bd --- /dev/null +++ b/xplan-ios/Main/Mine/Presenter/XPMineUserInfoPresenter.m @@ -0,0 +1,29 @@ +// +// XPMineUserInfoPresenter.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoPresenter.h" +///Api +#import "Api+Mine.h" +///Model +#import "UserInfoModel.h" +///P +#import "XPMineUserInfoProtocol.h" + +@implementation XPMineUserInfoPresenter + +// 获取用户信息 +- (void)getUserInfoWithUid:(NSString *)uid { + [Api getUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + UserInfoModel * infoModel = [UserInfoModel modelWithDictionary:data.data]; + [[self getView] onGetUserInfoSuccess:infoModel]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + + }] uid:uid]; +} + + +@end diff --git a/xplan-ios/Main/Mine/Protocol/XPMineUserInfoEditProtocol.h b/xplan-ios/Main/Mine/Protocol/XPMineUserInfoEditProtocol.h new file mode 100644 index 00000000..3a1c0211 --- /dev/null +++ b/xplan-ios/Main/Mine/Protocol/XPMineUserInfoEditProtocol.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoEditProtocol.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol XPMineUserInfoEditProtocol +///获取编辑个人资料页面的数据 +- (void)getUserInfoEditDataSourceSuccess:(NSArray *)array; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/Protocol/XPMineUserInfoProtocol.h b/xplan-ios/Main/Mine/Protocol/XPMineUserInfoProtocol.h new file mode 100644 index 00000000..90a50dec --- /dev/null +++ b/xplan-ios/Main/Mine/Protocol/XPMineUserInfoProtocol.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoProtocol.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol XPMineUserInfoProtocol +///获取用户信息成功 +- (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.h b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.h new file mode 100644 index 00000000..5ed55e51 --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.h @@ -0,0 +1,27 @@ +// +// XPMineCustomNavView.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class XPMineUserInfoCustomNavView; +@protocol XPMineCustomNavViewDelegate +///点击了编辑的按钮 +- (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickEditButton:(UIButton *)sender; +///点击了返回按钮 +- (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickBackButton:(UIButton *)sender; +@end +@interface XPMineUserInfoCustomNavView : UIView +///代理 +@property (nonatomic,weak) id delegate; +///显示文本 +@property (nonatomic,strong,readonly) UILabel *titleLabel; +///编辑按钮 +@property (nonatomic,strong,readonly) UIButton *editButton; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.m b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.m new file mode 100644 index 00000000..edd9e48f --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoCustomNavView.m @@ -0,0 +1,103 @@ +// +// XPMineCustomNavView.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoCustomNavView.h" +///Third +#import +///Tool +#import "ThemeColor.h" + +@interface XPMineUserInfoCustomNavView () +///返回按钮 +@property (nonatomic,strong) UIButton *backButton; +///显示文本 +@property (nonatomic,strong) UILabel *titleLabel; +///编辑按钮 +@property (nonatomic,strong) UIButton *editButton; +@end + +@implementation XPMineUserInfoCustomNavView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} +#pragma mark - Response +- (void)editButtonAction:(UIButton *)sender { + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineCustomNavView:didClickEditButton:)]) { + [self.delegate xPMineCustomNavView:self didClickEditButton:sender]; + } +} + +- (void)backButtonAction:(UIButton *)sender { + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineCustomNavView:didClickBackButton:)]) { + [self.delegate xPMineCustomNavView:self didClickBackButton:sender]; + } +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + [self addSubview:self.backButton]; + [self addSubview:self.titleLabel]; + [self addSubview:self.editButton]; +} + +- (void)initSubViewConstraints { + [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(15); + make.centerY.equalTo(self.mas_bottom).mas_offset(-22); + }]; + + [self.editButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(-15); + make.centerY.equalTo(self.mas_bottom).mas_offset(-22); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self); + make.centerY.equalTo(self.mas_bottom).mas_offset(-22); + }]; +} + +#pragma mark - Getters And Setters +- (UIButton *)backButton { + if (!_backButton) { + _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_backButton setImage:[UIImage imageNamed:@"common_nav_back"] forState:UIControlStateNormal]; + _backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + [_backButton addTarget:self action:@selector(backButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _backButton; +} + + +- (UIButton *)editButton { + if (!_editButton) { + _editButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_editButton setImage:[UIImage imageNamed:@"mine_user_info_edit"] forState:UIControlStateNormal]; + [_editButton addTarget:self action:@selector(editButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _editButton; +} + + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.font = [UIFont systemFontOfSize:15]; + _titleLabel.textColor = [ThemeColor mainTextColor]; + } + return _titleLabel; +} + +@end diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h new file mode 100644 index 00000000..bd41541e --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoEditTableViewCell.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class XPMineUserInfoEditModel; +@interface XPMineUserInfoEditTableViewCell : UITableViewCell +///数据 +@property (nonatomic,strong) XPMineUserInfoEditModel *itmeModel; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m new file mode 100644 index 00000000..8f0032d5 --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoEditTableViewCell.m @@ -0,0 +1,282 @@ +// +// XPMineUserInfoEditTableViewCell.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoEditTableViewCell.h" +///Third +#import +///Tool +#import "ThemeColor.h" +#import "UIImageView+LoadImage.h" +///Model +#import "XPMineUserInfoEditModel.h" + +@interface XPMineUserInfoEditTableViewCell () +///容器 +@property (nonatomic,strong) UIStackView *stackView; +///标题 +@property (nonatomic,strong) UILabel *titleLabel; +///头像 +@property (nonatomic,strong) UIImageView *avatarImageView; +///副标题 +@property (nonatomic,strong) UILabel *subTitleLabel; +///箭头 +@property (nonatomic,strong) UIImageView *arrowImageView; +///相册的 +@property (nonatomic,strong) UIStackView *phototStackView; +///第一个 +@property (nonatomic,strong) UIImageView *firstPhotoImageView; +///第er个 +@property (nonatomic,strong) UIImageView *secondPhotoImageView; +///第三个 +@property (nonatomic,strong) UIImageView *thirdPhotoImageView; +///分割线 +@property (nonatomic,strong) UIView * partLineView; +/// +@property (nonatomic,strong) NSMutableArray *photoViewArray; +@end + +@implementation XPMineUserInfoEditTableViewCell + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + [self.contentView addSubview:self.stackView]; + [self.contentView addSubview:self.partLineView]; + + [self.stackView addArrangedSubview:self.titleLabel]; + [self.stackView addArrangedSubview:self.avatarImageView]; + [self.stackView addArrangedSubview:self.subTitleLabel]; + [self.stackView addArrangedSubview:self.phototStackView]; + [self.stackView addArrangedSubview:self.arrowImageView]; + + [self.phototStackView addArrangedSubview:self.thirdPhotoImageView]; + [self.phototStackView addArrangedSubview:self.secondPhotoImageView]; + [self.phototStackView addArrangedSubview:self.firstPhotoImageView]; + + [self.photoViewArray addObject:self.firstPhotoImageView]; + [self.photoViewArray addObject:self.secondPhotoImageView]; + [self.photoViewArray addObject:self.secondPhotoImageView]; +} + +- (void)initSubViewConstraints { + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.partLineView.mas_top); + make.left.right.mas_equalTo(self.contentView).inset(15); + }]; + + [self.partLineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(25); + make.bottom.mas_equalTo(self.contentView); + make.height.mas_equalTo(1); + }]; + + [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(50, 50)); + }]; + + [self.arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(6, 10)); + }]; + + [self.firstPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(35); + }]; + + [self.secondPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(self.firstPhotoImageView); + }]; + + [self.thirdPhotoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(self.firstPhotoImageView); + }]; +} + +- (void)loadPhotoViewWithPhotoArray:(NSArray *)array { + if (array.count > 3) { + array = [array subarrayWithRange:NSMakeRange(0, 3)]; + } + for (int i = 0; i < array.count; i++) { + UIImageView * imageView = [self.photoViewArray objectAtIndex:i]; + NSString * imageUrl = [array objectAtIndex:i]; + [imageView load_setImageImageWithUrl:imageUrl placeholderImage:[UIImageConstant defaultAvatarPlaceholder]]; + } +} + +- (void)configCellWithModel:(XPMineUserInfoEditModel *)model{ + switch (model.type) { + case XPMineUserInfoEditType_Avatar: + { + self.subTitleLabel.hidden = YES; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = NO; + [self.avatarImageView load_setImageImageWithUrl:model.avatarUrl placeholderImage:[UIImageConstant defaultAvatarPlaceholder]]; + } + break; + case XPMineUserInfoEditType_Birth: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_Nick: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_UseDes: + { + self.subTitleLabel.hidden = NO; + self.phototStackView.hidden = YES; + self.avatarImageView.hidden = YES; + } + break; + case XPMineUserInfoEditType_Photo: + { + self.subTitleLabel.hidden = YES; + self.phototStackView.hidden = NO; + self.avatarImageView.hidden = YES; + [self loadPhotoViewWithPhotoArray:model.photoArray]; + } + break; + + default: + break; + } +} + +#pragma mark - Getters And Setters +- (void)setItmeModel:(XPMineUserInfoEditModel *)itmeModel { + _itmeModel = itmeModel; + if (_itmeModel) { + self.titleLabel.text = _itmeModel.title; + self.subTitleLabel.text = _itmeModel.subTitle; + [self configCellWithModel:itmeModel]; + } +} + +- (UIStackView *)stackView { + if (!_stackView) { + _stackView = [[UIStackView alloc] init]; + _stackView.axis = UILayoutConstraintAxisHorizontal; + _stackView.distribution = UIStackViewDistributionFill; + _stackView.alignment = UIStackViewAlignmentCenter; + _stackView.spacing = 10; + } + return _stackView; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont systemFontOfSize:14]; + _titleLabel.textColor = [ThemeColor mainTextColor]; + [_titleLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + } + return _titleLabel; +} + +- (UILabel *)subTitleLabel { + if (!_subTitleLabel) { + _subTitleLabel = [[UILabel alloc] init]; + _subTitleLabel.textColor = [ThemeColor secondTextColor]; + _subTitleLabel.font = [UIFont systemFontOfSize:12.f]; + _subTitleLabel.textAlignment = NSTextAlignmentRight; + } + return _subTitleLabel; +} + +- (UIImageView *)avatarImageView { + if (!_avatarImageView) { + _avatarImageView = [[UIImageView alloc] init]; + _avatarImageView.userInteractionEnabled = YES; + _avatarImageView.layer.cornerRadius = 25; + _avatarImageView.layer.masksToBounds = YES; + } + return _avatarImageView; +} + +- (UIImageView *)arrowImageView { + if (!_arrowImageView) { + _arrowImageView = [[UIImageView alloc] init]; + _arrowImageView.userInteractionEnabled = YES; + _arrowImageView.image = [UIImage imageNamed:@"mine_item_arrow"]; + [_arrowImageView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + } + return _arrowImageView; +} + +- (UIStackView *)phototStackView { + if (!_phototStackView) { + _phototStackView = [[UIStackView alloc] init]; + _phototStackView.axis = UILayoutConstraintAxisHorizontal; + _phototStackView.distribution = UIStackViewDistributionFill; + _phototStackView.alignment = UIStackViewAlignmentFill; + _phototStackView.spacing = 10; + } + return _phototStackView; +} + +- (UIImageView *)firstPhotoImageView { + if (!_firstPhotoImageView) { + _firstPhotoImageView = [[UIImageView alloc] init]; + _firstPhotoImageView.userInteractionEnabled = YES; + _firstPhotoImageView.layer.masksToBounds = YES; + _firstPhotoImageView.layer.cornerRadius = 5; + } + return _firstPhotoImageView; +} + +- (UIImageView *)secondPhotoImageView { + if (!_secondPhotoImageView) { + _secondPhotoImageView = [[UIImageView alloc] init]; + _secondPhotoImageView.userInteractionEnabled = YES; + _secondPhotoImageView.layer.masksToBounds = YES; + _secondPhotoImageView.layer.cornerRadius = 5; + } + return _secondPhotoImageView; +} + +- (UIImageView *)thirdPhotoImageView { + if (!_thirdPhotoImageView) { + _thirdPhotoImageView = [[UIImageView alloc] init]; + _thirdPhotoImageView.userInteractionEnabled = YES; + _thirdPhotoImageView.layer.masksToBounds = YES; + _thirdPhotoImageView.layer.cornerRadius = 5; + } + return _thirdPhotoImageView; +} + +- (UIView *)partLineView { + if (!_partLineView) { + _partLineView = [[UIView alloc] init]; + _partLineView.backgroundColor = [ThemeColor dividerColor]; + } + return _partLineView; +} + + +- (NSMutableArray *)photoViewArray { + if (!_photoViewArray) { + _photoViewArray = [NSMutableArray array]; + } + return _photoViewArray; +} + +@end diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.h b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.h new file mode 100644 index 00000000..f86e12cb --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.h @@ -0,0 +1,17 @@ +// +// XPMineInfoTableViewCell.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel; +@interface XPMineUserInfoTableViewCell : UITableViewCell +///用户信息 +@property (nonatomic,strong) UserInfoModel *userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.m b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.m new file mode 100644 index 00000000..e5caffb7 --- /dev/null +++ b/xplan-ios/Main/Mine/View/Cell/MineInfo/XPMineUserInfoTableViewCell.m @@ -0,0 +1,141 @@ +// +// XPMineInfoTableViewCell.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoTableViewCell.h" +///Third +#import +///Tool +#import "ThemeColor.h" +///Model +#import "UserInfoModel.h" + +@interface XPMineUserInfoTableViewCell () +///背景 +@property (nonatomic,strong) UIView * backView; +///名字 +@property (nonatomic,strong) UILabel *nameLabel; +///sex +@property (nonatomic,strong) UIImageView *sexImageView; +///id +@property (nonatomic,strong) UILabel *idLabel; +///签名 +@property (nonatomic,strong) UILabel *signLabel; +@end + +@implementation XPMineUserInfoTableViewCell + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + [self.contentView addSubview:self.backView]; + + [self.backView addSubview:self.nameLabel]; + [self.backView addSubview:self.sexImageView]; + [self.backView addSubview:self.idLabel]; + [self.backView addSubview:self.signLabel]; +} + +- (void)initSubViewConstraints { + [self.backView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(15); + make.top.bottom.mas_equalTo(self.contentView); + }]; + + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.backView).offset(15); + make.top.mas_equalTo(self.backView).offset(15); + }]; + + [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.nameLabel.mas_right).offset(5); + make.centerY.mas_equalTo(self.nameLabel); + }]; + + [self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.nameLabel); + make.top.mas_equalTo(self.nameLabel.mas_bottom).offset(10); + }]; + + [self.signLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.nameLabel); + make.top.mas_equalTo(self.idLabel.mas_bottom).offset(18); + }]; +} + +#pragma mark - Getters And Setters +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + if (_userInfo) { + self.nameLabel.text = _userInfo.nick; + self.idLabel.text = [NSString stringWithFormat:@"%@号:%ld",AppName, (long)_userInfo.erbanNo]; + self.signLabel.text = _userInfo.userDesc.length > 0 ? _userInfo.userDesc : @"我是个默认签名"; + NSString * sexStr; + if (_userInfo.gender == GenderType_Male) { + sexStr = @"common_male"; + } else { + sexStr = @"common_female"; + } + self.sexImageView.image = [UIImage imageNamed:sexStr]; + } +} + +- (UIView *)backView { + if (!_backView) { + _backView = [[UIView alloc] init]; + _backView.backgroundColor = [ThemeColor appCellBackgroundColor]; + _backView.layer.masksToBounds = YES; + _backView.layer.cornerRadius = 12; + } + return _backView; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [[UILabel alloc] init]; + _nameLabel.font = [UIFont fontWithName:@"PingFang-SC-Medium" size:15]; + _nameLabel.textColor = [ThemeColor mainTextColor]; + } + return _nameLabel; +} + +- (UIImageView *)sexImageView { + if (!_sexImageView) { + _sexImageView = [[UIImageView alloc] init]; + _sexImageView.userInteractionEnabled = YES; + } + return _sexImageView; +} + +- (UILabel *)idLabel { + if (!_idLabel) { + _idLabel = [[UILabel alloc] init]; + _idLabel.font = [UIFont systemFontOfSize:11]; + _idLabel.textColor = [ThemeColor textThirdColor]; + } + return _idLabel; +} + +- (UILabel *)signLabel { + if (!_signLabel) { + _signLabel = [[UILabel alloc] init]; + _signLabel.font = [UIFont systemFontOfSize:11];; + _signLabel.textColor = [ThemeColor secondTextColor]; + } + return _signLabel; +} + + +@end diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.h b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.h new file mode 100644 index 00000000..ea00e0fe --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.h @@ -0,0 +1,25 @@ +// +// XPMineUserInfoDesViewController.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "BaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel, XPMineUserInfoDesViewController; +@protocol XPMineUserInfoDesViewControllerDelegate + +////更新用户介绍 +- (void)xPMineUserInfoDesViewController:(XPMineUserInfoDesViewController *)viewController updateUserDes:(NSString *)userDes; + +@end +@interface XPMineUserInfoDesViewController : BaseViewController +///用户信息 +@property (nonatomic,strong) UserInfoModel *userInfo; +///代理 +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.m b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.m new file mode 100644 index 00000000..fa3a10eb --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoDesViewController.m @@ -0,0 +1,170 @@ +// +// XPMineUserInfoDesViewController.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoDesViewController.h" +///Third +#import +#import +#import +///Tool +#import "ThemeColor.h" +///Model +#import "UserInfoModel.h" + +static NSInteger maxCount = 60; + +@interface XPMineUserInfoDesViewController () +///容器 +@property (nonatomic, strong) UIView *containView; +///输入框 +@property (nonatomic, strong) SZTextView *useDescTextView; +///清除按钮 +@property (nonatomic, strong) UIButton *clearBtn; +///完成按钮 +@property (nonatomic, strong) UIButton *completionBtn; +///显示输入的个数 +@property (nonatomic, strong) UILabel *limitLabel;// + + +@end + + + +@implementation XPMineUserInfoDesViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = @"修改个人介绍"; + [self initSubViews]; + [self initSubViewConstraints]; + [self initEvents]; + +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + [self.view endEditing:YES]; +} + +#pragma mark - Private Method +- (void)initSubViews { + UIBarButtonItem *completeItem = [[UIBarButtonItem alloc] initWithCustomView:self.completionBtn]; + self.navigationItem.rightBarButtonItem = completeItem; + [self.view addSubview:self.containView]; + [self.containView addSubview:self.useDescTextView]; + [self.containView addSubview:self.clearBtn]; + [self.view addSubview:self.limitLabel]; + self.useDescTextView.text = self.userInfo.userDesc; + self.limitLabel.text = [NSString stringWithFormat:@"%ld",(maxCount - self.userInfo.userDesc.length)]; + self.limitLabel.textColor = self.userInfo.userDesc.length > 0 ? [ThemeColor mainTextColor] : [ThemeColor secondTextColor]; + self.completionBtn.enabled = self.useDescTextView.text.length > 0; +} + +- (void)initSubViewConstraints { + [self.containView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(20); + make.left.mas_equalTo(self.view).offset(15); + make.right.mas_equalTo(self.view).offset(-15); + make.height.mas_equalTo(137); + }]; + [self.useDescTextView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.mas_equalTo(self.containView).offset(10); + make.bottom.mas_equalTo(self.containView).offset(-10); + make.right.mas_equalTo(self.clearBtn.mas_left).offset(-5); + }]; + [self.clearBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.containView).offset(10); + make.right.mas_equalTo(self.containView).offset(-10); + }]; + [self.limitLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.containView.mas_bottom).offset(5); + make.right.mas_equalTo(self.containView); + }]; +} + +- (void)initEvents { + @weakify(self); + RAC(self.completionBtn, enabled) = [RACSignal combineLatest:@[self.useDescTextView.rac_textSignal] reduce:^id _Nonnull(NSString *text){ + @strongify(self); + self.limitLabel.text = [NSString stringWithFormat:@"%ld",(maxCount - text.length)]; + if (text.length > maxCount) { + [self showErrorToast:[NSString stringWithFormat:@"最多输入%ld个介绍", maxCount]]; + } + return @(text.length > 0 && text.length <= maxCount); + }]; + + + [[self.completionBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { + @strongify(self); + [self.navigationController popViewControllerAnimated:YES]; + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoDesViewController:updateUserDes:)]) { + [self.delegate xPMineUserInfoDesViewController:self updateUserDes:self.useDescTextView.text]; + } + }]; + + [[self.clearBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { + @strongify(self); + self.useDescTextView.text = @""; + self.completionBtn.enabled = NO; + self.limitLabel.text = [NSString stringWithFormat:@"%ld",(maxCount - self.useDescTextView.text.length)]; + }]; +} + +#pragma mark - getter && setter + +- (UIView *)containView { + if (!_containView) { + _containView = [[UIView alloc] init]; + _containView.layer.cornerRadius = 5; + _containView.backgroundColor = [ThemeColor appCellBackgroundColor]; + } + return _containView; +} + +- (SZTextView *)useDescTextView { + if (!_useDescTextView) { + _useDescTextView = [[SZTextView alloc] init]; + _useDescTextView.delegate = self; + _useDescTextView.placeholder = @"填写自我介绍,可以让别人更了解你哦~"; + _useDescTextView.placeholderTextColor = [ThemeColor secondTextColor]; + _useDescTextView.font = [UIFont systemFontOfSize:14]; + _useDescTextView.textColor = [ThemeColor mainTextColor]; + _useDescTextView.backgroundColor = [ThemeColor appCellBackgroundColor]; + } + return _useDescTextView; +} + +- (UIButton *)completionBtn { + if (!_completionBtn) { + _completionBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + [_completionBtn setTitle:@"完成" forState:UIControlStateNormal]; + [_completionBtn setFrame:CGRectMake(0, 0, 50, 30)]; + [_completionBtn setTitleColor:[ThemeColor mainTextColor] forState:UIControlStateNormal]; + [_completionBtn setTitleColor:[ThemeColor disableButtonTextColor] forState:UIControlStateDisabled]; + [_completionBtn.titleLabel setFont:[UIFont systemFontOfSize:13]]; + } + return _completionBtn; +} + +- (UILabel *)limitLabel { + if (!_limitLabel) { + _limitLabel = [[UILabel alloc] init]; + _limitLabel.font = [UIFont systemFontOfSize:14]; + _limitLabel.textColor = [ThemeColor secondTextColor]; + _limitLabel.text = @"60"; + } + return _limitLabel; +} + +- (UIButton *)clearBtn { + if (!_clearBtn) { + _clearBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + [_clearBtn setImage:[UIImage imageNamed:@"mine_user_info_edit_clear"] forState:UIControlStateNormal]; + } + return _clearBtn; +} + +@end diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.h b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.h new file mode 100644 index 00000000..04042e79 --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.h @@ -0,0 +1,17 @@ +// +// XPMineUserInfoEditViewController.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel; +@interface XPMineUserInfoEditViewController : MvpViewController +/// +@property (nonatomic,strong) UserInfoModel *userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.m b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.m new file mode 100644 index 00000000..ec329f99 --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoEditViewController.m @@ -0,0 +1,156 @@ +// +// XPMineUserInfoEditViewController.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoEditViewController.h" +///Third +#import +#import "ThemeColor.h" +///Model +#import "XPMineUserInfoEditModel.h" +#import "UserInfoModel.h" +///View +#import "XPMineUserInfoEditTableViewCell.h" +///P +#import "XPMineUserInfoEditProtocol.h" +#import "XPMineUserInfoEditPresenter.h" +///VC +#import "XPMineUserInfoNickViewController.h" +#import "XPMineUserInfoDesViewController.h" + +@interface XPMineUserInfoEditViewController () +///列表 +@property (nonatomic,strong) UITableView *tableView; +///数据源 +@property (nonatomic,strong) NSArray *datasouce;; +@end + +@implementation XPMineUserInfoEditViewController + +- (XPMineUserInfoEditPresenter *)createPresenter { + return [[XPMineUserInfoEditPresenter alloc] init]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self initSubViews]; + [self initSubViewConstraints]; +} +#pragma mark - Private Method +- (void)initSubViews { + self.title = @"编辑个人资料"; + [self.view addSubview:self.tableView]; + [self.presenter getUserInfoEditDataSourceWithUserInfo:self.userInfo]; +} + +- (void)initSubViewConstraints { + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; +} + +#pragma mark - UITableViewDelegate And UITableViewDataSource +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.datasouce.count; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoEditModel * model = [self.datasouce objectAtIndex:indexPath.row]; + if (model.type == XPMineUserInfoEditType_Avatar) { + return 60; + } else { + return 50; + } +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoEditTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + if (cell == nil) { + cell = [[XPMineUserInfoEditTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + } + XPMineUserInfoEditModel * model = [self.datasouce objectAtIndex:indexPath.row]; + cell.itmeModel = model; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + XPMineUserInfoEditModel * model = [self.datasouce objectAtIndex:indexPath.row]; + switch (model.type) { + case XPMineUserInfoEditType_Nick: + { + XPMineUserInfoNickViewController * nickVC = [[XPMineUserInfoNickViewController alloc] init]; + nickVC.userInfo = self.userInfo; + nickVC.delegate = self; + [self.navigationController pushViewController:nickVC animated:YES]; + } + break; + case XPMineUserInfoEditType_Avatar: + { +#warning to do 选择头像 + } + break; + case XPMineUserInfoEditType_Birth: + { +#warning to do 选择日期 + } + break; + case XPMineUserInfoEditType_UseDes: + { + XPMineUserInfoDesViewController * desVC = [[XPMineUserInfoDesViewController alloc] init]; + desVC.userInfo = self.userInfo; + desVC.delegate = self; + [self.navigationController pushViewController:desVC animated:YES]; + } + break; + case XPMineUserInfoEditType_Photo: + { +#warning to do 选择相册 + } + break; + + default: + break; + } +} + +#pragma mark - XPMineUserInfoNickViewControllerDelegate +- (void)xPMineUserInfoNickViewController:(XPMineUserInfoNickViewController *)viewController updateNick:(NSString *)nick { + +} +#pragma mark - XPMineUserInfoDesViewControllerDelegate +- (void)xPMineUserInfoDesViewController:(XPMineUserInfoDesViewController *)viewController updateUserDes:(NSString *)userDes { + +} + +#pragma mark - XPMineUserInfoEditProtocol +- (void)getUserInfoEditDataSourceSuccess:(NSArray *)array { + self.datasouce = array; + [self.tableView reloadData]; +} +#pragma mark - Getters And Setters +- (UITableView *)tableView { + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.tableFooterView = [UIView new]; + _tableView.tableHeaderView = [UIView new]; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_tableView registerClass:[XPMineUserInfoEditTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])]; + } + return _tableView; +} + +@end diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.h b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.h new file mode 100644 index 00000000..12f5b452 --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.h @@ -0,0 +1,24 @@ +// +// XPMineUserInfoNickViewController.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "BaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel, XPMineUserInfoNickViewController; +@protocol XPMineUserInfoNickViewControllerDelegate +///更新用户名 +- (void)xPMineUserInfoNickViewController:(XPMineUserInfoNickViewController *)viewController updateNick:(NSString *)nick; +@end + +@interface XPMineUserInfoNickViewController : BaseViewController +///用户信息 +@property (nonatomic,strong) UserInfoModel *userInfo; +///代理 +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.m b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.m new file mode 100644 index 00000000..e877f2b3 --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoNickViewController.m @@ -0,0 +1,168 @@ +// +// XPMineUserInfoNickViewController.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/23. +// + +#import "XPMineUserInfoNickViewController.h" +///Third +#import +#import +///Tool +#import "ThemeColor.h" +#import "UIImage+Utils.h" +///Tool +#import "UserInfoModel.h" + +static NSInteger maxCount = 15; + +@interface XPMineUserInfoNickViewController () +@property (nonatomic, strong) UIView *containView;// +@property (nonatomic, strong) UITextField *nickTextField;// +@property (nonatomic, strong) UIButton *completionBtn;// +@property (nonatomic, strong) UILabel *limitLabel;// +@end + +@implementation XPMineUserInfoNickViewController +- (void)viewDidLoad { + [super viewDidLoad]; + [self setEvents]; + [self setUpUI]; + [self initSubViewConstraints]; + +} + +#pragma mark -UI +- (void)setUpUI { + self.title = @"修改昵称"; + UIBarButtonItem *completeItem = [[UIBarButtonItem alloc] initWithCustomView:self.completionBtn]; + self.navigationItem.rightBarButtonItem = completeItem; + [self.view addSubview:self.containView]; + [self.containView addSubview:self.nickTextField]; + [self.view addSubview:self.limitLabel]; + self.nickTextField.text = self.userInfo.nick; + self.limitLabel.text = [NSString stringWithFormat:@"%ld", (long)(maxCount - self.userInfo.nick.length)]; +} + +- (void)initSubViewConstraints { + [self.containView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(20); + make.left.mas_equalTo(self.view).offset(15); + make.right.mas_equalTo(self.view).offset(-15); + make.height.mas_equalTo(35); + }]; + [self.nickTextField mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.containView); + make.left.mas_equalTo(self.containView).offset(5); + make.right.mas_equalTo(self.containView); + make.height.mas_equalTo(35); + }]; + [self.limitLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.nickTextField.mas_bottom).offset(8); + make.right.mas_equalTo(self.nickTextField); + }]; +} + +#pragma mark -交互事件 +- (void)setEvents { + @weakify(self) + [self.nickTextField.rac_textSignal subscribeNext:^(NSString * _Nullable x) { + @strongify(self); + [self nickTextRuleFilter:x]; + self.limitLabel.text = [NSString stringWithFormat:@"%ld", (long)(maxCount - self.nickTextField.text.length)]; + }]; + RAC(self.completionBtn, enabled) = [RACSignal combineLatest:@[self.nickTextField.rac_textSignal] reduce:^id _Nonnull(NSString *text){ + return @(text.length > 0 && text.length <= maxCount); + }]; + + // 完成 + [[self.completionBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { + @strongify(self); + [self.navigationController popViewControllerAnimated:YES]; + if (self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoNickViewController:updateNick:)]) { + [self.delegate xPMineUserInfoNickViewController:self updateNick:self.nickTextField.text]; + } + }]; +} + +// 昵称规则过滤 +- (void)nickTextRuleFilter:(NSString *)nickTitle{ + NSString *toBeString = nickTitle; + NSString *lang = [self.nickTextField.textInputMode primaryLanguage]; + if ([lang isEqualToString:@"zh-Hans"]){// 简体中文输入 + //获取高亮部分 + UITextRange *selectedRange = [self.nickTextField markedTextRange]; + UITextPosition *position = [self.nickTextField positionFromPosition:selectedRange.start offset:0]; + // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 + if (!position){ + if (toBeString.length > 15){ + [self showErrorToast:@"输入字数已达上限"]; + NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:15]; + if (rangeIndex.length == 1){ + self.nickTextField.text = [toBeString substringToIndex:15]; + }else{ + NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 15)]; + self.nickTextField.text = [toBeString substringWithRange:rangeRange]; + } + } + } + }else{ // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 + if (toBeString.length > 15){ + [self showErrorToast:@"输入字数已达上限"]; + NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:15]; + if (rangeIndex.length == 1){ + self.nickTextField.text = [toBeString substringToIndex:15]; + }else{ + NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, 15)]; + self.nickTextField.text = [toBeString substringWithRange:rangeRange]; + } + } + } +} + +#pragma mark - getter && setter + +- (UIView *)containView { + if (!_containView) { + _containView = [[UIView alloc] init]; + _containView.layer.cornerRadius = 5; + _containView.backgroundColor = [ThemeColor appCellBackgroundColor]; + } + return _containView; +} + +- (UITextField *)nickTextField { + if (!_nickTextField) { + _nickTextField = [[UITextField alloc] init]; + _nickTextField.clearButtonMode = UITextFieldViewModeAlways; + _nickTextField.font = [UIFont systemFontOfSize:14]; + _nickTextField.textColor = [ThemeColor mainTextColor]; + _nickTextField.layer.cornerRadius = 5; + } + return _nickTextField; +} + +- (UIButton *)completionBtn { + if (!_completionBtn) { + _completionBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + [_completionBtn setFrame:CGRectMake(0, 0, 50, 30)]; + [_completionBtn setTitle:@"完成" forState:UIControlStateNormal]; + [_completionBtn setTitleColor:[ThemeColor mainTextColor] forState:UIControlStateNormal]; + [_completionBtn setTitleColor:[ThemeColor disableButtonTextColor] forState:UIControlStateDisabled]; + _completionBtn.titleLabel.font = [UIFont systemFontOfSize:13]; + } + return _completionBtn; +} + +- (UILabel *)limitLabel { + if (!_limitLabel) { + _limitLabel = [[UILabel alloc] init]; + _limitLabel.font = [UIFont systemFontOfSize:14]; + _limitLabel.textColor = [ThemeColor secondTextColor]; + _limitLabel.text = @"0/15"; + } + return _limitLabel; +} + +@end diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.h b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.h new file mode 100644 index 00000000..348c599b --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.h @@ -0,0 +1,17 @@ +// +// MineInfoViewController.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/22. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMineUserInfoViewController : MvpViewController +///用户的id +@property (nonatomic,assign) long long uid; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.m b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.m new file mode 100644 index 00000000..3334713b --- /dev/null +++ b/xplan-ios/Main/Mine/View/MineInfo/XPMineUserInfoViewController.m @@ -0,0 +1,166 @@ +// +// MineInfoViewController.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/22. +// + +#import "XPMineUserInfoViewController.h" +///Third +#import +///Tool +#import "ThemeColor.h" +#import "XPMacro.h" +///View +#import "XPMineUserInfoTableViewCell.h" +#import "XPMineUserInfoHeaderView.h" +#import "XPMineUserInfoCustomNavView.h" +///P +#import "XPMineUserInfoPresenter.h" +#import "XPMineUserInfoProtocol.h" +///VC +#import "XPMineUserInfoEditViewController.h" + +@interface XPMineUserInfoViewController () +///列别 +@property (nonatomic,strong) UITableView *tableView; +///头部视图 +@property (nonatomic,strong) XPMineUserInfoHeaderView *headView; +///table的顶部视图 +@property (nonatomic,strong) UIView * tableViewHeadView; +///自定义的导航栏 +@property (nonatomic,strong) XPMineUserInfoCustomNavView *navView; +///用户信息 +@property (nonatomic,strong) UserInfoModel *userInfo; +@end + +@implementation XPMineUserInfoViewController + +- (XPMineUserInfoPresenter *)createPresenter { + return [[XPMineUserInfoPresenter alloc] init]; +} + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self initSubViews]; + [self initSubViewConstraints]; + +} +#pragma mark - Private Method +- (void)initSubViews { + [self.view addSubview:self.headView]; + [self.view addSubview:self.tableView]; + [self.view addSubview:self.navView]; + self.tableView.tableHeaderView = self.tableViewHeadView; +} + +- (void)initSubViewConstraints { + [self.headView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self.view); + make.height.mas_equalTo(250 + kSafeAreaTopHeight); + }]; + + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; + + [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self.view); + make.height.mas_equalTo(kNavigationHeight); + }]; +} + +#pragma mark - UITableViewDelegate And UITableViewDataSource +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return 1; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return 100; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + XPMineUserInfoTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineUserInfoTableViewCell class])]; + if (cell == nil) { + cell = [[XPMineUserInfoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineUserInfoTableViewCell class])]; + } + cell.userInfo = self.userInfo; + return cell; +} + +#pragma mark - XPMineCustomNavViewDelegate +- (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickEditButton:(UIButton *)sender { + XPMineUserInfoEditViewController * editVC = [[XPMineUserInfoEditViewController alloc] init]; + editVC.userInfo = self.userInfo; + [self.navigationController pushViewController:editVC animated:YES]; +} + +- (void)xPMineCustomNavView:(XPMineUserInfoCustomNavView *)view didClickBackButton:(UIButton *)sender { + [self.navigationController popViewControllerAnimated:YES]; +} + +#pragma mark - XPMineUserInfoProtocol +- (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo { + self.userInfo = userInfo; + self.headView.userInfo = userInfo; + [self.tableView reloadData]; +} + +#pragma mark - Getters And Setters +- (void)setUid:(long long)uid { + _uid = uid; + if (_uid > 0) { + NSString * uidStr = [NSString stringWithFormat:@"%lld", uid]; + [self.presenter getUserInfoWithUid:uidStr]; + } +} + +- (UITableView *)tableView { + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.tableFooterView = [UIView new]; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.backgroundColor = [UIColor clearColor]; + if (@available(iOS 11.0, *)) { + _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_tableView registerClass:[XPMineUserInfoTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineUserInfoTableViewCell class])]; + } + return _tableView; +} + +- (XPMineUserInfoHeaderView *)headView { + if (!_headView) { + _headView = [[XPMineUserInfoHeaderView alloc] init]; + } + return _headView; +} + +- (UIView *)tableViewHeadView { + if (!_tableViewHeadView) { + _tableViewHeadView = [[UIView alloc] init]; + _tableViewHeadView.frame = CGRectMake(0, 0, KScreenWidth, 179 + kSafeAreaTopHeight); + _tableViewHeadView.backgroundColor = [UIColor clearColor]; + } + return _tableViewHeadView; +} + +- (XPMineUserInfoCustomNavView *)navView { + if (!_navView) { + _navView = [[XPMineUserInfoCustomNavView alloc] init]; + _navView.delegate = self; + } + return _navView; +} + +@end diff --git a/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h b/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h new file mode 100644 index 00000000..ea00ad7a --- /dev/null +++ b/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.h @@ -0,0 +1,17 @@ +// +// XPMineHeaderView.h +// xplan-ios +// +// Created by 冯硕 on 2021/9/22. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class UserInfoModel; +@interface XPMineUserInfoHeaderView : UIView +/// +@property (nonatomic,strong) UserInfoModel *userInfo; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m b/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m new file mode 100644 index 00000000..3b8c0327 --- /dev/null +++ b/xplan-ios/Main/Mine/View/SubViews/MineInfo/XPMineUserInfoHeaderView.m @@ -0,0 +1,167 @@ +// +// XPMineHeaderView.m +// xplan-ios +// +// Created by 冯硕 on 2021/9/22. +// + +#import "XPMineUserInfoHeaderView.h" +///Third +#import +#import +#import "SDPhotoBrowser.h" +#import +///Tool +#import "ThemeColor.h" +#import "XPMacro.h" +#import "UIImageConstant.h" +///Model +#import "UserInfoModel.h" + +@interface XPMineUserInfoHeaderView () +///覆盖的 +@property (nonatomic,strong) UIView * coverView; +///轮播图 +@property (nonatomic,strong) SDCycleScrollView *cycleScrollView; +///高斯模糊 +@property (nonatomic,strong) UIVisualEffectView *effectView; +///显示当前的页数 +@property (nonatomic,strong) UILabel *pageLabel; +///图片数组 +@property (nonatomic,strong) NSArray *imageUrls; +@end + +@implementation XPMineUserInfoHeaderView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} +#pragma mark - Private Method +- (void)initSubViews { + [self addSubview:self.cycleScrollView]; + [self addSubview:self.effectView]; + [self addSubview:self.coverView]; + [self addSubview:self.pageLabel]; +} + +- (void)initSubViewConstraints { + [self.cycleScrollView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; + + [self.effectView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; + + [self.coverView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.cycleScrollView); + }]; + + [self.pageLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(-15); + make.width.mas_equalTo(35); + make.height.mas_equalTo(16); + make.top.mas_equalTo(self).offset(148 + kSafeAreaTopHeight); + }]; +} +#pragma mark - SDPhotoBrowserDelegate +- (NSURL *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index { + NSString * photoUrl = [self.imageUrls objectAtIndex:index]; + return [NSURL URLWithString:photoUrl]; +} + +- (UIImage *)photoBrowser:(SDPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index { + return [UIImage imageNamed:[UIImageConstant defalutBannerPlaceholder]]; +} + +#pragma mark - SDCycleScrollViewDelegate +-(void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didScrollToIndex:(NSInteger)index { + self.pageLabel.text = [NSString stringWithFormat:@"%ld/%lu",(index + 1), (unsigned long)self.imageUrls.count]; +} + +// 轮播图点击 +- (void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index { + NSInteger count = self.imageUrls.count; + SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; + browser.sourceImagesContainerView = self.cycleScrollView; + browser.delegate = self; + browser.imageCount = count; + browser.currentImageIndex = index; + browser.isMe = NO; + [browser show]; +} +#pragma mark - Getters And Setters +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + // 轮播图 + NSMutableArray * imageUrls; + if (self.userInfo.privatePhoto.count > 0) { + imageUrls = [[[self.userInfo.privatePhoto.rac_sequence map:^id _Nullable(UserPhoto * _Nullable value) { + return value.photoUrl; + }] array] mutableCopy] ; + } + if (self.userInfo.avatar.length > 0) { + if (imageUrls.count >0) { + [imageUrls addObject:self.userInfo.avatar]; + } else { + imageUrls = [NSMutableArray array]; + [imageUrls addObject:self.userInfo.avatar]; + } + + } + if (imageUrls.count > 0) { + self.imageUrls = imageUrls; + self.cycleScrollView.imageURLStringsGroup = imageUrls; + self.pageLabel.text = [NSString stringWithFormat:@"1/%lu",(unsigned long)imageUrls.count]; + } +} +- (UIView *)coverView { + if (!_coverView) { + _coverView = [[UIView alloc] init]; + _coverView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; + _coverView.alpha = 0.5; + } + return _coverView; +} + +- (SDCycleScrollView *)cycleScrollView { + if (!_cycleScrollView) { + _cycleScrollView = [[SDCycleScrollView alloc] init]; + _cycleScrollView.backgroundColor = [UIColor clearColor]; + _cycleScrollView.delegate = self; + _cycleScrollView.bannerImageViewContentMode = UIViewContentModeScaleAspectFill; + _cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleNone;; + _cycleScrollView.autoScroll = NO; + } + return _cycleScrollView; +} + +- (UIVisualEffectView *)effectView { + if (!_effectView) { + UIBlurEffect *beffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIVisualEffectView *view = [[UIVisualEffectView alloc]initWithEffect:beffect]; + _effectView = view; + } + return _effectView; +} + +- (UILabel *)pageLabel { + if (!_pageLabel) { + _pageLabel = [[UILabel alloc] init]; + _pageLabel.font = [UIFont systemFontOfSize:10]; + _pageLabel.textColor = [ThemeColor textThirdColor]; + _pageLabel.textAlignment = NSTextAlignmentCenter; + _pageLabel.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; + _pageLabel.alpha = 0.2; + _pageLabel.layer.masksToBounds = YES; + _pageLabel.layer.cornerRadius = 8; + } + return _pageLabel; +} + +@end diff --git a/xplan-ios/Main/Mine/View/XPMineViewController.m b/xplan-ios/Main/Mine/View/XPMineViewController.m index 31cee099..741106ec 100644 --- a/xplan-ios/Main/Mine/View/XPMineViewController.m +++ b/xplan-ios/Main/Mine/View/XPMineViewController.m @@ -15,6 +15,7 @@ #import "UIButton+EnlargeTouchArea.h" ///Model #import "XPMineItemModel.h" +#import "UserInfoModel.h" ///P #import "XPMineProtocol.h" #import "XPMinePresent.h" @@ -25,6 +26,7 @@ ///VC #import "XPMineSettingViewController.h" #import "XPMineTeenagerViewController.h" +#import "XPMineUserInfoViewController.h" #import "XPWebViewController.h" @@ -128,7 +130,11 @@ [self pushWebViewWIthUrl:URLWithType(kUserInviteFriendURL)]; break; case XPMineItemType_Personinfo: -#warning to do 个人中心 + { + XPMineUserInfoViewController * infoVC = [[XPMineUserInfoViewController alloc] init]; + infoVC.uid = self.userInfo.uid; + [self.navigationController pushViewController:infoVC animated:YES]; + } break; default: