From c6322a80e3c85fa712768dbfd644d11a2ba3e5b1 Mon Sep 17 00:00:00 2001 From: fengshuo <963787902@qq.com> Date: Fri, 1 Jul 2022 18:48:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=8F=91=E5=B8=83=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E7=9A=84=E4=B8=80=E4=BA=9B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xplan-ios.xcodeproj/project.pbxproj | 20 + .../monents_publish.imageset/Contents.json | 22 + .../monents_publish@2x.png | Bin 0 -> 11077 bytes .../monents_publish@3x.png | Bin 0 -> 23180 bytes .../Contents.json | 22 + .../monents_publish_album_delete@2x.png | Bin 0 -> 915 bytes .../monents_publish_album_delete@3x.png | Bin 0 -> 1657 bytes .../Presenter/XPMonentsPublishPresenter.h | 16 + .../Presenter/XPMonentsPublishPresenter.m | 12 + .../Protocol/XPMonentsPublishProtocol.h | 16 + .../Cell/XPMonentsPublishCollectionViewCell.h | 28 + .../Cell/XPMonentsPublishCollectionViewCell.m | 92 +++ .../View/XPMonentsPublishViewController.h | 16 + .../View/XPMonentsPublishViewController.m | 578 ++++++++++++++++++ .../Monents/View/XPMonentsViewController.m | 29 +- 15 files changed, 847 insertions(+), 4 deletions(-) create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@2x.png create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@3x.png create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/monents_publish_album_delete@2x.png create mode 100644 xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/monents_publish_album_delete@3x.png create mode 100644 xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.h create mode 100644 xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.m create mode 100644 xplan-ios/Main/Monents/Protocol/XPMonentsPublishProtocol.h create mode 100644 xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.h create mode 100644 xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.m create mode 100644 xplan-ios/Main/Monents/View/XPMonentsPublishViewController.h create mode 100644 xplan-ios/Main/Monents/View/XPMonentsPublishViewController.m diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index 588d53eb..b075be44 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -369,6 +369,9 @@ E81366F826F0C12A0076364C /* LoginFullInfoProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E81366F726F0C0F60076364C /* LoginFullInfoProtocol.h */; }; E81366FC26F0D2980076364C /* UIButton+EnlargeTouchArea.m in Sources */ = {isa = PBXBuildFile; fileRef = E81366FA26F0D2980076364C /* UIButton+EnlargeTouchArea.m */; }; E816C11527608A7500C84014 /* XPRoomMiniManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E816C11427608A7500C84014 /* XPRoomMiniManager.m */; }; + E818E348286ECA4B005EDF68 /* XPMonentsPublishViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E818E347286ECA4B005EDF68 /* XPMonentsPublishViewController.m */; }; + E818E34B286ECABF005EDF68 /* XPMonentsPublishPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E818E34A286ECABF005EDF68 /* XPMonentsPublishPresenter.m */; }; + E818E34F286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E818E34E286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.m */; }; E81A652B2834E4F600F55894 /* XPMonentsAttentionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E81A652A2834E4F600F55894 /* XPMonentsAttentionViewController.m */; }; E81A65312834E53600F55894 /* XPMonentsLatestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E81A65302834E53600F55894 /* XPMonentsLatestViewController.m */; }; E81A65342834E58A00F55894 /* XPMonentsLatestPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E81A65332834E58A00F55894 /* XPMonentsLatestPresenter.m */; }; @@ -1698,6 +1701,13 @@ E81366FB26F0D2980076364C /* UIButton+EnlargeTouchArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+EnlargeTouchArea.h"; sourceTree = ""; }; E816C11327608A7500C84014 /* XPRoomMiniManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomMiniManager.h; sourceTree = ""; }; E816C11427608A7500C84014 /* XPRoomMiniManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPRoomMiniManager.m; sourceTree = ""; }; + E818E346286ECA4B005EDF68 /* XPMonentsPublishViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsPublishViewController.h; sourceTree = ""; }; + E818E347286ECA4B005EDF68 /* XPMonentsPublishViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMonentsPublishViewController.m; sourceTree = ""; }; + E818E349286ECABF005EDF68 /* XPMonentsPublishPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsPublishPresenter.h; sourceTree = ""; }; + E818E34A286ECABF005EDF68 /* XPMonentsPublishPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMonentsPublishPresenter.m; sourceTree = ""; }; + E818E34C286ECAD8005EDF68 /* XPMonentsPublishProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsPublishProtocol.h; sourceTree = ""; }; + E818E34D286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsPublishCollectionViewCell.h; sourceTree = ""; }; + E818E34E286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMonentsPublishCollectionViewCell.m; sourceTree = ""; }; E81A65292834E4F600F55894 /* XPMonentsAttentionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsAttentionViewController.h; sourceTree = ""; }; E81A652A2834E4F600F55894 /* XPMonentsAttentionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPMonentsAttentionViewController.m; sourceTree = ""; }; E81A652F2834E53600F55894 /* XPMonentsLatestViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMonentsLatestViewController.h; sourceTree = ""; }; @@ -4914,6 +4924,7 @@ E81A65392834E60A00F55894 /* XPMonentsAttentionProtocol.h */, E81A65432835121000F55894 /* XPMonentsInteractiveProtocol.h */, E8541036286443D8005CFD9F /* XPMonentsDetailProtocol.h */, + E818E34C286ECAD8005EDF68 /* XPMonentsPublishProtocol.h */, ); path = Protocol; sourceTree = ""; @@ -4933,6 +4944,8 @@ E81A65412835120200F55894 /* XPMonentsInteractivePresenter.m */, E85410332864155A005CFD9F /* XPMonentDetailPresenter.h */, E85410342864155A005CFD9F /* XPMonentDetailPresenter.m */, + E818E349286ECABF005EDF68 /* XPMonentsPublishPresenter.h */, + E818E34A286ECABF005EDF68 /* XPMonentsPublishPresenter.m */, ); path = Presenter; sourceTree = ""; @@ -4954,6 +4967,8 @@ E81A653E283511BE00F55894 /* XPMonentsInteractiveViewController.m */, E852D739286317F0001465ED /* XPMonentsDetailViewController.h */, E852D73A286317F0001465ED /* XPMonentsDetailViewController.m */, + E818E346286ECA4B005EDF68 /* XPMonentsPublishViewController.h */, + E818E347286ECA4B005EDF68 /* XPMonentsPublishViewController.m */, ); path = View; sourceTree = ""; @@ -7110,6 +7125,8 @@ E852D7402863249F001465ED /* XPMonentsReplyTableViewCell.m */, E854103728646A00005CFD9F /* XPMonentsReplyMoreTableViewCell.h */, E854103828646A00005CFD9F /* XPMonentsReplyMoreTableViewCell.m */, + E818E34D286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.h */, + E818E34E286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.m */, ); path = Cell; sourceTree = ""; @@ -8504,6 +8521,7 @@ E82E75062828E76400C25EF7 /* XPCoreDataManager.m in Sources */, 9B8DE0E4289CF7AA00FB6EC2 /* XPRoomGiftCompoundView.m in Sources */, 1808072D2731598F001FD836 /* XPNetImageYYLabel.m in Sources */, + E818E348286ECA4B005EDF68 /* XPMonentsPublishViewController.m in Sources */, E800806827FD3B520055A8AB /* XPClanMenuView.m in Sources */, E896EFAF2771AF0F00AD2CC1 /* XPMineFriendEmptyTableViewCell.m in Sources */, E8E859E928264F4500EE4857 /* XPRoomTransferMusicViewController.m in Sources */, @@ -8517,6 +8535,7 @@ E8D4824D278D2CE4003C1D08 /* XPAcrossRoomPKInviteResultView.m in Sources */, 9BD8D4E628911F7700AE03FF /* XPMineCollectRoomListPresenter.m in Sources */, E866B6E52759F96F009B002A /* XPMiniRoomView.m in Sources */, + E818E34B286ECABF005EDF68 /* XPMonentsPublishPresenter.m in Sources */, 9B7B605B27BB53060070BB72 /* XPAnchorAudienceUpMicView.m in Sources */, E8B825BF26E9E57D009E8E9F /* LoginTicketInfo.m in Sources */, E8E5E18E27C3331E00F457D8 /* XPHomeRecommendViewController.m in Sources */, @@ -8553,6 +8572,7 @@ E878B85E283640A500E22DCF /* MonentsUnReadModel.m in Sources */, E81366FC26F0D2980076364C /* UIButton+EnlargeTouchArea.m in Sources */, E824546426F5FF1C00BE8163 /* XPMineResetPayPasswordPresenter.m in Sources */, + E818E34F286EDF72005EDF68 /* XPMonentsPublishCollectionViewCell.m in Sources */, E877A7EE278428FB00EFACED /* MicroDatingProgressView.m in Sources */, E8E0DAE9285C2E8C00566A2F /* FindNewGreetMessageModel.m in Sources */, E8C6FFE32754F349004DC9F0 /* XPSearchListTableViewCell.m in Sources */, diff --git a/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/Contents.json b/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/Contents.json new file mode 100644 index 00000000..5d8076e0 --- /dev/null +++ b/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "monents_publish@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "monents_publish@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@2x.png b/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4496b51f85c72fe1de3c5ff3562604d9b2dc2cf GIT binary patch literal 11077 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 LNkvXXu0mjfjO+?= literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@3x.png b/xplan-ios/Assets.xcassets/Monents/monents_publish.imageset/monents_publish@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..000f93db739efd8388193d7b1128c1f5a97eb4c2 GIT binary patch literal 23180 zcmV)3K+C_0P)PyA07*naRCr$PeF?Z`MRo12|6aQ3h89tfC?Y74S#XGn(=!l_Q6dmEXh0)~Qy|aG ziFq+mV?stVKjlTynD-KmF`9si#`p;$+Qi_1K-(gNAVZo##b84>_doT%+GnqQR_#;& z9q49Ge;?d?|Njhis#dMN_E2?_{P(}A2Xa1kPHtMaR=V5PN|)Ejmb^xC+C%1LUzsjE zMkMbcIqfczA0|2NCb`>5B=0C)S}i%R?k|?N$TV*ek=v!q-;+*mk|a0CG~X!FZ4!|y zq)V4emp92|dYjCzx=n78&GPisn^XG0^uLE>=z;V=?+gXx^*cOLWV*j3*;l%>w{-F- zndC>wLib2XX?Mwat>l8c@;~}ne(&@Pk*@qG|FeJkceejh|DAr_>EZo%vRQJvQBuA} zruk}F$XAQxtE9`9i%h>JPkZP!4|KpjAOV{5v8&|9H9sib!t*4{GbGDilDh{<&O1wz zRgxtsfE;fHOa`(RKvNb`-c!&GfK}kyx#eQz7zZ&xU9M}#bzPQDwuN^l#V#(*84kP z@3#QW`OWik?WKpv-2Brdbx##ZPnFy~S|m?;P}0yUV2m#Dxqd`{z$_QG)I;q%#V~;h zGN3Z?Z1xKXmjEavgR-x&GMKo_o#gIH$2tDHE>1_Bvv7X|>-`R(YQAq; z^Bl?fWRZNBbh4YIyqa{M=|~JGBhs~D|K$jvrXfjcR$wdUn@zj}taP)PcxBFxKn)Ww zA`9hnYlEIk?HK^tGkY$2A#IT^-6T0*D0y<4?6dnP?r$>SegRMg<+pa;L$*$jl1V;A zBp;;aTb~ZP&;SWWVtgtC&T@co4Fi&!ZMq)JH5?#jK$v#?)cY8VDgaGF6ucGSDV8Az z49sA2{)x#@&M(*Oa+WS{kWSt%GWoD$e;C%H!E!Ws6A|I6LFqj7) z7DmJ%hy6}$l(-+()81-Hc(41elT5kTYS4x&&lRVv1giU!F z4d_M;GJ8J_CrLFL5Kzu_daZv)_=v#*ty+MnvVhJ9yTR_774Jsy#~-0F$nqSK6oN8l&sPkOk@FT9NLL~xSU1bF)j)&Nk>BmrOu7qKpN zGtZ6_VxAOHPzD8qlWbro3KNt88t)xLRt2cJE7bgPnM{6DcKF_gd#lHPuLEc<;i2nZ zwx6t?oG4jN5HWM^`Y;GZXQvrDlq2#{3OEA=r;42woUem!AVRE?+r(yD0T|fJy?JwF zAPqozYLY1^UoompLV&fL*cRt#%C#J;66bo!lfRWa@_Xc@3ocEm zN@3jN%zEzw=(k?}Jn8aVC8zx=bKU}|f)i$Z834txt^%MriG>wcDDD6t$(eC^5OVbe zpsIIG4?^C;WP^G6ZjJK+Nb*=`4=R-fMw5C!I7tRjy|+CZ^8c6!o-m*g z*fcFjmoJq``jvFT1s}V|QCZu^d%ii!nzx+%U|HCFisby;B6&_Tk^sXj_H;81{Rvbs zXi5LMS8vC;`3^Ec%_bNPu}M2d+hqSKOWM6EfU@o+hb^)s16qL_LRZR^nlUn9;=aoO zDCCBkbDB(rIhldWCG~H8kg25fCfQ-fx64b<`wj%mJ&BNe1%u{IFF#b~(r-!5M@yDf z?G6EBly337nrzxb7V5}Z8J z_gFjf%`g8+$?_+X<&h#X85B@7*)!su+HwZ0{q6yAo`V$hR#3LIrwwKqNU)_l9U*23 zIiL;@XN}F}94d}7AmhZ*0hI~v zsC6<)*GQiHaysdPf4axOK_h#&w;_M$B@CZ3-`C)Z}l@`ti!;jhw5FZ%Y~4w8Ecp!wS;?jsBN_eHuFilo}4 zFAC6xBNQ2w&+om|pU8F~<@G zrWyHn&e2<20A@`Hpq>=zQ)HBQB9J47;%S}`_zb`m*(%fgA(^KCl}`ThH|}nb-t8JR z-*n;uBHg%1aEDd@UvG0x-`6QGc-3gtLP)CvB=P5W^ny)7)HMj6qmK~=Boe4#rCflkp^$9Q>pDP-sk%@k z{i?k7%b&bEg8FwkKy!ZcL~g#~7|GqAOO{714bFyj2i+os#JUhMOZLdi?>N>!r_7E% zHRs2n=RiN?_~@agQ&CV16N>nxnp#XMcD5+=<6b%G2#yYb=~(yrIZ+aD37@f|9t#Gw z3nRYC;VO2pJnm|3_q;zeGt56_#`>|iTJq!<~d-{cVHBl~QO+WElp5vSe^> zP{@pQsCw!I2Gy_T;J9XFU20wp92p0?r7zKckOT5I1Z$O!jzN9~50K5y z6f-SVLiz2uh{NvVOORa<62lS@%HasA1Jn*S)0tpvc-rnX5mUoiLlVK`swNS9xid4O zwN`LiQ zUNQnU1YkL&#A!`vas?8{TM-Mj&lXTSFax0MXj+qdM~;E5e_Sn-^s4kT7ysL`E#wLg zyh{M8-ulAA--}4YA!>n;TO5&0j>`zp01~krE`<(8u-?HJfDe!(Eacjh9kKX3+K5mL z#Z4LH%4k88!dZet#W6?^i;)Kokc|LJx)%)E*L&6lC2ADN8FD>J4jkl#2K6B&Vm6GN zC4WYbh+HV${7cjS-2UGEb_b}&Ij48LTf{<1j=k2c%%rxw^O1?Bj;k(Ju2E7!4bR@S zCo>{@r0kH{fW!)W2Rt(pfWYUI;{uRGZ`)ZZvYTnc5v!Iqk%PoxCYA&YP|O|AK$&KM zbWj$wYXYp$m8?(UK&cFgnXk&sTLdAkmz+*Yue)fw#!0s;K=buKwU5kA-Ya=I;G~g{ zX4_ef&3?n=0|*tUSSc_YQ?R;XS?g?G8iE1$O&VxG;Iz1dW*5`*iCLo#bUA9E!<EXP-AMaE+!@J1qMa%UZ2Ax2G|+Vf)?nS0Hr{_ulofiyErWcyuf!r>v!q?fhZMKK5OEQ=mRhK88j!EM)ey~r$E8i!1fu}d%fhU{$gyrCmqX&42%{>1&j zmhhJCUd)&d!WKZu0b_uoeK@zYrwTXO{nh-#nM9jNj<~s};v4kYPz|+JB%PX0x#TTN zP}8!$UM`9jy;#2C_+v%7_ehqtJq~Oc!g89RWo>jI7^#8VVX<2{zRLKJKJN%SzmhSiDijN0d{f#cn?8UOO0vM z2-1)YQf(`e62zcjTQfL=qZcP((EWoI*eo)4Vmjrb4=e`)iygB~0M%IM4aYrBa{jPL z$Pz8*$_fT*o)MvTNcpbPh3t?tz~vGZKntF?vxvz7R|PakXo`nYqAqMOr30Bu)rb+@ zTW2uP>;p^t#N<#8MF22KlvFi0+PBuTMHXL$^}$bQPCqt;iZJQ)x~^Bu@j;X#Og0?L zQb+rrR=cKjwRGtyIpyMuwxu$EIWU?DaMhh#x_3yGp zanO&I|J3l(J^KT;j$tE?lj7R!^cd4&GP&*|z+$%$XIXP-@HdB(SnoznS;>kpK|IvN z;VWp_0x;X4jI&+3{5U)l;gEJBspF;qG*297Y%p>|);P(ePO^MR(%fsdMUQS9KyP@- z8)PbP9CT-S0-GqD~KDspxBZ9>iBUv{XeEP_k!@ z=Lu5nERAs}Oda*7>1(W1#UxKMm7I=}lQ(?)&ZI-{96+xkvS3yju_=p~_lm z*KCly!wb_XUs>^XJ1a(%?)b53QkDk)iti{FucDw0q)u3>$j<@EK#T@~W~)yI3WHRD zCcO%9dM+LSgd;Wh8p8_`K=|QU|C0dYW}eI+cthNRy26WPtwJdLyhsv8) zx`WBe0ebCEJwfKCAJq-K7<7cMo*eAbv+h7-RmJ035%{?z5B#14vQgl?6$J<#tk*{A z7@Q9LO)MT6m>nE;z7%B4N*El-3IGlO2a*9;)Q*DH$n0vgBRD&r76r&qo<|eZ`^6#* zSjVsD+6?eYCUdf?>mrguQUsm{WhPbY8qQly{7{$3G4bAH}x z`Olp{C?Y?O`&Zhsb+x4cs^iDb6jdEDK)Hr;aE@&Ktf%mrxHt5 zlK`UwMk=XFY=TS7?(x|MQ?pb6OZg@Z03Ay12-Gb`Q@pV(qQ3BqQ7k|q2MxLrTkFKO zDMLdhP`@x(^<&{>*gHn*mItm>fGrbS-vlTq|*CiU&8`qYRR^i(-(N16VGh&q>}j z=dXRfSZBCrj`*QXh;j?w5d>@QeG43P497uB+em(34wd`+_BYh`s99AjLTjOLX$7P? zKAfn41BGXFN8T7dYEw9by(OB;B>jAP^;h4vTozq6Kyz`7QvO#-viERtLLqzIepNFO zt+c0SF+x+hMGR^%8Z2XVoDGaO2WBp$?P9M0pl-H_8NuuTG&)|*I+;f|iNta+{jL?s z8S{H_hzZxD*$w~!sH}mZEiqT%;m-mn7?zn9nv?saOfn=-&`#F4dTau7V_%6TG^@z3LZNIvNOILk*5r;{qyIB!M zzI4+2>QLXsB%9)msgFcFaW-hLevw~)4_ zruWNF2vFX&X398|1?S4g6vxnbxIqY-Kgsp7Dj%Ls*m&turhb_KJ^IfiO@3h%JHl#5 z{KVasbyb^f00KKor9-s_IWS&5Glpk_Uh>%!bOM{lnBVvQ*k zO(10=%uImXJ_A4z0`Xn(;FE==86Jy;BZPtz=yGcW3XzSFePVKkh_`C=NdY;;p)CTs zj}MgrI(x_QiN~d2U9=*S$^zV|>E<+mAE(@W&SZN)w;_VCQ zZ9JnFi?HK^2jeI5b?tDR8lfb=z6}K8lHBoZ70Nxei5yxnaPiJ|6)W0+`oLMrF|xP6 z3ehG2VYt5^n^J2ySk>dGwD8T-nypL_#W=lS1%To8`V?Pv_GBid-|@Y!<)=96$l3%) z)+ZTB!kllB$*Lb(N{cSZb$QcI{EbZWiC#ii8fhym`tT61K@aQRmYN>UxSW#*d)es0 zRFz|k6HoyjfV9}5Itj+i5cfO*V9EhNBFFkXM;e)VGp!g5_j2jjQ7)e1h-#X_uyziS z%1}?rwV;qR_FQa&^>=g*O6F*ZbCnv!b;x<-_^wA2h{fHB#iX&$LM+w$mn{W_UI6Cu zQ%RwE*nXTQ={@Nc8(y&(Ocn)bzV0WUBwcr=WO+mnMmn5<67K-bsN;YK2)6=An7t}? zB#j8u-Ew?zc^spEQ&t1l1QS)&D^z-h&k^ZyuM`~%r^Wu}H@!JS5QF<9Kt_g5Ju#>| z6>(_?g}xXp7;xx2$PHy+L<1=IkLL!-M@B}!VUJM%o7&47-ClJ%y#EP(UG9xK4A%V( zsW!-#>ts%jPA6`h`LeN@0L_;iyGnMs{f#2>ddcLuGx#cCQhKvut>x0F9oIDZ(J`}w zTw(y_UPTiexf!0hr@}CLq{m#N*}ZIU*kNG6YABN6YN`NAZYO{rWb#l;Ng(%CnlQ7- zcyTg-bRV2L*W|Q74ih1!Tv_T==TWjiy9eMm5JEP%%rF_m@(9n!*(oO*eTD^@OMfV9 z(_3bxKxYH=+GEN))IT9v4(QFQ9SW+B8z8h&n={C>f~=cl`_z|o5Jj_@kCUQw+ynt- zXdeocy9J^SwprzixsiN^pzo8!s?mOFj^oZe$!{)Q6?%SJI<*RIyt`h!AakP|NH z*x}0?MRs^jI_ctXwy112K(9Wkyp;8Awg1y70;vvQ2@o_#ygOM=kDYOA@Q}Wxw+$|v zbYA#YI>EnlRQ7juGgpap(?P5Up|ik_FzfJe*^#k9oa`d9=7}N?`eBhBYxTF5Se~wpnp8GJ5MUatPrY%j?B4oFn}FxhI+ggn=Zh41MrE(o%P5nAiALX)b_sD zdB<{sKvp``3!ZsxJ=WUO7;|W^(zg^5@fu;aXi9!Rn@;#@S#UY}*92((`tw%H>iI8- zK9k0@`E%Qz?rxD-p0@Mw?!~ zSpb-BFlePc!$ea@CloOQs0Bhs4@%#cX1g5`Tpq0+?HUm?pVHa++!m&lIki7hkV z2Iw_MJzu(fX4R$TNK~#vvZ2>u9yos<2V^utq$|-1N=199iLb*cJ}w6EExciVDA??p z)+UV0O=BNz7q1;BM)AxF0^0yXkrlg$>~V_7j^8gbS!H$GxPQ5Jd7H*ok|rvQK#@5<7&Xo1qJc`(6lQFteRRxYxu|^qDjeC5R+htJD(+weE2cx zh;vHqsQ()S^vWY2FO%*glBK*CbJ!cxK^9H{a2+4SVh++KQByOV<_4V6M-}scQD=pm zSdjBIVDh3?jUl2cd_!RFfjFHG~of9vx^DB;z%WF%yM8;h*JqNEg396|-nlNT=##0&oGq$Xpa@0D(9u z;pQ|ObG}yQ=ANHky5Y-<1N0luJw>GZQ<1dVy>~_V#7fP`jOhWmNpPUJ4J~$Uak-n{ zFgTbf0EZJ5W(BQDay=9%S`Q^QP@uBu36z#M(Xc5DW_vZ&S=9%6BJuA3Jcyb9Nxb+X2ROMQ$(Dln}>N_Y%_@_7yb0F2l%1!k0X zP;tQ7M8Y$`e0r=B&rhB>!dCd{34`cNA`=uN8D!SIMuOV`21We>z{-QfI8ea;oy?_^ z(~CFU3Pjfcz4E#H$fWzEWZ8F^VVaV{i$~2&k+;q!e#Df`+w>ns{l$m+ETapuxvuUL zObuT+Mh2Q@lr$f*GORiAJN8O|7ToV0z5a9!TB;D8+WYZunu%u z$f69RnbPIbJVOLx+QciCH{$obOs3dJ{2MpDna< zfMU%I(8^L#!)P7{PU~b&j!DN3-h2S)v)>_|yt=MhB9QtrcRJ0rN4QmWV_k(Yh1NtErT~=Jo{)2MlK=o907*naR3G@R z-n`H4C^DJv|MPV!Mb{O8E{IHT7b#}`!V|67g;=yW{%BJS(c!+l77O#v+fSh~1qKjn zGaFF~1n8@xYG!-L3659V_f_nb8I{jx2?ge)^1WGO(Sk)z?@Y&i^)+lz`z|WWiLbc% z3Ynzdd-v2PAG*kLVm86fz6Pj(-Tv~{ItIrgIIc87W$wX}Sd&BXMfd301kh|p3K0_p zx)=Hr%XrH`tAk`Qz!C^K_}wc5=$B6@E4li|m@{X@S(GMK#enoVuK_|k!F=T~#6n>` zoakWYsaUxmaGx8#0vF3mFn-?8?5yEKc985d)GIJ#blxW+0T&a^jt*_oFlymp$nBP{s6K3jU1L%?9(p=z}QbV^|&Vo?eQGYlvRN=^i}Xc z8FW?V%Hn^xrVbzii2GG)58X=~=KpCJM(u2W0imrIuwHK5$$c zpjq|I0t@iBN&p-st z9uIesGX%ZOIeQ&|u(OHg(g#<O9s>GJpMe&>X_GOr@to9;>}Y{VydTT6p)+mld~(F72H%ISufI~! zhu7eeHpMZsih4YhN%vG#rgLTCkRM4e{(wevC13F)dy8~uOHPmWP>2WN(UDvTf({9+ z%A8zbhycv+)MF@wReeYDfmzfiEtWJ>+|VoPnT=@Dcu5>1-U_ifv{as5D}D?R?i>+= zK5nG|{pp@L0nG9{%$@@iH36jEeO*266<@_2iRsuGQP!ggiei$g)G$l}!dA8Xq>K^L zp00(7?Uj(r$wB|arn7Z$i{>m+M+5p}uN0XakzVxGs|=vee2#STUYW>4d)6h50rqt8 zaU<}66awsR{SZQFf|fKWW*LsdbC1}1glzhN7?iK)tiZe9(G7HUC6WN-p_W5bdt%F( z0!$0lz?(m`0F>jP1$m8BXNiH9|Gxb49+2)RAs%WINcA->ji{K@j=^VTBC3v~wqtV# zXm^yh#nf%JR-HSUW2NPDdIfl~D3BGdGr`_=LkB5aLt+-!pdbgDJOJ=8L2i~L$EO!; z{6r7X%m2s8lGC3_%Bwy0*(yM;Fk*x5EWi&7#$?uwmYqy8;nmFsIx+$^0$KmI!Sy0) zr&)}Ce{=0*b^?Nv$EFbbwPRCQ%_8Bo*&=f2{}q`xfR;3;hM9Aiyubq}ue_pofRGH*o)AzUQfFotc%oveE ztfcHt%&LFWH6k|k9(Fxt1zLFL=F3b5YsTRL`YU>*V8)v}IOM{?cuZoy9?fPrM&&26 zNBS;zGo=f*mCRxP&opS6(^k#Ixp;jwwpBBgIOrE&IsjB1q#}yv`^95N14@QP&*?uu6;aY?+nrw1?JEMqmwK7K2t& zu-*yrM##X>MCegHPzD3l+0)XAszGU6LuF4h{pIK5|4w957_@+Mk$TYS9U|QpkuM%+ zptN``09u;ksZVPJ7Zh{+6V1mnyYt}>V%7O!(47E?HJMd?!5oN!&Ak;0IqlOf}Y z@gM+)Kevu;u>WurKpPmm>M-(rY!h4585iPf4 zn_cu<`LBR;YoAH_!cSR{9so5@UMISlwo;FYK8A$8&QUzGBdhwmc` z3+ISr+Z3$f;IPhMJZT{SHBNsGz^jx2&oKLXYzaGU@-m`rClvr5o~)iq$AZQ>#V;2A$u%TtXkGDIAS;Z1ZM4g}h$6i58zvFWR1 zP7Y7`(x)6KA{U6HwZpMIBTPTQOu(#qDIV!h;Lou`AmY@iwl^$Ot{ToW0!$ek1vU2^ z`?Q;T;2HiAeLiR$(!gK}I2#6Zn7z^zWzOKmKly`Js7$4HRXu0{ot4}bCO!X!y$6r% z5kTq;ig1y6#h5($oaD7@bEyQ+H=;$KTA$z;cOcFBxg*0e0M86_95gD|j>37>@E1tN z&SS@pvEb?K1}Rklt!gSZOP>FMl)w6n!(}o(yC$ke%+s0D?(A&2#7*_Wv!+dC-(YsV zQ4DlCX2k6Hz}SbzzoX@V*ObL;s?*@J$HAI!jcaKr#VW+qhEjY zz@Qv%(sbX@3@-@g=twcW2)wgtbp3CAjEV1Mc6dZs2S~Ia6EGPXDyTBu`n{z^*;_~Z z*=m8%!1nsH5u$Vx4=F&w|1^I@%3pu_D4Hf-{#=PR*Kz^`VxF;oF%(VOLTO?T4Ir+lPe z$vIcTOXWo;r625is)x&srXo`dH+}Z`#-PTc#nk&8VZcxk0=#_q6VTbP1aPLxeF5N+ zC89A^oElg$-sNv~NJ-0HeXc2Ll>?q_JEg2%mjKRN#e*6|HUj-9%oM^4Fhs zs&pj>k0+zn#n6$OBfEJ891INIQ9GY?6mxzEGcj{7QuWPP-MPbb5b8w;k8hf=wPrhSM1UNfDAl_S-vBk?H0_mzZQ~&dt*`{aiEil z+Cd!QSxg6h`n{AlKIL>txvWPB=xY4!v(tX5W^45a5ohCbolG-6kF$zrl$*E43{`e9 zs_{HD=ZfvZ%nX>_PAWDb5MC77!g3#f7Z|JlwwTv{;_7F zLgIwH zUB}Hez<}fcNd$DBn)|DHgkUgSR@pV#+jbMm`Z8!uSTAK`LSh9_&Z3c3bO}YktiTM03_#STG9hrL z%cPg4W--3_jIQGmAS5!- zc3|%(1uXO_05D1s&2Cr({dBX)?bnFh_z96)){88BtDh7aX$kV73Z`SGVWya@aI3~r zh~*Iz0GdfzKnAE!asW4&2xnNXdnL=<6V&-BfAt5xE+XIGvmS?xXr}PBN2WR4xMGsf z*E1ynPth4tf!WjJeU!7t_p2T&@{r?2c6_X@Suc5Vb7It)39;Lma6mhF!Wl@R#r|!%q8Dm$G-CifMW?$M+p@f18Fm2s>6)sx> z5Y@2&cH`&BYB2a1oM6;ScQm#-Z?y}I3prDw1H}Qe#d!+SuZw*1ts-}PyT3r`D~*2H zpg98v0jdCHv2UFX*#)@;>jkY3DW_I}CIgHD7l<&i>2<*Lp$-F0>yQ7>lrMQ=u?xG_ z;hadvU{{JkI#b%id0dQ`C-$>nmgB5ZBSAXQvYh@qANn#}lA(>qQ_&G)zAVehPep%4u{> z$H8t|fJ;CfLYv=C`I0AmPf{)-jo{QUvwnS^Z8OZ}==6pR0M!rFJzg%&=AZ>qEYd2+ zl}`D--xb;6`-TDz0Q7!u;*s;eLuAYKBA5N@5M%Wy0kL}NuTeON7}}8lRz&E|01BM) z__%KXUy=LrwVuk z*xAAmn5%%VdEFZGBVk=UZ69R~tf80E7%aW;*D>^3$Ey;JxEvu`5aCToK4dU`8{WSOp#?J51T z=U)sJMkT|;X-EYZyzoV2h|fJ9L3r(!&P3%Bu8F`lL!`j zULS;M$`>8>JxS6Ris*!~fzcn#B;jv(e!g^+&m(q>jT_ND>;=w8C(*rwPtng_O79`- z^YGshncua}k!zLF+)xg;tONl|7YZpUAgyZ2vq;Mf)a#DMRzTtbd;)2ef}Bb11F#kB zmZjpH{~g~Fx#IPM_ADmemy>Whnk^x$lX*7)CSxd?^CbZqO*fH?{<;i+CfS_w#fSAy z5(CsdDY}Wyl99NqXE_J&!N&X`+~(>Ym4L|9YiXCATgHFgb3}G|o&gl$ zB?FYR-E!izU=9G)Kv<H5n_b(YdQWlj{4SS%7A@R9?@8WOuPqhhLD*LE_w=_4ZF z`e<+2O1@va(Y6;?^J?R$V}&f1jjPvtlJufssHTkr)_wtrIFFSN5RMACVYc@8CIc2^ zmA;+w#fMzizv2*$B$2B?N4Xt)@?bq{a+Q~-nc^(mcuEE+`if13XSD2zy#uV+7UWaf z2L?^MiahMKBJ+C~NR9DSvT!hbTnlnM1m#1Aoc=r&7fsSDq z=SXO-RQ#7Z`&K#XIu6&T{FQ^gE|R~$*BViqMH5eEK4Pu{X=}y=;I{@Mn*UfwsGu}q zjtyG1Zqqt;IuTjDugF7=6`6mS?P-csq@jOVaZt=)=vFHT!5&Qd6Al>GBP~&Gr`7ew za=M@{f^;df2kB!o6&hCSK0A>+ZV=h@4KC4dC(ui+~RqCU~eem0F%O-SIe@i$j(0`@}Q@SOp3f_=O{ABjG3Z?7EHSW z(>AQtwMe`k30l;G(5f@3U|H8DnWqhaDw~q2U&_q8X(VT<+br^(&xm~Ye37C*l{u}i z7?}87!%n3S$h;%4&Q_LxS7|`rIbn3Pf`Yq~@q)So5KM(cOcpLAQLvm}81xL0d~_eE z4J;QmB^)ST@5E-g8f$#P*R-dusK4ro!BML^3o{m)lN=<@D5ki+&0Y|#eGD%@5uVbr8XYWx9f5d5Z@2?_2JPv)iYE6^1-J|>R#Em6Cnk> zZP>-CIb9?Hs=|QClyqEakT0qVU~rS(h>2BZ2Q!QGZTVHnCon2LLp_9ojR4Ke%)hgl zVlC!b78^Td>?HETSd)Z3>X%qF_vvG4aUAr#%><7T@_d0=jJl3eie3!`kYZCZ>zs0l zvV#eO+(SvUi-{gieHp+jLF#c>yGfqBE9Hw0I90mz z8@&LxAa;`#DF?0hv#G&x(9tYl&%Ys{@zE$v8ln(Yt{7gt9m9ZR(1Ha$+ho1&X*=#j z)dd54AX4Bz4dnQ{T;rMVU)i$bb6?yuC>$63&V3NcoV!ear*xnO;E~ESnpak(%^w^) zoF_NJ@K@eYHN66k(w68VvSDj-L^24K3;QXN9XMxhd<`aU8 zZ>&yK$B%OGF|$X8&^`Q7lR}?Wl~LA4&f7ES`BXOT10G(L@|O-cT)KSr$hT?5JYzVC zb>ax1G*dw7{j8|h-u#~YJ-ByDeN=?T)2mxLQm%)q74afTRs=zC;%8Btvb`L9nHHhL$=BBgM~p? zuzA?|#|?WgsVSz3=~@ytlwy!zRUR9xkVCZ+a_#6J?{YG&04};489?;4N<1z?XMGXP zGOd}aoGgl?R#uV0OnC5@bI`#$7CMnOOPc&ZVbFafcjt)6-keIV!0LFwu6I;$5Ts>~ z(Uv_Y@YftVc()^Vt){Z!pBa#B5Ey{D_E0qjHFo1+|L@#100 zF@otFP)9nFC%L7irXZ-$G<)rQ)!Ae^m<0jC zrb@66AtTV?9?zsn1Jk7Uq=ANYtH4WfSeSAJCC5+;gW9tewt3PAR%YTaD3$)CJvFFa z_G+RK5$~2Ta#F(#=l=0MlF*T4!udMNuz?jZ#^sq%VUPZeGQjUirF0HZ3q7`+YuCnX zISH&jDII57a{eQE!XaigvfiM1C4Y{EuEAN#2&4z9+?K(!ND1T+q$nF!qc6eWTrM`?aRQX#6UIC_!h zPdhKfcU`}(C7K#>~1yCBO_%hi7(88d_q+^dzjfH}->~rr9 zLI9kUn8b()4WuvC3ea`AkE%f+Ey?}m{T!TSJ~v`A0;eJ^J9q@xNLn^-6FFB7IpjxD zve(e)$N#bSsUrC|1_q5~Y2hZ$rZ$Kp@Wt2}dDG6W&{M&zH5s|lBWMFm2%8etp15DE z6k>p~*()8QdX^odqDKv!1t^dIrG3e}R?UQsA+$3~X&T;kT($r&Z}}hwMYVg`xe;LV;tv#d(Bd|2 zFJ;Mik9w8>$U1p{mW6uM=gznw8~e#wyQnF(eb#q+KF3o-L5S*73fk)=2)Tam`$qg* z4^LTAdS*H}z6$Y@gI39{-@QVT>^a0inMK*tW;Sbqj$09DW)4?~>> zbK>A*J4~}$L1dLe)gg8*7XG8Bwnqh1c&Zfpf+D;`Y+3;NIOO6{4;q$ylxq1>L0^^u z7Y6;xaRyLxl3a(HiAO#jOER2Uc`^pZs4YU$k_C>b{9ECeMY8#csIpFr9RFC zRa^swC*GID$TUZsZChy9Qv!LF=b6Ym(?N~baqHp#zUT8L$r-xlqXjlBJgaK>W>WRg zEN(|@vJsKh=EQoyu;?2QFymq%S$`5)R-RdJLWYis+6gR*H|?QP3b9X*g%*H@w|w}@ zPMa*c+=Jfo@s;C6=Iv!&x&vLdzl}|maV*qS+OJsQ1#RdH3bT0+g9NCf@tFR+0Jljs z-~58duNC5IWEH*tF}Yj*3JXwlITys!IJkE&olNAIbl}F1RFLrTT))pgGIz%(MP%P5 zgU&J)m~9pD((G*BZ8WXMxAgO39(fUzN6iFA_0SnHw40w`8r76RI~4{s?THv@@!}s> z-jh_=v;2qspNO%2*N?6J?sFHHcXc8TYHQUsvxEX;18A%|iirg1yjJ%)J_945yHKl8 z{&uotXErigW8fV4+yEZ<#=Y6c;7i6~OzCpjnxCDXu<;vhfS$ek&a!6JX_E5G2HM9A zV-p`}-{YMad^RggXAN+~j)vvYfI68U1lX%^2$^}mj-d`A88EEx^GO|8nIk(-r2+vG z&Jx}Ev|qhFfQHT0Z{~r%0AR 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 literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/Contents.json b/xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/Contents.json new file mode 100644 index 00000000..8bee35df --- /dev/null +++ b/xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "monents_publish_album_delete@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "monents_publish_album_delete@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/monents_publish_album_delete@2x.png b/xplan-ios/Assets.xcassets/Monents/monents_publish_album_delete.imageset/monents_publish_album_delete@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..934db9e4e58754c506e279f655c42047a6fca07e GIT binary patch literal 915 zcmV;E18n?>P)h}zU9BDF|@ z+LZ`d2}Xr31Xotn#?%w%`DS>I@6Ee!re|K5)tsO2opaB*_a32yrK($j-M~(u9;gP^ z_@;gXlfW0?9q>j(Mw7Y`R|Qoy$0vYez!q0MUv3O|2;3JD1CL#?V5(XHoCG?7jjy; z0)kO+WkQ*UKV^Z1ZS-Q*n&9I-uur9Q{3xixf{5yKF_2y=6L0=7C`+GJWmvVA0OxJ~ z+rS~$Fh@aIORyEyN)p0(?IKZwHOCVZ6Z!8b+~{EiQCC;z^|A!ZYp~YCN;;CFs;>~P zva*u)_Vxr^WD+0ZBO@aW4GmFSTT63ub7V(1xZok)(9qxtws44>w5oOh7hN?|mb)S% zJvlIYWv_&b;&-4ae^K>0CyC)whXUvdxhJG;89_oiw#w>z>O4#Dwe+UB4RK9B`a8Qfg});l_m68iyMEqibmw63b_faCtCb8|w#&;F?Mfr$Kc(T$B* pm=XWr-vjK384eEtuS*#Y{{q^4@3#;vV3g*JhffLkC&AAA9YXkx@AMvX@FMKmTx6Zb@` z;YZplE6l*94 zegs|yHXCF9%6HtnKw4|30S&-?z(x5^9;4qEz!N~PG3M78{hX$;L0W4s1y%!B0aM~m zn4tadKqv6JG3L`aM=1lGfTAfF~yb zKo7z?W6UP~#{ucy#W&m_ce3F861YxLiw9D7QBLp7d=U-}4Y70QP6h@Bm^W`8jg5`W zoSEBj)>_oRx3`!5`}Z?v&K#PWnsV+RvgX4ICX6v37}xOM3*45(v+3yQ;NZc7&V0rg zs;a7JZf<7QEcy1)GB`Lmx zxW`361#tQDXXDJVzjQ;gY zCUwIosy>yKl`L7ZB&pKzPydua%Avg?4UigRWMqV`Tel)0LDa3Qt7F%$U4ayxJ$tsJ zY^F|ChBGyJS0Ls7oR`{=${4%mB#62tB_$j^IyN<c;^Nx~e4losUN$@kKZ zA)^d^X=$lLUB7vW>+8k@|8?qiGMk~VudjEajcg7>OdwIs9Xpwd$CJ$$^=r{=4nvTy zn*g-q@ucFr%GvJj?snoyzle%+=gwu(qD9P@q36rv66G)`Oq1`LYdjjU0i(WaDp5#R zR~P&C$r_Cn8G4xsKR`dwFkiQ(rpD=)P!xr%^y0}Ef#xIw2E~)2sN%^fQ^KDy!>F5f zJgH)a#F>H4&Q2$F;n}|+iiT}s5OsBuOP4N9vhOD{0~*Czn>fd#c(SLb$GMXN*wD}r zNYSuWtG}X?0|yRJU0v152-U9U{~WX`)PQ}?EGeZ1rUUu4i- z+Dd1?RH)D^#(hfCH2f{ZcQ+^ZtCkD24p81lWn&XfFt>(6IC;?-mTl2oHYY3ZS{zu>W`I46VCF*5NLTYJPkR~g0C0Y`NmBTI5AfK3R=Mn7u(kFy;9B=&&n!R< zdY}7ty2%*xXTF=2*GUFYSSKqQHv$*CUlUZtw6C&v{qENUp94L>?tE&_bMkod-LZ`C zLeBDi7jiZr&`Q@yf&Bp}a@T9^_wIKgdR;5XcOm}*#v#J@m9m(Q00000NkvXXu0mjf DYtt8t literal 0 HcmV?d00001 diff --git a/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.h b/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.h new file mode 100644 index 00000000..3bfd817c --- /dev/null +++ b/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.h @@ -0,0 +1,16 @@ +// +// XPMonentsPublishPresenter.h +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import "BaseMvpPresenter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMonentsPublishPresenter : BaseMvpPresenter + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.m b/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.m new file mode 100644 index 00000000..68b62af4 --- /dev/null +++ b/xplan-ios/Main/Monents/Presenter/XPMonentsPublishPresenter.m @@ -0,0 +1,12 @@ +// +// XPMonentsPublishPresenter.m +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import "XPMonentsPublishPresenter.h" + +@implementation XPMonentsPublishPresenter + +@end diff --git a/xplan-ios/Main/Monents/Protocol/XPMonentsPublishProtocol.h b/xplan-ios/Main/Monents/Protocol/XPMonentsPublishProtocol.h new file mode 100644 index 00000000..a11231ae --- /dev/null +++ b/xplan-ios/Main/Monents/Protocol/XPMonentsPublishProtocol.h @@ -0,0 +1,16 @@ +// +// XPMonentsPublishProtocol.h +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol XPMonentsPublishProtocol + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.h b/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.h new file mode 100644 index 00000000..2bd56462 --- /dev/null +++ b/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.h @@ -0,0 +1,28 @@ +// +// XPMonentsPublishCollectionViewCell.h +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class XPMonentsPublishCollectionViewCell; + +@protocol XPMonentsPublishCollectionViewCellDelegate + +- (void)XPMonentsPublishCollectionViewCell:(XPMonentsPublishCollectionViewCell *)view didDeleteItem:(UIImage *)image; + +@end + +@interface XPMonentsPublishCollectionViewCell : UICollectionViewCell +///设置图片 +@property (nonatomic,strong) UIImage *image; +///是否展示删除 +@property (nonatomic,assign) BOOL isShowDelete; +///代理 +@property (nonatomic,weak) id delegate; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.m b/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.m new file mode 100644 index 00000000..f29b5acc --- /dev/null +++ b/xplan-ios/Main/Monents/View/Cell/XPMonentsPublishCollectionViewCell.m @@ -0,0 +1,92 @@ +// +// XPMonentsPublishCollectionViewCell.m +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import "XPMonentsPublishCollectionViewCell.h" +///Third +#import + +@interface XPMonentsPublishCollectionViewCell () +///显示图片 +@property (nonatomic,strong) UIImageView *logoImageView; +///删除 +@property (nonatomic,strong) UIButton *deleteButton; +@end + + +@implementation XPMonentsPublishCollectionViewCell + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + [self.contentView addSubview:self.logoImageView]; + [self.contentView addSubview:self.deleteButton]; +} + +- (void)initSubViewConstraints { + [self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.contentView); + }]; + + [self.deleteButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(20, 20)); + make.right.top.mas_equalTo(self.contentView); + }]; +} + +#pragma mark - Event Response +- (void)deleteButtonAction:(UIButton *)sender { + if (self.delegate && [self.delegate respondsToSelector:@selector(XPMonentsPublishCollectionViewCell:didDeleteItem:)]) { + [self.delegate XPMonentsPublishCollectionViewCell:self didDeleteItem:self.image]; + } +} + +#pragma mark - Getters And Setters +- (void)setImage:(UIImage *)image { + _image = image; + if (_image) { + self.logoImageView.image = _image; + } +} + +- (void)setIsShowDelete:(BOOL)isShowDelete { + _isShowDelete = isShowDelete; + self.deleteButton.hidden = !_isShowDelete; +} + +- (UIImageView *)logoImageView { + if (!_logoImageView) { + _logoImageView = [[UIImageView alloc] init]; + _logoImageView.userInteractionEnabled = YES; + _logoImageView.layer.masksToBounds = YES; + _logoImageView.layer.cornerRadius = 10; + _logoImageView.contentMode = UIViewContentModeScaleAspectFill; + _logoImageView.layer.masksToBounds = YES; + } + return _logoImageView; +} + +- (UIButton *)deleteButton { + if (!_deleteButton) { + _deleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_deleteButton setImage:[UIImage imageNamed:@"monents_publish_album_delete"] forState:UIControlStateNormal]; + [_deleteButton setImage:[UIImage imageNamed:@"monents_publish_album_delete"] forState:UIControlStateSelected]; + [_deleteButton addTarget:self action:@selector(deleteButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _deleteButton; +} + +@end diff --git a/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.h b/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.h new file mode 100644 index 00000000..56112745 --- /dev/null +++ b/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.h @@ -0,0 +1,16 @@ +// +// XPMonentsPublishViewController.h +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XPMonentsPublishViewController : MvpViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.m b/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.m new file mode 100644 index 00000000..7eebb4f2 --- /dev/null +++ b/xplan-ios/Main/Monents/View/XPMonentsPublishViewController.m @@ -0,0 +1,578 @@ +// +// XPMonentsPublishViewController.m +// xplan-ios +// +// Created by 冯硕 on 2022/7/1. +// + +#import "XPMonentsPublishViewController.h" +///Third +#import +#import +#import +///Tool +#import "XPMacro.h" +#import "ThemeColor.h" +#import "UIImage+Utils.h" +#import "Api+Mine.h" +#import "UploadImage.h" +#import "TTPopup.h" +///View +#import "XPMonentsPublishCollectionViewCell.h" + +#define itemWidth (KScreenWidth - 10 * 2 - 15 * 2) / 3.0 // item 宽度 + +@interface XPMonentsPublishViewController () +///显示内容 +@property (nonatomic,strong) UIView * contentView; +///导航栏 +@property (nonatomic,strong) UIView * navView; +///返回按钮 +@property (nonatomic,strong) UIButton *backButton; +///显示文本 +@property (nonatomic,strong) UILabel *titleLabel; +///发布按钮 +@property (nonatomic,strong) UIButton *publishButton; +///显示文本 +@property (nonatomic, strong) SZTextView *textView; +///限制文字 +@property (nonatomic,strong) UILabel *limitLabel; +///分割线 +@property (nonatomic,strong) UIView * lineView; +///列表 +@property (nonatomic,strong) UICollectionView *collectionView; +///话题的容器 +@property (nonatomic,strong) UIStackView *topicStackView; +///背景 +@property (nonatomic,strong) UIImageView *topicImageView; +///显示话题前面的# +@property (nonatomic,strong) UIImageView *iconImageView; +///显示话题 +@property (nonatomic,strong) UILabel *topicLabel; +///关闭选择的话题 +@property (nonatomic,strong) UIButton *closeTopicButton; +///添加 +@property (nonatomic,strong) UIButton *addButton; +///重新选择 +@property (nonatomic,strong) UIButton *againButton; +///话题的占位 +@property (nonatomic,strong) UIView * topicPlaceView; +///描述 +@property (nonatomic,strong) UILabel *descriptionLabel; +///是否已经编辑过了 +@property (nonatomic,assign) BOOL isEdited; +///添加 +@property (nonatomic,strong) UIImage *addPicImage; +///数据源 +@property (nonatomic,strong) NSMutableArray *datasource; +///图片的源 +@property (nonatomic,strong) NSMutableArray *originAssets; +///图片的上传链接 +@property (nonatomic,strong) NSMutableArray *imageUrls; +///上传的个数 +@property (nonatomic,assign) int imageCount; +@end + +@implementation XPMonentsPublishViewController + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self initSubViews]; + [self initSubViewConstraints]; +} + +#pragma mark - Private Method +- (void)initSubViews { + [self.view addSubview:self.navView]; + [self.view addSubview:self.contentView]; + + [self.contentView addSubview:self.textView]; + [self.contentView addSubview:self.limitLabel]; + [self.contentView addSubview:self.lineView]; + [self.contentView addSubview:self.collectionView]; + [self.contentView addSubview:self.topicStackView]; + [self.contentView addSubview:self.descriptionLabel]; + + [self.navView addSubview:self.backButton]; + [self.navView addSubview:self.titleLabel]; + [self.navView addSubview:self.publishButton]; + + [self.topicStackView addArrangedSubview:self.addButton]; + [self.topicStackView addArrangedSubview:self.topicImageView]; + [self.topicStackView addArrangedSubview:self.topicPlaceView]; + [self.topicStackView addArrangedSubview:self.againButton]; + + [self.topicImageView addSubview:self.iconImageView]; + [self.topicImageView addSubview:self.topicLabel]; + [self.topicImageView addSubview:self.closeTopicButton]; + + [self.datasource addObject:self.addPicImage]; + self.topicImageView.hidden = YES; + self.againButton.hidden = YES; +} + +- (void)initSubViewConstraints { + [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self.view); + make.height.mas_equalTo(kNavigationHeight); + }]; + + [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.view).mas_offset(10); + make.top.mas_equalTo(statusbarHeight); + make.height.width.mas_equalTo(44); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.navView); + make.centerY.mas_equalTo(self.backButton); + }]; + + [self.publishButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(self.view).offset(-15); + make.centerY.mas_equalTo(self.titleLabel); + }]; + + [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.view); + make.top.mas_equalTo(self.navView.mas_bottom); + make.bottom.mas_equalTo(self.view); + }]; + + + [self.textView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(15); + make.top.mas_equalTo(self.contentView).offset(10); + make.height.mas_equalTo(150); + }]; + + [self.limitLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.textView.mas_bottom).offset(5); + make.right.mas_equalTo(self.textView); + }]; + + [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.limitLabel.mas_bottom).offset(10); + make.left.right.mas_equalTo(self.textView); + make.height.mas_equalTo(1); + }]; + + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(15); + make.top.mas_equalTo(self.lineView.mas_bottom).offset(10); + make.height.mas_equalTo(itemWidth); + }]; + + [self.topicStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.contentView).inset(15); + make.top.mas_equalTo(self.collectionView.mas_bottom).offset(15); + make.height.mas_equalTo(20); + }]; + + [self.topicImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.mas_equalTo(self.topicLabel.mas_right).offset(9); + }]; + + [self.addButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(80); + }]; + + [self.againButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(80); + }]; + + [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.topicImageView).offset(9); + make.size.mas_equalTo(CGSizeMake(16, 16)); + make.centerY.mas_equalTo(self.topicImageView); + }]; + + [self.topicLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.iconImageView.mas_right).offset(4); + make.centerY.mas_equalTo(self.topicImageView); + }]; + + [self.descriptionLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.mas_equalTo(self.view).inset(20); + make.bottom.mas_equalTo(self.view).offset(-25); + }]; +} + +- (void)uploadAlbumPicList:(NSArray *)array { + dispatch_semaphore_t semaphore = dispatch_semaphore_create(1); + dispatch_queue_t queue = dispatch_get_global_queue(0, 0); + dispatch_async(queue, ^{ + for (UIImage * image in array) { + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + [Api qiniuUpLoadImage:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + NSString *key = data.data[@"key"]; + NSString *token = data.data[@"token"]; + [UploadImage uploadImage:image named:key token:token success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + dispatch_semaphore_signal(semaphore); + self.imageCount ++; + NSString *url = resp[@"path"]; + [self.imageUrls addObject:url]; + if (self.imageCount == array.count) { + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@"上传成功%@", self.imageUrls); + }); + } + + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + self.imageCount ++; + dispatch_semaphore_signal(semaphore); + }]; + } else { + self.imageCount ++; + dispatch_semaphore_signal(semaphore); + } + }]; + } + }); +} + +#pragma mark - UITextViewDelegate +- (void)textViewDidChange:(UITextView *)textView { + if (textView.text.length > 500) { + [self showErrorToast:@"最多只能输入 500 个字符哦"]; + textView.text = [textView.text substringToIndex:500]; + } + self.limitLabel.text = [NSString stringWithFormat:@"%lu/%ld",((unsigned long)textView.text.length), (long)500]; + self.isEdited = textView.text.length > 0; +} + +#pragma mark - UICollectionViewDelegate And UICollectionViewDatasource +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.datasource.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + XPMonentsPublishCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPMonentsPublishCollectionViewCell class]) forIndexPath:indexPath]; + UIImage * image = [self.datasource objectAtIndex:indexPath.row]; + if (indexPath.row == (self.datasource.count -1)) { + cell.isShowDelete = self.datasource.count == 9; + } else { + cell.isShowDelete = YES; + } + cell.image = image; + cell.delegate = self; + return cell; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + [collectionView deselectItemAtIndexPath:indexPath animated:YES]; + if (indexPath.row == 0 && self.datasource.count != 9) { + TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:self]; + imagePickerVc.modalPresentationStyle = UIModalPresentationOverFullScreen; + imagePickerVc.allowPickingVideo = NO; + imagePickerVc.allowTakeVideo = NO; + imagePickerVc.maxImagesCount = 9; + imagePickerVc.naviBgColor = [ThemeColor appCellBackgroundColor]; + imagePickerVc.naviTitleColor = [ThemeColor mainTextColor]; + imagePickerVc.barItemTextColor = [ThemeColor mainTextColor]; + imagePickerVc.selectedAssets = self.originAssets; + [self presentViewController:imagePickerVc animated:YES completion:nil]; + } +} + +#pragma mark - XPMonentsPublishCollectionViewCellDelegate +- (void)XPMonentsPublishCollectionViewCell:(XPMonentsPublishCollectionViewCell *)view didDeleteItem:(UIImage *)image { + [TTPopup alertWithMessage:@"确认删除吗?" confirmHandler:^{ + + } cancelHandler:^{ + + }]; + + if (self.datasource.count > 1) { + self.isEdited = YES; + } else { + self.isEdited = NO; + } +} + +#pragma mark - TZImagePickerControllerDelegate +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray *)infos { + [self.datasource removeAllObjects]; + [self.originAssets removeAllObjects]; + [self.datasource addObjectsFromArray:photos]; + [self.originAssets addObjectsFromArray:assets]; + if (self.datasource.count >= 9) { + if ([self.datasource containsObject:self.addPicImage]) { + [self.datasource removeObject:self.addPicImage]; + } + } else { + if (![self.datasource containsObject:self.addPicImage]) { + [self.datasource addObject:self.addPicImage]; + } + } + + int page = (int)self.datasource.count / 3; + int scale = self.datasource.count % 3; + CGFloat height; + if (scale == 0) { + height = (itemWidth + 10) * page; + } else { + height = (itemWidth + 10) * (page + 1); + } + + [self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(height); + }]; + [self.collectionView reloadData]; + if (self.datasource.count > 1) { + self.isEdited = YES; + } else { + self.isEdited = NO; + } + NSArray * array; + if (self.datasource.count < 9 && self.datasource.count > 1) { + array = [self.datasource subarrayWithRange:NSMakeRange(0, self.datasource.count - 1)]; + } + + [self uploadAlbumPicList:array]; +} + +#pragma mark - Event Response +- (void)backButtonAction:(UIButton *)sender { + if (self.isEdited) { + TTAlertConfig * config = [[TTAlertConfig alloc] init]; + config.title = @"提示"; + config.message = @"还没有发布哎~确定要返回吗?"; + config.confirmButtonConfig.title = @"手滑了"; + config.cancelButtonConfig.title = @"确认返回"; + [TTPopup alertWithConfig:config confirmHandler:^{ + + } cancelHandler:^{ + [self.navigationController popViewControllerAnimated:YES]; + }]; + } else { + [self.navigationController popViewControllerAnimated:YES]; + } +} + +- (void)addTopicButtonAction:(UIButton *)sender { + +} + +- (void)publicButtonAction:(UIButton *)sender { + +} + +#pragma mark - Getters And Setters +- (UIView *)navView { + if (!_navView) { + _navView = [[UIView alloc] init]; + _navView.backgroundColor = [UIColor clearColor]; + } + return _navView; +} + +- (UIButton *)backButton { + if (!_backButton) { + _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_backButton setImage:[UIImage imageNamed:@"common_nav_back"] forState:UIControlStateNormal]; + [_backButton setImage:[UIImage imageNamed:@"common_nav_back"] forState:UIControlStateSelected]; + [_backButton addTarget:self action:@selector(backButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _backButton; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.font = [UIFont systemFontOfSize:17]; + _titleLabel.textColor = [ThemeColor mainTextColor]; + _titleLabel.text = @"发布动态"; + _titleLabel.textAlignment = NSTextAlignmentCenter; + } + return _titleLabel; +} + +- (UIButton *)publishButton { + if (!_publishButton) { + _publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_publishButton setTitle:@"发布" forState:UIControlStateNormal]; + [_publishButton setTitleColor:[ThemeColor appMainColor] forState:UIControlStateNormal]; + _publishButton.titleLabel.font = [UIFont systemFontOfSize:17]; + [_publishButton addTarget:self action:@selector(publicButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _publishButton; +} + +- (UIView *)contentView { + if (!_contentView) { + _contentView = [[UIView alloc] init]; + _contentView.backgroundColor = [UIColor clearColor]; + } + return _contentView; +} + +- (UIImageView *)topicImageView { + if (!_topicImageView) { + _topicImageView = [[UIImageView alloc] init]; + _topicImageView.userInteractionEnabled = YES; + _topicImageView.image = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xFFFCDD), UIColorFromRGB(0xDFF9FF), UIColorFromRGB(0xF4E5FF)] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)]; + _topicImageView.layer.masksToBounds = YES; + _topicImageView.layer.cornerRadius = 13; + } + return _topicImageView; +} + +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; + flowLayout.minimumInteritemSpacing = 10; + flowLayout.minimumLineSpacing = 10; + flowLayout.sectionInset = UIEdgeInsetsZero; + flowLayout.itemSize = CGSizeMake(itemWidth, itemWidth); + UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:flowLayout]; + collectionView.delegate = self; + collectionView.dataSource = self; + collectionView.backgroundColor = [UIColor clearColor]; + [collectionView registerClass:XPMonentsPublishCollectionViewCell.class forCellWithReuseIdentifier:NSStringFromClass([XPMonentsPublishCollectionViewCell class])]; + _collectionView = collectionView; + } + return _collectionView; +} + + +- (SZTextView *)textView { + if (!_textView) { + _textView = [[SZTextView alloc] init]; + _textView.textColor = [ThemeColor mainTextColor]; + _textView.font = [UIFont systemFontOfSize:15]; + _textView.placeholder = @"记录你此刻生活,分享给有趣的人看..."; + _textView.placeholderTextColor = [ThemeColor secondTextColor]; + _textView.backgroundColor = [UIColor clearColor]; + _textView.delegate = self; + } + return _textView; +} + +- (UILabel *)limitLabel { + if (!_limitLabel) { + _limitLabel = [[UILabel alloc] init]; + _limitLabel.text = @"0/500"; + _limitLabel.textColor = [ThemeColor mainTextColor]; + _limitLabel.font = [UIFont systemFontOfSize:12]; + _limitLabel.textAlignment = NSTextAlignmentRight; + } + return _limitLabel; +} + +- (UIView *)lineView { + if (!_lineView) { + _lineView = [[UIView alloc] init]; + _lineView.backgroundColor = [ThemeColor dividerColor]; + } + return _lineView; +} + +- (UIStackView *)topicStackView { + if (!_topicStackView) { + _topicStackView = [[UIStackView alloc] init]; + _topicStackView.axis = UILayoutConstraintAxisHorizontal; + _topicStackView.distribution = UIStackViewDistributionFill; + _topicStackView.alignment = UIStackViewAlignmentFill; + _topicStackView.spacing = 10; + } + return _topicStackView; +} + +- (UIButton *)addButton { + if (!_addButton) { + _addButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_addButton setTitle:@"添加话题" forState:UIControlStateNormal]; + [_addButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _addButton.titleLabel.font = [UIFont systemFontOfSize:12]; + [_addButton setBackgroundImage:[UIImage gradientColorImageFromColors:@[[ThemeColor confirmButtonGradientStartColor], [ThemeColor confirmButtonGradientEndColor]] gradientType:GradientTypeLeftToRight imgSize:CGSizeMake(10, 10)] forState:UIControlStateNormal]; + _addButton.layer.masksToBounds = YES; + _addButton.layer.cornerRadius = 10; + [_addButton addTarget:self action:@selector(addTopicButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _addButton; +} + +- (UIButton *)againButton { + if (!_againButton) { + _againButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_againButton setTitle:@"重新选择" forState:UIControlStateNormal]; + [_againButton setTitleColor:[ThemeColor mainTextColor] forState:UIControlStateNormal]; + _againButton.titleLabel.font = [UIFont systemFontOfSize:12]; + [_againButton addTarget:self action:@selector(addTopicButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _againButton; +} + +- (UIView *)topicPlaceView { + if (!_topicPlaceView) { + _topicPlaceView = [[UIView alloc] init]; + _topicPlaceView.backgroundColor = [UIColor clearColor]; + } + return _topicPlaceView; +} + +- (UIImageView *)iconImageView { + if (!_iconImageView) { + _iconImageView = [[UIImageView alloc] init]; + _iconImageView.userInteractionEnabled = YES; + _iconImageView.image = [UIImage imageNamed:@"monents_info_topic_icon"]; + } + return _iconImageView; +} + +- (UILabel *)topicLabel { + if (!_topicLabel) { + _topicLabel = [[UILabel alloc] init]; + _topicLabel.font = [UIFont systemFontOfSize:10 weight:UIFontWeightBold]; + _topicLabel.textColor = [ThemeColor mainTextColor]; + } + return _topicLabel; +} + +- (UILabel *)descriptionLabel { + if (!_descriptionLabel) { + _descriptionLabel = [[UILabel alloc] init]; + _descriptionLabel.text = @"禁止出现商业广告、微信号码、QQ号码、电话号码, 以及低俗、色情、恐怖、暴力和具有侮辱性语言等内容,违规者封号处理 !"; + _descriptionLabel.font = [UIFont systemFontOfSize:11]; + _descriptionLabel.textColor = [ThemeColor secondTextColor]; + _descriptionLabel.numberOfLines = 0; + } + return _descriptionLabel; +} + +- (NSMutableArray *)datasource { + if (!_datasource) { + _datasource = [NSMutableArray array]; + } + return _datasource; +} + +- (UIImage *)addPicImage { + if (!_addPicImage) { + _addPicImage = [UIImage imageNamed:@"mine_user_info_album_add"]; + } + return _addPicImage; +} + +- (NSMutableArray *)originAssets { + if (!_originAssets) { + _originAssets = [NSMutableArray array]; + } + return _originAssets; +} + +- (NSMutableArray *)imageUrls { + if (!_imageUrls) { + _imageUrls = [NSMutableArray array]; + } + return _imageUrls; +} + +@end diff --git a/xplan-ios/Main/Monents/View/XPMonentsViewController.m b/xplan-ios/Main/Monents/View/XPMonentsViewController.m index da37bf12..691a0724 100644 --- a/xplan-ios/Main/Monents/View/XPMonentsViewController.m +++ b/xplan-ios/Main/Monents/View/XPMonentsViewController.m @@ -22,6 +22,7 @@ #import "XPMonentsAttentionViewController.h" #import "XPMonentsLatestViewController.h" #import "XPMonentsInteractiveViewController.h" +#import "XPMonentsPublishViewController.h" @interface XPMonentsViewController () ///标题 @@ -35,6 +36,8 @@ ///滑块 @property (nonatomic,strong) JXCategoryTitleView *titleView; @property (nonatomic, strong) JXCategoryListContainerView *listContainerView; +///发布的按钮 +@property (nonatomic,strong) UIButton *publishButton; @end @implementation XPMonentsViewController @@ -58,6 +61,7 @@ - (void)initSubViews { [self.view addSubview:self.navView]; [self.view addSubview:self.listContainerView]; + [self.view addSubview:self.publishButton]; [self.navView addSubview:self.titleView]; [self.navView addSubview:self.messageButton]; @@ -92,6 +96,12 @@ make.left.right.bottom.mas_equalTo(self.view); make.top.mas_equalTo(self.navView.mas_bottom); }]; + + [self.publishButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(45, 45)); + make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight - 30); + make.right.mas_equalTo(self.view).offset(-15); + }]; } #pragma mark - JXCategoryListContainerViewDelegate @@ -114,10 +124,6 @@ return nil; } -- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { - -} - #pragma mark -NIMSystemNotificationManagerDelegate - (void)onReceiveCustomSystemNotification:(NIMCustomSystemNotification *)notification { if (notification.receiverType == NIMSessionTypeP2P) { @@ -141,6 +147,11 @@ [self.navigationController pushViewController:messageVC animated:YES]; } +- (void)publishButtonAction:(UIButton *)sender { + XPMonentsPublishViewController * publishVC = [[XPMonentsPublishViewController alloc] init]; + [self.navigationController pushViewController:publishVC animated:YES]; +} + #pragma mark - Getters And Setters - (JXCategoryListContainerView *)listContainerView { if (!_listContainerView) { @@ -210,4 +221,14 @@ return _dotView; } +- (UIButton *)publishButton { + if (!_publishButton) { + _publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_publishButton setImage:[UIImage imageNamed:@"monents_publish"] forState:UIControlStateNormal]; + [_publishButton setImage:[UIImage imageNamed:@"monents_publish"] forState:UIControlStateSelected]; + [_publishButton addTarget:self action:@selector(publishButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _publishButton; +} + @end