From 56f4326ceb9a3c960f74a2ea19c676141cd95f63 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Fri, 15 Mar 2024 18:34:45 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[Fix]=20#262=20-=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B2=84=20=EB=A7=B5=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EA=B2=BD?= =?UTF-8?q?=ED=97=98=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runnect-iOS/.swiftlint.yml | 1 + .../Global/Literal/ImageLiterals.swift | 3 +- .../Contents.json | 0 .../point 1.png | Bin .../point 1@2x.png | Bin .../point 1@3x.png | Bin .../Contents.json | 23 ++++ .../Group 9581.png | Bin 0 -> 2764 bytes .../Group 9581@2x.png | Bin 0 -> 6554 bytes .../Group 9581@3x.png | Bin 0 -> 11127 bytes .../UIComponents/MapView/RNMapView.swift | 112 +++++++++++------- 11 files changed, 97 insertions(+), 42 deletions(-) rename Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/{ic_location_overlay.imageset => ic_location_overlay_direction.imageset}/Contents.json (100%) rename Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/{ic_location_overlay.imageset => ic_location_overlay_direction.imageset}/point 1.png (100%) rename Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/{ic_location_overlay.imageset => ic_location_overlay_direction.imageset}/point 1@2x.png (100%) rename Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/{ic_location_overlay.imageset => ic_location_overlay_direction.imageset}/point 1@3x.png (100%) create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Contents.json create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581@2x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581@3x.png diff --git a/Runnect-iOS/.swiftlint.yml b/Runnect-iOS/.swiftlint.yml index bbe4a629..a1bc6612 100644 --- a/Runnect-iOS/.swiftlint.yml +++ b/Runnect-iOS/.swiftlint.yml @@ -14,5 +14,6 @@ excluded: # AppDelegate, SceneDelegate file 무시 - Runnect-iOS/Global/Supports/AppDelegate.swift - Runnect-iOS/Global/Supports/SceneDelegate.swift + - Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift force_cast: warning diff --git a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift index 9c926c77..6cf8c1ff 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift @@ -40,7 +40,8 @@ enum ImageLiterals { static var icTime: UIImage { .load(named: "ic_time") } static var icLocationPoint: UIImage { .load(named: "ic_location_point") } static var icAlert: UIImage { .load(named: "ic_alert") } - static var icLocationOverlay: UIImage { .load(named: "ic_location_overlay") } + static var icLocationOverlayDirection: UIImage { .load(named: "ic_location_overlay_direction") } + static var icLocationOverlayNormal: UIImage { .load(named: "ic_location_overlay_normal") } static var icLogoCircle: UIImage { .load(named: "ic_logo_circle") } static var icMore: UIImage { .load(named: "ic_more") } static var icPlus: UIImage { .load(named: "ic_plus") } diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/Contents.json similarity index 100% rename from Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/Contents.json rename to Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/Contents.json diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1.png similarity index 100% rename from Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1.png rename to Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1.png diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1@2x.png similarity index 100% rename from Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1@2x.png rename to Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1@2x.png diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1@3x.png similarity index 100% rename from Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay.imageset/point 1@3x.png rename to Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_direction.imageset/point 1@3x.png diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Contents.json new file mode 100644 index 00000000..c7f7c9a6 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 9581.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 9581@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 9581@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581.png new file mode 100644 index 0000000000000000000000000000000000000000..a33a4259a802c985f24d1883f34ffed8211e27ce GIT binary patch literal 2764 zcmV;-3N!VIP)`XJ+?o$BFAWUv4E5wQ&;c6eT4Agi- zC=EZV6e?QLk~V-5h^lHLXh3RJ2rAe@*iqvq)bzuaU8jjZ?{;UV&pW$o@7a6nyGz=> z(t7u1XJ_8;ud$%30L7v$&?VZaC9M{gR${1w1Qp2ON8M;W<&`7Z;rsxVm zP=mlo>&w(F1a$(@PHGG$B+=lN5K}h+Da3mc4qHPOzXP%qlENtNQefEP34mu28j}1d zEoKPvtR-K_h5fBZL#mbf>m{Tv0`B{^-H}F|5j8}!p2R&ywk}B2Of0CH71Z~`2Sk7E zOVj}1`bu+&ZXwofw+of=1QSB}M98ec;yrfb`-waQ?`h+G8JFU>Y**I2B?LHw^=J=2 zzhB5FkR}4E`w_-%@th?Dn9Fo48!YR5y~xAD1z&Dq+}$M>?k2w1v!=sA&>Xwk*b`PK zfc2g@6@a%T-^b5$E{&zc8rxAMCW-Y9X=;n5NM*HeGACthYkthNQEEQq9K7#73ssj+Prq2!1ZyrBJe*%Gqb0<<7 zoK|_#V3luAOCgfLr8t|EpwLuDo{f<8JTzKbq-|fhM;^Rki~RiJd1E7n2Kvf0{${k) zrY#hfq^=Yq*eNM#$O@zo>L`pciu2_v;3n2eN^OSelHQ&MmQ7)9Nzi+EM0oCO&9 z0G|u1GmY+@KHc^Gl@)|s-$i$P`D#3bzZI*GouyrfcAOGVSNqVpKkal*ZRs}GeR8ij0&e-q``$-q=;0qv z)A&er?c;aP{%($Vm7bgCKc)6HV(Xj#moJWw$tmFA5-w52*(w-3-Z$g*s#`u&9F&Rr zh~*MAAkVI`9BA*;w~Gp$XXJYyt371&J~rbdHIEe5y8R1uH!Rs_+wyY0W$A#3$jP7z zWLYLDa#hd6K09Eeg+JfcBRV^;6Q4-lvA)-Xe42=Xl&ZD0Q%^^SX|o|4LVmD=1d0iz_9<2|5 zOmU((AjuDG6uXlV=6*GUtp)hov6RiMUvGO1mzEh3Fwe!PzMW_sD_dBv%X0ixGSFdp{DE>erk4_CX%1sHx=kg zfm4hGCNI%zd{3BFO#;r)8Mu3an?nehNM`&9qZES+6pqyPjo0+K!E;56<<$N6$HUX<_XiHQP@}+kQ5s(S zo9+h|hDFWw!m<*GT9dI#h-?XPp3ZJdDb5tFnHZ(XiE%qGg&uIR5h4y8UQxmQ;S2iA z%m3BmmOGMG8IJzdswGjuA#^3+vMGZ{bsq1iuc0g?jnGoh#}h zf{{OP=fZqm>**);GfK+9Q;L<=)d$szoOyLG(TH@VnWPc4E<{Q+6~L}kF;{#Qaw0V} zU`PAU=w~aC0ue_~tj@Iwes}NDwhH7K`u?F$4xP25Na{jl#Tt8h&`hl#+NJg;^H?SB1A-i!ILIZD zdhN9ms#eH!yZ?DfpL*iq@Gq*#D+8&(^OTmp)BQ~Shs`#b2wI_)1rDLG zHPT9##d2<7CHix$9_+lDaHsOfmq15-2JG%QPb3+@3taIxP)I#c~jxRMA-)xXy^HSkhU@yOSG69!aO1 zrISl(%K&a=W5qr30<$Kk$?N)}HmVmGB~~%ZskbRhc=TwJiz8r0REQYKEk#yo{I1IN z1o`-k0BU(U>$Ik7)iZAowGfd`x`cKPkn3p0I>SR;?V;y`P;U9zHOF**zF&d-BE7GP zfW<__Ho-*X*3O*2*c3rYL}gvArHSis7f_k_h$#>GWeIRZe9vx#vF=F@`P_+njm_VB z0m%B`POCfQW1Tnj&*D$TP~JDS9kbqz=5I3&KH>%d7eTJYCrHy(0FJQ8#a4)PmRW+% zKXet2S<{eKDF%+(@GvE9sZ8~QJGFOuo}}{3b>ujCDzg~s|5pP@1AN*Eecqgmaq)r8 zLl|hlQc1iGE!c}x(QY2MOe}L6De?Tj8pMdx>oidOt*DC`jsLR;6VimfD*Cigfz{Li zz|)L^)R9IIPoQA}(lAd zT-AC1&N=t4*IpZpgYgE*#(*iY2?Y`!YD0-=m13*VN-;KS)utpAwL&7zqcloN>8es+ zYJt$Ss1h_F5Pe{bl+em1Y74aR2bcu&vIUq&923^~5kJ?vJNKN^@AsX1XJ_urotZm3 zJG;PVjc4}Gy?5^YzVH0L=Q&r=9Ho&FKS0N62{~F~iH4M?g@l))0eLxo)sm)3{(h3b zJBD}9?}qpcnhw$s9UK`^lQaiO(HtRR_+eUMJuOq3hK1R^rGq}AgC?Q9bTW;yK#tKI zpjj1wF#Ra4azx8nqlc-Vq-j(;dULjgF)IQXxy27VM;G*+=|!Yyx3=`=$X#kT^_lu6 zfU358THPtUXhoLyO;}jgDgH#1@HUSZpU3C+RlE%^qcthb@9AfG@8tJjKlr#8NA6U+ zs87@v0o?k>el=^@g$;%?Pt0sKo)ypUk!Hr{nA|NvIEkYu))eyz#d9bB0`XGoI5dg!@LN`X2P=!`B``$b95i`8vsKVM= zp;;sdAW|#{qIpI8u=ljf46z_)z*zTO0Jq-a&t~u9(q?c2#MovH2a>pJ;970n}dwcQ%ga3O*_mY84W!N?0O;qft(|BRa2~o z7ejPnwxOmA(tPbFF^6=+Hy8~k(c`^x393V%@OBv zCfVOU{sF-HQY3*MMuMlohVK&EHu4>{gSw!u1W?3$=J*Ld;R*T>QxPO}D+FC~{{TBp zn9mx2{KL+CklZ7CbNTHqqDw};>Q_-oDkT6I+-8^$=JODpppOc9iDQoEH#0IlFNL|e<8-Dbo#{86U&rOBk=_>GwI;4&SfFP@>pU*?_qsaV>nhJrdb>Nj`e>*ux zCp#g+%`+bc_k-@^_kth@d-jal*n^e=u*Vyr2NCW}2U%bi7#F3CXWi0il}oB#T(AjD z#XF)?Wi=<9wD(3~KiSR#f*`8rNYnnc!s+QXgD1=z$@pdz?7=0ijw=*^Ku5kIp0dgNNcTj_*}tf(s(J(;a3uCtg{im$2N=rO25ZDj!B$F;YH3RHyg^9 zK0wusj0h+BuUhi70)?rf1ES(HiT2l?$SKu(+y{K5ADQu1Bq18?QMLl}3@ts)F8u80 z)TK*@^~weF>9nDRv{D(pFpAWI>Uk#U{qYIfck~dwz3+W`=cO0it2xqRq{AZ>j~*egqY{&4;Lm+Mi)LuCn5V z5y~c#jAt#iYIqq9U2~ne`qb0tyhSI`dDI1+I8N`pzLWmrl^5vMS6{a8OEI4zB94u` zW1mQb(_0~++{wSSsCHXXs-md?Zu^>FUyJ>WQxlFFgO08)E;WjR&E5(&3$6zUp=HbL zqN{(?{Mz!B{_0u{pDyhir6(T$zT5QLPQBMxtXC`q9${WbH-rhwI-*czk1i8n` z0G{N&FglWS6!by}7~y=cizbiCYUNSE*c)9RsJfU|=l82S z!N@oK3OCu1@0phNXIh^%PRT|aypx1q8@`}^`R6av*UvQL^TdYn__n9r-H$z@pLNPg zvlnauvn`B>4n~1i>@Iubi@$F&3L-9L{;e9V{#|!b6*{}_1U=AxXuYn9PNjQ|H6NOH zeR%QhZ~Thhc;-23L#O8&JLc(sw@lDGyAt{_ zzxIzhI({tN|Ik83rw(gcI&A3T%Li!nMKOQwJk$Qx8?@=(Z_~rXkp)J8iGsVT*+xv) zLu%>~olO6l8RMxq;BbATtVcg4(X^a1(SAK8fQ`>!T0paT-%iZPxF7Bs_84cJKY6m?IvNipvPD;2Q+ob%N1C707p?T+8a8vajz zb*v@hTM-0-7X$vl7vyNRor#i$CITK>d^ZjFOg>dF7wQkwR-6ALqgGNa5F{cw-538Uu#<`(0Fhv{@07FDwAvwtv7s?Pc z1sW5y-)i{{zL~YZp;|H@urrg)&j>l6denL3&!+|@LTxJBI0Oy-I8Hi zsHDb#Jk?a{+SNc&nGq1>QH67D;Jucqptak(#D8(u)KsBF0-NA|>hnI;I-B|6cY2HY z?Fcpj9##=y6#V)|z0L-NkRZ*aE_Jt#d0L04Kbm>3F%P$Pn~J*o3HZuM$R>)$cw{E&{8XuK_od(Jq;_)DWx{{;rGV;yv z(53hfg9QWjbLS~8pr{o^$8Fs-dyN&X4Dv~*(CX8MqamrXaa2&@`%+>&YK4Aj{9G(sB&j_Pn>{v0{Ua^)gM#hxW$kj4w z$P;x}S59YoP7&JyEz|y6?bHDY_NPS+pVe{sol|al>FMf>qT_bHF#B^hp4w8}SH>`O z1`7RBlU7rO{cd3>Zv$LJLptB}5O-l_kg&?!G^H8;b$}o5j5_6%V)&U&?av7LqavEW zK!QezjG57rYVgI_A4+dViZH=o^-jLCMbhBKsYG9GldQ#^=>!FVrp+Oh z)=p79k_{#dP0xMWrvIg2CKl6Kvj$N@TqS>ZaN-#dg#lw^%ng0{!S%OZE>`0|L1Cmx?E{96UgKGMKUHyGutz zWXfejK{~fGi^lXWb~@|Rf|g2gB^v?Su?dui<8e*Z?% z@$0`hpJt2Dwo*h#54m^Wcr`hw&?$tlo*D1N)3fqfcPE5;bV-5$>M)u!n5BU^5!^{# zQEwa~K6nb!?#HjuJya+F^zF>XD1i32>KS_JhyDr0BU@V9IsAgV?In`UQW3_NO+_@U zH8DsBH5N6k+eep=pdt#YFAxM+=U4!Y*P4@}{Ql@elTRj<;>jI<@XdvNjS28u=oM;3 z+n={@q?1y77URgsc2u2PP=?ap*m{vM@3pkZsd^Z4C1EJbaiHg3hJrM>S_}gzOzwY= zj_-WgK2>x)aCrR}`_~@&d4|1K*uVQN|J)lp{C?IT5dfNZW%(U=b}2rTZehEq802KsPsbR#o+*lk5Gh zA8!Bqw&f@Qt-pT3j0yqFUw?h;^S|;V`}nTc?0)8ei<#+$M}fh;_*}}RBr&7o+=kI~ zJJZRuyY9;{0y?$>)nc`=RsDbwf<;PgK6w?tCzkU;B$ibn9IwbtMQe9>@MEzdA|!{r6+`-*)Y^`=Ka+e%LO~ zuR|CDL6*Xtfo|ptV1d}&rs@)BQ<7Q48xPma>Sh>9Cl_>7IhV#GlH#=w(IX78h41V* zD6?wPVYWN^=aS72B+oASm|k-Jr_HanJ1=~7yih$u7sK=aHz}V{&a9uHVd#uihE|>v z(G_dwwM{eE(#t=zKlsl_CSNjqohUx)C|oo1z;Q*)4M5{{nA(b>45qo35JFT0KcKp+ zyzT4$s@gX7Zl>9y*Z{qrp!`zODYJ`giTVeDb=y zjSUBuOWLz)M7ZE61Y;gCfe9KFGvDKg%iH_{&VKif$*o%+sXS1b^nLHn!f!scwem2S z4~D}@V0^(Er_6AjphFO&H(-BYeq_ou?%cPovW7K_($`8f5DJCh5A585BZ;d_pZtVZ@uRC zv4u?{RtRynlX&s#~(4aUD!WJ8S>u zQ7}j)MnM)8$5F@y`Cto%B%9qVK7$e8xN+>Sw{NrmMKeg1iXVT8f8$#> zjotOuYjz(rUx$VhJeMGWlfW2*&uL=~`~PX$fh&EbnBPqMvG#O+zs86c#`vf_-9ipV zM*xR|^ZDXR*n({Cf4CNgBE{_ufAKgR?%NfAsm^ z9{iP+tJJ5dM+CUpvE4oM=tC1vAK0so^KaU~e9KB;xaRJY;41S-knFQ@?0P!!czF27 z!Ko-kI={3fYyZd{jSIXsU##P1zXr=N)^6hqINGU4lub{?XUssC{CT>Rj4V~cki=4n zl1Y|@hnJwD434l~3cDKStaJ5}3obQhU;2v!zp!XAolafQ{=M|pyFX6ee)PfQX^zCl z4C6dW9vPE>J&(e`d=rGgDH9_$V1P%fW!r_4BfPq-=+r66lRFfLw>4C>!fv6jmbV4z zRLdjOA;A_vgJh~|I!^%QJP1L;;>u*ie;U@bsKPb@Q38bHEQ_8?PA)V%YPNoQ6$|6S z%i^<6U!jISw$yxl{*Yh7uIJ+HxA-^4Cnx;)p#%QCV~730pYHLaPi;+J-8X7az@?N` zzH}thZsF$(&O0`^?3=|=%*1MNkdgT^0c@v_1pyeGb&8FX+zJj z`*>B&Ng{$h=y0Jvx#%=Skyr}x0Ov+cx+)2bo9uu>2kV<;9&Jc`G2|f?z+P+u9Mx~W z=Jvh$`ow{7;wI}`gzF7t@zWZ)de446B3Yyo_{GDD@m`n=2!fBS;{?BgDu@~|f%zt6 za$&zrTt4WMrSEfj|7O^qQOjtBN5Pd?@hSV;OMZurl$pX*T^Got%M?_?+%YeSYAY*W zY0-T6ft5(H{$V6oTY>3D5Y1o#kCyL4J85}THfsjcl7_{b;wN3$l;`GxJh0I zZZB`J5$C2b05gr3^`YQ4Q^@&b{(e-Q@6fsSH-#Q2PiK0%=$MviXFX2a+ znRegt%ILTOR(2MG5k~RNdNFV;1P<2hKs>;P&T_hfT~#LuFxMLy}I| z21pqe5j6`6&0eqttmUEg9i|bNk=U?&B}w5S)F9+BDWQ;pR0v#2bkc^uc`SvbniE?f zDF%2uA&m}q86&hS+|Mu2M8$@;{;&>+g>Wff_3GToO9g14+GQxS6%b`Eu`oF-$|ubB zlj+Ea@#n4doKWPWbjPGgLQdII;~>LVgU`>oTGnkE-A4Ix-n+mR|TleW2wjUZvFct5UUtBZih&Nhv? zP1+_xp@pzI(o_%z-c2^v{ZwJ4=gcR8p2x~OSEh8`uV7I>SxKF`Sj-#DOV<_hG9pZh zi#Ba$P2JZlvYvAH!+(gf0UhYh6Jfc~xxk4(ieppN_U!lKc=}6JwqSng=gD+ccx{%d zNH3tYVXiyACVGYt#A~YIxU13pOfU`euF_6z*nl($tZI9Co3&x^;cO6Ar3I(D`8}0i*=`~;0m*K93t?#R7h{u0>xPtG^>^O{UJUX z6~Ym`Ba-CZGzWWY%9xz4$mLBJE#sY#M7RjD=F(%VG7`hA=t^qx6us#}(wrc6Gv&!i zy2<1U$KK9tKFBR2aZv{gA7$8=(a>vRLmLa$H|r8C>1wv3o^?OTxVE0WW~bJnOF_E* zs9pO#;AWCu?AEt0Lw%j9-l-rmfwKQi0kf)Ii9N4X-C9%wK@vv|Iwm(hHdVZ}~OAFHFOIhYrpahUe-30TJ>X3uxlBx&QzG M07*qoM6N<$f~+99F#rGn literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_location_overlay_normal.imageset/Group 9581@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3dacf1da42c760aa6c815137bc2deeaeb447f8e8 GIT binary patch literal 11127 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 JPDHLkV1lS!9g+Y5 literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift b/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift index 5c836b75..3f464a67 100644 --- a/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift +++ b/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift @@ -25,7 +25,7 @@ final class RNMapView: UIView { private let screenHeight = UIScreen.main.bounds.height let pathImage = PassthroughSubject() - private var cancelBag = Set() + private var cancelBag = CancelBag() private let locationManager = CLLocationManager() private var isDrawMode: Bool = false @@ -40,7 +40,8 @@ final class RNMapView: UIView { [self.startMarker.position] + self.markers.map { $0.position } } private var bottomPadding: CGFloat = 0 - private let locationOverlayIcon = NMFOverlayImage(image: ImageLiterals.icLocationOverlay) + private let locationOverlayIconDirection = NMFOverlayImage(image: ImageLiterals.icLocationOverlayDirection) + private let locationOverlayIconNormal = NMFOverlayImage(image: ImageLiterals.icLocationOverlayNormal) // MARK: - UI Components @@ -59,16 +60,17 @@ final class RNMapView: UIView { override init(frame: CGRect) { super.init(frame: frame) self.mapInit() - setLocationOverlay() } private func mapInit() { setUI() setLayout() + setBind() setDelegate() setMap() getLocationAuth() setPathOverlay() + observePositionModeChanges() } required init?(coder: NSCoder) { @@ -90,7 +92,6 @@ extension RNMapView { @discardableResult func setPositionMode(mode: NMFMyPositionMode) -> Self { map.mapView.positionMode = mode - setLocationOverlay() return self } @@ -154,26 +155,6 @@ extension RNMapView { return self } - /// 캡처를 위한 좌표 설정 및 카메라 이동 - func makeCameraMoveForCapture(at locations: [NMGLatLng]) { - map.mapView.contentInset = UIEdgeInsets(top: screenHeight/4, left: 0, bottom: screenHeight/4, right: 0) - let bounds = makeMBR(at: locations) - let cameraUpdate = NMFCameraUpdate(fit: bounds, padding: 100) - cameraUpdate.animation = .none - LoadingIndicator.showLoading() - map.mapView.moveCamera(cameraUpdate) { isCancelled in - if isCancelled { - print("카메라 이동 취소") - LoadingIndicator.hideLoading() - } else { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - self.makePathImage() - LoadingIndicator.hideLoading() - } - } - } - } - /// 사용자 위치로 카메라 이동 @discardableResult func moveToUserLocation() -> Self { @@ -285,6 +266,26 @@ extension RNMapView { } } + /// 캡처를 위한 좌표 설정 및 카메라 이동 + private func makeCameraMoveForCapture(at locations: [NMGLatLng]) { + map.mapView.contentInset = UIEdgeInsets(top: screenHeight/4, left: 0, bottom: screenHeight/4, right: 0) + let bounds = makeMBR(at: locations) + let cameraUpdate = NMFCameraUpdate(fit: bounds, padding: 100) + cameraUpdate.animation = .none + LoadingIndicator.showLoading() + map.mapView.moveCamera(cameraUpdate) { isCancelled in + if isCancelled { + print("카메라 이동 취소") + LoadingIndicator.hideLoading() + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.makePathImage() + LoadingIndicator.hideLoading() + } + } + } + } + // 두 지점 사이의 거리(m) 추가 private func addDistance(with newLocation: NMGLatLng) { let lastCLLoc = markersLatLngs.last?.toCLLocation() @@ -331,29 +332,62 @@ extension RNMapView { map.mapView.touchDelegate = self } - private func setPathOverlay() { + private func setPathOverlay() { // 코스 path UI 설정 pathOverlay.width = 4 pathOverlay.outlineWidth = 0 pathOverlay.color = .m1 } - private func setLocationOverlay() { + private func setDirectionModeLocationOverlay() { let locationOverlay = map.mapView.locationOverlay - locationOverlay.icon = locationOverlayIcon + locationOverlay.icon = locationOverlayIconDirection + } + + private func setNormalModeLocationOverLay() { + let locationOverlay = map.mapView.locationOverlay + locationOverlay.icon = locationOverlayIconNormal + } + + private func observePositionModeChanges() { + map.mapView.addObserver(self, forKeyPath: "positionMode", options: [.new, .old], context: nil) + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { + // positionMode가 변경될 때 호출됩니다. + if keyPath == "positionMode", object is NMFMapView { + DispatchQueue.main.async { [weak self] in + self?.updateStateName() + } + } + } + + private func updateStateName() { + let stateStr: String + switch map.mapView.positionMode { + case .normal: + stateStr = "NoFollow" + setNormalModeLocationOverLay() + case .direction: + stateStr = "Follow" + setDirectionModeLocationOverlay() + default: + stateStr = "otherAction" + } + + print("Position Mode: \(stateStr)") } } // MARK: - UI & Layout extension RNMapView { - private func setUI() { + private func setUI() { // 현재 위치를 찍는 아이콘의 UI 구현 self.backgroundColor = .white self.locationButton.setImage(ImageLiterals.icMapLocation, for: .normal) self.locationButton.isHidden = true - self.locationButton.addTarget(self, action: #selector(locationButtonDidTap), for: .touchUpInside) } - private func setLayout() { + private func setLayout() { // 지도와 현재위치 이동 버튼 의 레이아웃 구성 addSubviews(map, locationButton) map.snp.makeConstraints { @@ -373,13 +407,11 @@ extension RNMapView { } } } -} - -// MARK: - @objc Function - -extension RNMapView { - @objc func locationButtonDidTap() { - self.setPositionMode(mode: .direction) + + private func setBind() { + locationButton.tapPublisher.sink { [weak self] _ in + self?.setPositionMode(mode: .direction) + }.store(in: cancelBag) } } @@ -388,11 +420,9 @@ extension RNMapView { extension RNMapView: NMFMapViewCameraDelegate, NMFMapViewTouchDelegate { // 지도 탭 이벤트 func mapView(_ mapView: NMFMapView, didTapMap latlng: NMGLatLng, point: CGPoint) { - guard isDrawMode && markers.count < 19 else { return } + guard isDrawMode && markers.count < 25 else { return } self.makeMarker(at: latlng) - } - - func mapView(_ mapView: NMFMapView, cameraWillChangeByReason reason: Int, animated: Bool) { + } // 지도 이동 멈췄을 때 호출되는 메서드 From 6045943ceda8dfea1738fe03c10a4e7d0d1118e3 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Fri, 15 Mar 2024 18:35:39 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[Fix]=20#262=20-=20=ED=95=B4=EB=8B=B9=20?= =?UTF-8?q?=EC=A3=BC=EC=86=8C=EB=A5=BC=20=EC=95=8C=20=EC=88=98=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=EB=95=8C,=20"=EC=A3=BC=EC=86=8C=EB=A5=BC=20=EC=95=8C?= =?UTF-8?q?=20=EC=88=98=20=EC=97=86=EB=8A=94=20=EC=B6=9C=EB=B0=9C=EC=A7=80?= =?UTF-8?q?"=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TmapAddressSearchingResponseDto.swift | 13 ++++++-- .../DepartureSearchingRouter.swift | 2 +- .../CourseDrawing/VC/CourseDrawingVC.swift | 33 ++++++++++++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDrawingDto/ResponseDto/TmapAddressSearchingResponseDto.swift b/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDrawingDto/ResponseDto/TmapAddressSearchingResponseDto.swift index 185464fb..00a23648 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDrawingDto/ResponseDto/TmapAddressSearchingResponseDto.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Dto/CourseDrawingDto/ResponseDto/TmapAddressSearchingResponseDto.swift @@ -8,23 +8,30 @@ import Foundation // MARK: - TmapAddressSearchingResponseDto + struct TmapAddressSearchingResponseDto: Codable { let addressInfo: AddressInfo func toDepartureLocationModel(latitude: Double, longitude: Double) -> DepartureLocationModel { - let buildingName = self.addressInfo.buildingName.isEmpty ? "내가 설정한 출발지" : self.addressInfo.buildingName + let buildingName = self.addressInfo.buildingName.isEmpty ? "주소를 알 수 없는 출발지" : self.addressInfo.buildingName - return DepartureLocationModel(departureName: buildingName, departureAddress: addressInfo.fullAddress, latitude: String(latitude), longitude: String(longitude)) + return DepartureLocationModel( + departureName: buildingName, + departureAddress: addressInfo.fullAddress, + latitude: String(latitude), + longitude: String(longitude) + ) } } // MARK: - AddressInfo + struct AddressInfo: Codable { let fullAddress, addressType, cityDo, guGun: String let eupMyun, adminDong, adminDongCode, legalDong: String let legalDongCode, ri, bunji, roadName: String let buildingIndex, buildingName, mappingDistance, roadCode: String - + enum CodingKeys: String, CodingKey { case fullAddress, addressType case cityDo = "city_do" diff --git a/Runnect-iOS/Runnect-iOS/Network/Router/CourseDrawingRouter/DepartureSearchingRouter.swift b/Runnect-iOS/Runnect-iOS/Network/Router/CourseDrawingRouter/DepartureSearchingRouter.swift index f4851389..c7ef4517 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Router/CourseDrawingRouter/DepartureSearchingRouter.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Router/CourseDrawingRouter/DepartureSearchingRouter.swift @@ -69,7 +69,7 @@ extension DepartureSearchingRouter: TargetType { switch self { case .getAddress(let keyword): return .requestParameters(parameters: ["query": keyword], encoding: URLEncoding.default) - case .getLocationAddress(let latitude, let longitude): + case .getLocationAddress(let latitude, let longitude): // 사용하지 않습니다. return .requestParameters(parameters: ["x": longitude, "y": latitude], encoding: URLEncoding.default) case .getLocationTmapAddress(let latitude, let longitude): return .requestParameters(parameters: ["lat": latitude, "lon": longitude, "addressType": "A04", "appKey": Config.tmapAPIKey], encoding: URLEncoding.default) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift index 8b3e93ba..c4b3c037 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDrawing/VC/CourseDrawingVC.swift @@ -286,9 +286,17 @@ extension CourseDrawingVC { private func setLayout() { setHiddenViewsLayout() - self.view.addSubviews(naviBarContainerStackView, mapView, departureInfoContainerView) + self.view.addSubviews( + naviBarContainerStackView, + mapView, + departureInfoContainerView + ) self.view.addSubview(startMarkStackView) - self.departureInfoContainerView.addSubviews(departureLocationLabel, departureDetailLocationLabel, decideDepartureButton) + self.departureInfoContainerView.addSubviews( + departureLocationLabel, + departureDetailLocationLabel, + decideDepartureButton + ) view.bringSubviewToFront(naviBarContainerStackView) setNotchCoverViewLayout() @@ -300,7 +308,13 @@ extension CourseDrawingVC { } private func setHiddenViewsLayout() { - view.addSubviews(naviBarForEditing, guideView, distanceContainerView, completeButton, undoButton) + view.addSubviews( + naviBarForEditing, + guideView, + distanceContainerView, + completeButton, + undoButton + ) view.sendSubviewToBack(naviBarForEditing) naviBarForEditing.snp.makeConstraints { @@ -483,8 +497,17 @@ extension CourseDrawingVC { } private func searchLocationTmapAddress(latitude: Double, longitude: Double) { - departureSearchingProvider.request(target: .getLocationTmapAddress(latitude: latitude, longitude: longitude), instance: TmapAddressSearchingResponseDto.self, vc: self) { data in - self.updateData(model: data.toDepartureLocationModel(latitude: latitude, longitude: longitude)) + departureSearchingProvider.request( + target: .getLocationTmapAddress(latitude: latitude, longitude: longitude), + instance: TmapAddressSearchingResponseDto.self, + vc: self + ) { data in + self.updateData( + model: data.toDepartureLocationModel( + latitude: latitude, + longitude: longitude + ) + ) } } } From a0c30db3e25546047423a4384ff1025421a9ca80 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Fri, 15 Mar 2024 18:44:16 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[Add]=20#262=20-=20PR=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20=ED=95=84=EC=9A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 60e76aaf..1f23c44b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,6 +13,9 @@ ## 📸 스크린샷 + | 구현 내용 | 스크린샷 | | :-------------: | :----------: | From daa3ab6f3abc774dc2f4a1a299876d7ad6cf2544 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Tue, 19 Mar 2024 20:59:34 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[Fix]=20#262=20-=20=EB=9F=AC=EB=8B=9D=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=ED=95=A0=EB=95=8C=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20=EB=A7=88=EC=BB=A4=EA=B0=80=20=EB=B0=94=EB=A1=9C=20?= =?UTF-8?q?=EC=95=88=EB=9C=A8=EB=8A=94=20=EC=9D=B4=EC=8A=88=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift | 6 ++++++ .../Presentation/Running/VC/RunningWaitingVC.swift | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift b/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift index 3f464a67..6e2cb552 100644 --- a/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift +++ b/Runnect-iOS/Runnect-iOS/Global/UIComponents/MapView/RNMapView.swift @@ -92,6 +92,12 @@ extension RNMapView { @discardableResult func setPositionMode(mode: NMFMyPositionMode) -> Self { map.mapView.positionMode = mode + switch mode { + case .direction: + setDirectionModeLocationOverlay() + default: + setNormalModeLocationOverLay() + } return self } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift index 9c8de928..5e63c1e4 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/Running/VC/RunningWaitingVC.swift @@ -120,8 +120,8 @@ extension RunningWaitingVC { self.shareButton.addTarget(self, action: #selector(shareButtonDidTap), for: .touchUpInside) } + // 내 코스인지 아닌지 구별하는 함수입니다. private func isMyCourse(courseOwner: Bool) { - print("💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪💪") self.shareButton.isHidden = !courseOwner self.moreButton.isHidden = !courseOwner } From 5ed0b8aa25a957846895218fbc89ced0abfc70c1 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Tue, 19 Mar 2024 23:58:15 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[Chore]=20#262=20-=202.0.2=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj | 4 ++-- Runnect-iOS/Runnect-iOS/Info.plist | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index f513f5f4..09b9b28d 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -1703,7 +1703,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2024.0312.0041; + CURRENT_PROJECT_VERSION = 2024.0319.2120; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8Q4H7X3Q58; GENERATE_INFOPLIST_FILE = NO; @@ -1747,7 +1747,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2024.0312.0041; + CURRENT_PROJECT_VERSION = 2024.0319.2120; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8Q4H7X3Q58; GENERATE_INFOPLIST_FILE = NO; diff --git a/Runnect-iOS/Runnect-iOS/Info.plist b/Runnect-iOS/Runnect-iOS/Info.plist index 104548fc..d5e25111 100644 --- a/Runnect-iOS/Runnect-iOS/Info.plist +++ b/Runnect-iOS/Runnect-iOS/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CFBundleIconName AppIcon CFBundleDevelopmentRegion @@ -19,9 +21,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 2.0.1 - ITSAppUsesNonExemptEncryption - + 2.0.2 CFBundleURLTypes @@ -46,7 +46,7 @@ CFBundleVersion - 2024.0312.0041 + 2024.0319.2120 LSApplicationQueriesSchemes kakaokompassauth