From f75c4ecba03df0281ca67d21cc1b42c7f95958a5 Mon Sep 17 00:00:00 2001 From: mh <729263080@qq.com> Date: Wed, 22 Oct 2025 19:31:54 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Role/back_black.imageset/Contents.json | 22 ++ .../back_black.imageset/back_black@2x.png | Bin 0 -> 368 bytes .../back_black.imageset/back_black@3x.png | Bin 0 -> 735 bytes .../role_back_white.imageset/Contents.json | 22 ++ .../role_back_white@2x.png | Bin 0 -> 377 bytes .../role_back_white@3x.png | Bin 0 -> 768 bytes .../Contents.json | 22 ++ .../role_chat_change_close@2x.png | Bin 0 -> 2638 bytes .../role_chat_change_close@3x.png | Bin 0 -> 6207 bytes .../Contents.json | 22 ++ .../role_chat_change_normal@2x.png | Bin 0 -> 1915 bytes .../role_chat_change_normal@3x.png | Bin 0 -> 4602 bytes .../Contents.json | 22 ++ .../role_chat_change_open@2x.png | Bin 0 -> 2032 bytes .../role_chat_change_open@3x.png | Bin 0 -> 4885 bytes .../Contents.json | 22 ++ .../role_chat_expand_close@2x.png | Bin 0 -> 355 bytes .../role_chat_expand_close@3x.png | Bin 0 -> 764 bytes .../Contents.json | 22 ++ .../role_chat_expand_open@2x.png | Bin 0 -> 336 bytes .../role_chat_expand_open@3x.png | Bin 0 -> 731 bytes .../Contents.json | 22 ++ .../role_chat_expand_phone@2x.png | Bin 0 -> 2142 bytes .../role_chat_expand_phone@3x.png | Bin 0 -> 5139 bytes .../role_chat_keyboard.imageset/Contents.json | 22 ++ .../role_chat_keyboard@2x.png | Bin 0 -> 1822 bytes .../role_chat_keyboard@3x.png | Bin 0 -> 3970 bytes .../Contents.json | 22 ++ .../role_chat_phone_vip@2x.png | Bin 0 -> 1017 bytes .../role_chat_phone_vip@3x.png | Bin 0 -> 2185 bytes .../Contents.json | 22 ++ .../role_chat_remind_voice@2x.png | Bin 0 -> 599 bytes .../role_chat_remind_voice@3x.png | Bin 0 -> 1103 bytes .../role_chat_send.imageset/Contents.json | 22 ++ .../role_chat_send@2x.png | Bin 0 -> 12579 bytes .../role_chat_send@3x.png | Bin 0 -> 26357 bytes .../role_chat_setting.imageset/Contents.json | 22 ++ .../role_chat_setting@2x.png | Bin 0 -> 1286 bytes .../role_chat_setting@3x.png | Bin 0 -> 2851 bytes .../Role/role_chat_vip.imageset/Contents.json | 22 ++ .../role_chat_vip@2x.png | Bin 0 -> 1126 bytes .../role_chat_vip@3x.png | Bin 0 -> 2421 bytes .../role_chat_voice.imageset/Contents.json | 22 ++ .../role_chat_voice@2x.png | Bin 0 -> 994 bytes .../role_chat_voice@3x.png | Bin 0 -> 2029 bytes .../UI/NaviBar/NavigationView.swift | 44 +++- .../JXSegmentedTagStyleCell.swift | 0 .../JXSegmentedTagStyleDataSource.swift | 0 .../JXSegmentedTagStyleItemModel.swift | 0 .../PagingView/CLSegmentedViews.swift | 0 .../PagingView/PagingView.swift | 0 .../Chat/Session/Input/InputSafeView.swift | 34 +++ .../Chat/Session/Input/InputStackView.swift | 29 +++ .../Chat/Session/Input/SessionCoverView.swift | 124 +++++++++++ .../Input/SessionInputOperateView.swift | 203 ++++++++++-------- .../Input/SessionPhoneExpandView.swift | 101 +++++++++ .../Session/SessionController+Input.swift | 5 +- .../Chat/Session/SessionController.swift | 17 +- .../Session/View/SessionNavigationView.swift | 7 +- .../Roles/View/RolesRootPageView.swift | 3 +- .../Src/Utils/Router/AppRouterChat.swift | 4 +- 61 files changed, 796 insertions(+), 105 deletions(-) create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@3x.png rename Visual_Novel_iOS/Src/Components/UI/{ => Placeholder}/PagingView/BgSegmentedView/JXSegmentedTagStyleCell.swift (100%) rename Visual_Novel_iOS/Src/Components/UI/{ => Placeholder}/PagingView/BgSegmentedView/JXSegmentedTagStyleDataSource.swift (100%) rename Visual_Novel_iOS/Src/Components/UI/{ => Placeholder}/PagingView/BgSegmentedView/JXSegmentedTagStyleItemModel.swift (100%) rename Visual_Novel_iOS/Src/Components/UI/{ => Placeholder}/PagingView/CLSegmentedViews.swift (100%) rename Visual_Novel_iOS/Src/Components/UI/{ => Placeholder}/PagingView/PagingView.swift (100%) create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputSafeView.swift create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputStackView.swift create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionCoverView.swift create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionPhoneExpandView.swift diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/Contents.json new file mode 100644 index 0000000..82a075d --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "back_black@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "back_black@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..305bc4bdc2bb7995bbaa530204e5563082ded7f6 GIT binary patch literal 368 zcmV-$0gwKPP)lpJbK1JdQdKgdlcp3GW^&!gK`h# zZ&qlBJAESV2+nb^8Dmz6fE&uM5F5k=VK#<>1QP>Z@yWOIAs`LI`e*K}q7;K-EztpsJ`+P#?QczG2B#3Ex5auRh z42Xq^+G5i7Ak0n1Sdd9^?IJTsTa`HX0RRC1|MzAjPXGV_21!IgR09Bfi&06|OBD(L O0000{(by5DVObL|lP{_h7u3)RC6+PXA2z)OqT>y5}_iTYvPY0kc-vreaOSGMRzcRvZ@BqI4@gOPA7uG$bXB zm|#GyDf=U7S{jw+r9){>N*Xc2mX-OgG$D1yq&AkMq!9y*O06jCW9cW9cC{E|gq4(H z(0;}P3i}=CL&l|Uaj%^xQqt%bte5>9#FJLGr5h<})CHqbKKlXjs28evs^z zMZ!M&0ktENGie}E2ds?!Hbuk58N$yD`u7%0?)~!3RRiR8t)}!dw9T?X7uui4?;c0j4tZ2J+u9pYNdKBHd z1G^T{mPE&^g}Hc9#&^<&)b7?D7#%L1F845+M7`fN0O$9Sa{tp2xoAwe%t%}rVQD`> z(smJaymY?3;J9kiIWqy=%!?CqTX7Y0dC?rw`O*PX9k;)8$s;zNA96GA+@IC@PcV`L zE@VsKm;i3-Syrwa7;wn6Eq!2Aj;ffnr4Nj%0cX;dAu!<30ByRHP>tJ(#gQjvJTNYid0Fy<( z6(dpLe70l^+8mBeCI*c)ST9=^U2Uv^%6v{tFe-;F*ER5!^sB4YzGM*-jHH3P&5C-7l1iFDvri|bQx`7+WX1alHaNgh01_FI)=`{w^Bef;o$01(asLEa|D0D;q zqe4Vg>5U=RxFV#(5Myr{r(L4htAP0 zI!1G7IyP@(U?e|7@?ErxexlFlFWNzWP}FD)jI8I;2Kt8b@tuGEqp0y_FjWdIkaZ8e zgyPVY)|k~GrnKnT>j9M6Z<{CiiiX7{2lr6acoP_zR@sk-T->l-LuV*zj0L7jp;7h| z#5J34r_?f#oNDk0MqBa;=hS+a~c|9uizDtd@ln0ey0GYF29Q)D`Y)YguGix%^HYj1B=ZX$BiF4vupELqUUj}zaC+C&jhim-_4+W+otoCL z00ym^L)}JG2dwH0%T~A8bpKEv=EELO;#dJp83_)(W=p~KsM-QbvT`Lb!3|{EmX%;s z&9p5m!BjQDA(OTo2`0FKCTPn+1~qp^vlAQ|WlOE$y4w7C?>*L{O|4O7 zOW)NtwNS|OGzLc1GFvXO@Chn)wH%8Uje#j+!J#8Ghe} literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/Contents.json new file mode 100644 index 0000000..00084c3 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_change_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_change_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d282da40e5c45d6c64ba4035db3bfdee72b6aa2 GIT binary patch literal 2638 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 literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..47be72a20fe7e3183c835a0720f76edcaba87b6a GIT binary patch literal 6207 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 N002ovPDHLkV1g;rQYHWZ literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/Contents.json new file mode 100644 index 0000000..f578be6 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_expand_phone@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_expand_phone@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8389d8259891c5dae867da243854508b31d6108 GIT binary patch literal 2142 zcmV-k2%-0hP)kw8R<1$z$gm9i*8r<^^1VTK}>&uNrNpV;FncWL$C=YypbKXxua%z?mg8kN`{s08NyfkkPRPI5f-OHsI7X zX_^eM2bx)ODhibVS~cKo`@>0rj|cdQYuee|O_i92HA_$yG&j>Z@d@Zqz);mRI^fH0 zLl3lXXLFVo9j>?2S_+&quF=wHfG@f0a%vmc1)YAvnRV=ZUmr!4dVpJQ!36J{;Fi(D z_Ow#nt~eH;QnzZr2)Zx8a;;PfJSB$3bc>^Fg#yC?BLEL9)mlBBZps|mnp+sA#&E#L zx^06W1+b=O`ZV>JcGFVHM>${|R2ChT49%Js&PW?iNV_jdznJ@Q?@NboN}Eqh^krOg z{amy&ZJHF%Sq%81BNVK3P#aGgxHqKs^V0Ia`v9B&khY%67U7gYw+wWl{)2!yw~023 z*C%TQ#EvaV`?)^ItSA4u_)qD&@#I_QR@=0wtQpTX2>4iAk_H&nOMqqjuKl;yP?5pc zda{CPHr)$y+KENy0l(mujp2e(>C=AJ4z^h?WH`DnUHe2j`?B=-Rq5czu-DGBZEv=D zzI6^Yr)9J9vVxQc+!$PufLADe;eTOE25#wfY3oy|`?Cc2^Y3K2=VVu$+SYaokEi;8 zGwYUaWt7Jek$VE*%3B#w-$qXRHCq76o>nbv!Lj-J-15lEeZUQER4H-pUwMw!hj~ke zz3tDWy>G)7Dc&9V-Wk>cD`$Z5%+jhVQuFV5hI`-T>v4^99k#8W3u|*MW9421mH~dC zWz|TW#gL8j8rI`777lqBj~|Hn=2Cx5YqFF9ZfK}yHoiyyN%RaL8p70=oLU8Sf66md zSqsmMRl`v@w6H$6G8heOLw}X|Pt{6CzvbD60S0UwaCE-RkDq((Z(3~F#Z>G3qTJWt z^Vz4eYo;i=!m_aw>r0wb=@`ILZQptDLte4}|0iGfwfOo0Y|(w~`RA4=I@cKG{Z!|x zylPlDKBI8NZRg(|3{K#iJ2@=uG&H(Wkho&FYJw)U?7MJSrwkvtr&GIsy#oDwp<(6P zfQ?sodAmiSM|>xaEqd>pUS}_ZXPATQvCSiE0(hi}*w UKMn{dqp*gl8wc_D7m( zCd?xP2J8)slS6G{3&InBdEmT144_8_4A43jEc)`mb;bRRj51oasDOpxy%;YVC{Ob^ z0JvK=d0Bgz1>-=Y$UDPx`$Y}B;A7hZkUka$kn9S|fM=oLDbuNDdl$e*HJNj4MHbwQ z-fXZiMfWdO+i`y^VL#3KCLH80e_uV#`sw83_2&Q6k4Jz z=)i(ljxCGzScEDS7}GK5$Cz-As&PU8uUPmXXc(yonAka?6x%Ws1Rs`;-*v&mmc@FM zJ$Zf>l(KL4Ib*OkbNRMfxzjIp5@&O*V z13HcY;4h`$WESouM;1@-l`_@nz&Y`zGFFI}ezBzycgL0(09X=>?^$F*IV6 zR?fGS)SNo9lmY%-X+;wzz!rh#Cl}5eXM4gaa#tC$*j?n6)X+V6GQehPVRBj~q%zQ0 z0?=GRl*gTh#S6#A-_gUqlX9ZFdM`->tPC(c4|I)e8stG2ZBecufR7VEuu!oh#FJO* z%zwvvOntx~Bzu~Ym67d1mt83x3m^zQ000oiR8hP;nB!jbvcEt^*Q~qe+xviNnWB{u z2XUov|DqiAkN}D&2RK%z%sHps^HC-Wqo3TjljE_Ai!3hR9Ul*Q~-i?c+X(7Lje2W$;Wv~Jhb5yfc}3i3;1 zEz1m<9I)I5Ls;nQD$#&n8U&0tD_}&zGzewaZb>M--jN78Mv)6Yi-w$vaa(5HZp@0vZC1WPaaM%FcvylCwmaalJb=P&PnoO7M`G~PHdHUC8`@56SqHg_0mFAQX<24L zpncBx@!(U-ThztB2$IVZL>Y_Ljl^WX(JRy4ii1x%V0eGmie&@a!rC6zr)$5YoG(?* zI)(!#0&6@npaHv5bZ!mj$uk@ToclciZZGNu}t zG6%J!c2esqtp`}Wgfnnjx7z8SYbO9+9p<1^kVXTHfSXCj90Shm7S&TBr#<~eOXB*} zXlZo7$bT>C+GP9$|Hb9THVpgqmPN-Q#;{o=Ph`qOyv-Tno;CFoU)bkK1b51b9 zWPts|D6yTKx2=BG9NW4QoqQeBxCxL>EuGQhsYRJXlc&byA_56)b07*qoM6N<$f{s266#xJL literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..48708272ac2b76ee7799034e5e9f5f563a8607e0 GIT binary patch literal 5139 zcmV+u6zuDXP)G z378bc75;mc1&nUwh-h3eUJ(cqLlB7?jHsX(1w>FF9Ljx0A$XvK!ziABVR40B4(0Gd zB;qXwF=#ySO7Oq~1j%|J;(-dw!gl_@hxulvyLzsj*`1O3s;0ZHSFirAe)a0Tnh78q zK9lVLhS&#VklmQEIfmLDFxVc)yd}JUhSyDupEB-Zv?Jo@ynmZ<4eQTkoPuHYc@7QH z5>3(0f-%+{(6((6lp_gbHg`!jj{1><3ibr>Tu z_L_RNO zJd*KX#!T`d+V$ASk+5+QL0?H8-X!1yFoHZ?V%KF^#)Fv1Y$t>57VO|!Bt~dPz~^BPMO1CvNYGD-Q8z6`nH%shyO0Bz#@Q=?uOYVroR_Q$&B)DYg8mTS zwndcVg-mB8q#x)@?0Q__E~ZRe!vT!t>)M2z=QCz&&;ofVnd?KIrQ!5|#=wkphV%ig z6@8HXJJi8!f_pcaJc=>bLNiW|MI1vZXZPvQn9?+Y^a0%fqsZia1i1%!bE{#@%8_6b zW*ZlBb}vGGj7}HVRRr3$_~Z*I-)0ct+hIZaZWU>!YiL!XW3hE(#u*rFPop|`2*9y2 zBh^qfP)48`Y|LioqZogj!NO%!2Nz-pj;_i8QwMs8-4+#C1{qb*Btf9L;tsKo;nSQ)boa-Z%wb0bVX%O< z5{gb@6IEnRBnI?o{EW?KQ6{H6lk0G~Y(o>$B_{({o()Vs4;aTKru%P!qePt@xSGTW3$!TkHt}!(H{SzK1)jPLcz6Ubt2Z#UD=_JN;Kpvi+<8n2^^o$ixmWT8o?gf9;lTUNi8StFQ;&A6N}S;Z=oz$HV74xG94b( z5LiAOxalR5mn)ioL+An}9o?1OE0H@cf5>ZF_6#K}m#oOVXH=Zc;(3-;Iuu%|P1> zbY0xUx=E>W*U;k8zA2!Y4a4W7FM&T%3-4SEj9p5t;}PJBWx!|OdMistUw$Ug`PbgE zEYCTLQb3A>hfOcg18pi}6dRtZ{uwQ~;0<7_kTwxnvwRQm(CffSQ-P(g0iS*Y?5YUP ziH%#`>r|HTr7|$ ztpJ8D0k(Z-u5rI8p;mq|ZaDz)x;v17+ zGyvNAIIW6T1Jj@J2O0e6VO;+>u$Ho$$*545toA$!Xhd}}svx@)Uh!GLxF> zPg`lq&5=A|ON@nh0a>OukKZYTkGV0C_;5FEdMHru0C%o8J>V3;&rY(pGH54R`L4HJ z4&?~jf&eVg;lx>;BIg^n0TLhX<^^?uwzNyT^CQ!e%Ol!H=0xAGS`S?Nu$g{z&8$up zAPUOWf-B%(eQTY|anm%2Cj`UMLlPy^lM^KJ$U~pGD{AWU3M;NJbY{ zmHEfknJJu3hist_kZN(rK`=UF*KUGiv(8bKPD6{17FtPkq`VM@sQv2$pzP~VD*8I` z_tELd)E>%UlZVAmH;-(aQ}-4Q4Ul0PI{96NAYhi$xNjnH5w!`wSuLZJNi}T4<)axF zQxmL>OzS+z)C+)vxWf$QeDu;V<)qfH}z5Dc{ZFGofbZ{sIB-9u<;8oIRQ1R z7tr89ZS;2Ndrc46GUp z%}kj1nC>7$e{!^K~z0Zm&{*kGW2w<hp zTUv?QxT8hQ<``-@0&{9t;P^t|aQZYgvlaDr97nZrG`IcF@ga=j^^gKU?U32ewg4<_ zNOvDHYx;=-9rqf4j(JC@MRCwVK%kp=lFTlqIaLR1j%?_yA*X@Xg42HKEpz8cl-+(2 z@W2q@LcVE!56|5$rL=|Z0oX{pH9^+AIsXDa`^L+b`#lZfXY8PO-Vk6tflR|B?=ldiTg!OA#h^s$H9v_4B>h4_tG~N@d01Zi z7&x~GSVIe;WWT$PUs|5|H6Bo?Qcjw9Sf z>)ut=CL}Z6)%DsBqTTxD3*9B*v}SWDWq$i?JRAaa8xNjHd;F ztj&jC9p!6A{`r33#2bK)T;$Fx0t8qmUSrKrvQ6YSEZ2=lMS{x4C z&E1-0w@$34nFSBI+O+`F?;>>~R)>T<4HC(yL@Ab9&MqPdv>MgH69oG;-Bw2w*xG8x z5+mBN715A%2kjfuxiiVv!F2&WTz4N@yuaAt&P^!29(6(GGFUeZbdgm~p!GLu!IEnD zjweRMf)+`g4|#AXFy<^6k0+>JRil2G)S9+yHyw#49TIZq$4%R~6~c61#W2vy*b5ps z@wRTOD{5v-#k%Q9sy(zz`}KPSef9cb{^NfJq<72gY0^ym+Q-V5{w_T}KhIlBhB2)H z-jbL(>yZ!ciNkfGfzF34c~qW|#E&Av#8SPJ-YWx?)V6qoI-@C^zod{MzgHVTAf?)` z+Ubqak5SK{_eE)UET*kS+LAjzMp`oYN&EmV&EZ+(C{3FVLWSdJHYQ63Xjn+ zFnBT0cRrxkI8inPUduwDduu@dY9rU#r1RnYy^#Jj;k=f>FB|z&E8~9dy2k*WRq?Oo zDG^o^F`L+Vib6X>LjlV16lFEdE~u7GjEMz_4IMLkkhA*O&2Hum000BLNkle(29Fv5vtBI zX(zHj=v?;IoZZbQ0q4+yH-j(kTKY3K(`>50tll27mb_#|t# zhUB(ps#G&M8j79;CO;aE`fH2DGzdSxA?PefnOhrD{zjn)T%O}oNepPvj9P5Hi#?zQ z3VP$>6aJCc*a`~+QDX6N5t{@Cn;_8pC@rvFW(R$k($nN+zYOag3`&Sa62ngpXc69y zRqTj1G;CFJKZ{$Pu?vGF2cA68T3zQ@D^Y>Yl-bl~vvYw=5{G!zrCreN%Q0*0!XRD? zS9$V4hX@44NEarlRHYwm(#@8zhqL$z+LtdxlHwwA0I35lDka#6I_SrlJyXdaY1IE_ z4@0q|Wu!dBssSx+q{#XLrPf$-Kzo>Tj?dX%}o`3{?a= zg63B!qHUxvU$bS*l_iUpoDAh0!-E96Cp4xs4IzC%Yk`<;twuQplefN%>lt$`d_<7@ za|}Z<*Ln#WQ<_GQKA=Mk$%0j4EyXUJ#Vl@u@j0*BuJV$Vp@QIUfsN_pxgF+M_d{bq zdOzt0I>eux2PIZt>LWV3Sj6mXoZ(VWr=k*_P-^`J;+c$QB4iHe5V!NJ7qA=SQ41Y8 zYX&mArU92DV=eg@g$i`y^#%m}q`b{s$UM;ET^`|LYYPW7pX%UmIDQMo#9s~_mlsI;Qbwl;B=FGnG+ zCm4fJiE|m-5}@-LuVb9Y>d!O2!?=|(GL$o+^Cz3xmOdBU!}?e7zN14!v@8sAXwR`8 zg8H(mrVF#bl*9i400960QyvIZ00006NklMwK&XIF0qFobFy~h^Vl*q+yY|M0 zPh-7C(m9&ZYs1m7;J?*sbt-u&`5^fw`5}pcvM(xpCqeggK?uXngaqnL0=S<7_D%9m zaxMYriQ*V2J5%9H3A#p{NuZ62w+~wr5($WW(a;Fsj+NdvK$1y-9P;0`9nB^bh%nRJ zj@@gAm98`nt_jheUbB2MAq{XWd8=NqNRP-b)qj#)NS;d`N*?@^|B;qFmOPc9gD!29 z9RaE6|Z2d`u)FGX-J^(QqSq0Y;Kt2@q=aTo5Pm)_n0ZdwQBe|BKgYE;hg*@bx z90kV24Z$#~j0GDBi3~0PnO28@fW%V)1Y`jp2U?d`TgXESi~irxWo$@+rBVH-Xe}X; zVR1qxn*3H>K!O=2t?ceW#IPuv18y1n1p}nO)E%r#NMx9et47QBDtoNKaWf^C59<3y zy+Vqyl&k_92H2`X%QOjz3?^pro1VpQG}wh?E7!74ro@aPVg0;m=yNcGaa1)TBr=#5 zGQ_?CWM2D%eWXQ-F(WCkL5jG7F(RbeOG#vZ5HiA%LWdL>!J2gJry?ZlpoE#No|x^G zSt5Nf$)w_%x)A2-OsohAEv}}h1a_K(lPPG10W4q|+`r07g^-xCU1A}pJFqR^`v%|# zT$h%W!15yKaHl-8vO-7&Trd@taHS5|K1;#hkPs%03l4M-r&uWwl6BbE5w8??7GHO7 zX<=c;d5$2_V{F`4mdG(}l9du66~>L=vt}ats?>%-1M(X9;1Jt?NPk;_keQc=XvjtI{dTcL^r=E_L^tTrOH@T?co~ z?)f(pi(p%$#>qd%LXptgjVrUFR(++sdxkaUd-;xqm}y@auR^}=Z%fBZb+QnC>VZCK zEjCl2PIA5nd8RSq8Zj6a$H~7wk_%xW@2B`>G-c`_5AZ`7o)`BmA2kl=P?MCfa72Jr zYANv5^#+$CR~9xI2?wO2QQ%DQos1L~E?_LiY;~L7KdvHqni29hTy%KSwq_zC0ZniICh5pomxCZ$UoKwv7(kHgA}H$hojZ?*S8^vxrUj6AeqJJi)1m zPg)jbTy&6P+kT;e_8}uOvJUGzx?4Ful7(O+fXqHZ)`X83__5^=8jB2A*epB_HiJUE z5Xu_SO89EpAaeboBd~zU$%c@NwDa%S6vY3%LmF1s>-u8 zln7F@{>)xl&P<31-`O}iMpjT)kO8BTb!ZYoMV4Y;=gcAN1wZCW!uILQ7fXu_#|3|^ zW~|sR#|7A8dCGSQQ7cj$o_vSH#1xsZ(?E)CowSwj6pP4-gl(Dc+p%9T@MHl~cbv6^ zXeCn22Bcah=AOkDppOC)uOc+xC~Ajman*tZ*PK>Aj13vEtnG6nAzF)6>QL#prK>0f zKtPHwI>db40VMz3jKeS~W$;*mTL?N>0}_zI&5~aDVNA$?AykdClL*mFr1+|dPxGSf zbq;vQaTNh1>j0ACvRbJhK6pR?BIuw?8&!=0w-y%vtp7$ZnUD=9Vq7&K#fGub1+3kS z*oZ)e^o*v%_#B$rTEw`dvbGTJQa!6p>5>JHYe52;O~eM7Z6RxDv50YX=bDezActE5 z4p1$UlwnzRD|A^O{1pP%qK$RERs0(O0RR8aD=Y5+000I_L_t&o0CSG3Atl)->Hq)$ M07*qoM6N<$f`Fz)z5oCK literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9a63fe45c8abd0fc6f74a1ff4563ba249b504d GIT binary patch literal 3970 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 literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/Contents.json new file mode 100644 index 0000000..beba6ea --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_phone_vip@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_phone_vip@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3eb16f26bff5062d457e59553536757ba6ad58 GIT binary patch literal 1017 zcmVFo21X_KE%drCT`HEkoDA0$fhH0EhH?UudFaNZ>pbfV_E;n7q=Gn{|rzo*Smt6`8s zD>mvy>--tcHxrQzWx5#-?Wkcg+Z)yr3R;caq)%|$&!y67+C=03#Wi&K`MVu5z|{B# z5gDEh0FR#oeQz>0?{tFBoCXFynvV2VewnW5D%S?37Yv?cWjuXp`U^jUCP&xl7dsjf zI5$epzMb2EMJkQY7;n8IApkP);S(~QbH{)k^}zV7@jJNI^nq`4CX=lgGxNabDWIDU z%}^)PcMbTn+{)DWv5Z&Ouv1!$w!Acb1OGn4%)-;YRhgZk8L0JAMdA zuN1g&Qc~*B{_t0$)hEg61aL(}8uwwX$@?{igrX4^Up@=SnOG;Rjb$eo$Rl(x;OcoA z%0C@8Cp9FfOA1Gha*?EhPOCAXpLrK82NVs_(;>WM8uzl}7dsMU6lY&-Q+6^TJC7d; zu*{^9(HBoDw~`5p#6(^1^&;8Cw0hPLYesUVPPV>G0=;i-PQ7YOqfqBY z5?AS6f`=nn8C1=@InWJmKE+^E}M?GkB@#Hool>mRcB zK$;4t#(+=@;*~OuA&R08GR3kbZ0CC;SqzUpB=z*xgyu*cxFf8|fKh-7OtelRgQ5fG z`S6Jj5fmNLrN=FnYtAqQk6!*(THL;Bt5SlzWsbN?l?CIMGMP3EH$VdM|NVZqp-l`)G(SbWmM{#gi%N#KhbOzSK%@KEzuc4d~9T3+?oEAAK9TlZU z!&rQB6K(7ZN4zVZdKHz5OSpJy<0@^gIYDWYhEgG3h$C3%^OsOcnu0GS9dP~JI&RI8EN>pXXW(K)jkS~I87)W%(b24tzW7a;04z$@#_DyezaZRv{0jg8 n|Npeug0%nu00v1!K~w_(HgTM`$>$y000000NkvXXu0mjf%0=3E literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8538efcf294d4dc3814a688f57b81c81b00c2b GIT binary patch literal 2185 zcmV;42zK|0P)t$=ZZoSg2D+=2JB22|;KqOuUIGG_cDvAk9rUcr>MGZk?Cdo{|OEfXj zL<%M*!XJwPF+|uL8r022E!!m9BwRK&wzX`%cU{+YZQsN1_n!BB?|Hv{V}n27%X!Y_ zxt#Yr&v`DVjliGnUted3?)kDE>fCIHyLNEw$-!{fQ+BXxjXi#6E!m6B+OHJs*!rb* zxbs0f*!lOI%ur`fS)A}goqw>y>%T|-Ergy6g7zNl`kfuTXM-KS`x-m&jd{gG1d~XL zpd#J~YaS*3Yq0i{96y!=Yi|SWW>nSv#M)q^k;Ypw6aSeqKY+of0p#V%;T+HHu<_5x z|9L`Q#?kXQ?PKgZ81pN{(M}Yq9W3oR@y=FQ^Ha{R1dPGE^)r|Ui?1WXqi8<+{qVDNGqVBa0*ZJEi%J-?#*TJ1U<&sW zeHG!oXfj>{V)G+AaQD5|ZmQ5BsEqBqf4$Fyl?<`o#&XE_LA8cMfYK(?>ZqO zc6p9BhJa`O4g6_`gPxbj5;Ti?MCLohv=OqlhX#0ZyOVipCzTig`GDeLSC+cVi3V=ni}IyK||GdBNe*zNQ+8EpT?m!O{Md zkPZeloLxaE5L`Pw1^jh4Aj?T^9$Bt@pQ9am!|fxyLaV9X;nfdOnTazQT|DJL`;MOm zUOo!^_Gw`Bl%zdGF!&5=rkW!j{CST}#-{l|b!9S5x_-Ld4Ba7FldSzIjczSBI9?(r_i-jo3>gjj={BbVi?%ldm4W3|e{_4|HSBai1-e{FajNghP^wM;$R}J}#Z2j4nWBI_ zhRVW`$gFr|8ZnqZ!H7&KyzWZpzv&XnILb_Zt&jX`zh5EAez!1IG7KOW)PX!MycOXN zA6K6OwNX)2&3WcOz|*XAe`L*4ZBdO0gI!*8UFpLk+K*HAWR&a{;V^)_Pbe6POqznt zD`Q!M_Ofd0unCdf%8w#R#hfNh))l`joFLdOZebU+LxD2dQ!j=cEUO;$y0Cfz0tv$%S!kbf}41@bvzvpzLGT@ENfl^p`EpXcnz*^Ru zb*li~jFWJ^#WMB5oNS7F;Yi#ASMOGIsqUg$x0QI$6<>Ae5(5Xc7 zufu69#&li1Y3gn<&E2a^<3m3-jotfA)2~lDwsZTUGN$dZ32u@vwNj?^y`(hxi4P(v zl;`dTs9uD4Wjg=#P`nJ#Q>3uxQM~xM8^@WJcA1XuUeopq`lLf%OkY$cVU8{TL`-I` zE2qqIW}b7c>G;*_d9KmJA{IJ-yK=9AF;8&@5k13bHi4N)MO^c@1yPPWvj5MmJ6eGI z*8)H9%wP@w6D3#6F$RlUnPNl!FMTQ_&aDPiFFgH$ZvvqUiql}XY5h%Fp@q13$SY$a zK8%u#agjSD8R48jyh!2lY%%^)o^WAoUKw4lwNFw^S%kxdn(0G~2Z6U^0G$74@f;@S zK5>4Ax2EKjNv^kI<^jOUI&$uER_99-bOXDO31h8k>E48R_C9{*II|%ieVmmxi!*Qv zmork#ea0!f9k$SAI)2GNbnuRTZvp@S|Nm0ud;0(Y00v1!K~w_(A=E}egOsOS00000 LNkvXXu0mjfDR~~t literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/Contents.json new file mode 100644 index 0000000..fb8728b --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_remind_voice@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_remind_voice@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..19c571d766c53fefdba5fd0e21d3e04616807a71 GIT binary patch literal 599 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 IM6N<$g3qpilK=n! literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/Contents.json new file mode 100644 index 0000000..6af65d5 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_setting@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_setting@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6716771895e5ab1237eb01bcc13637c8013976ac GIT binary patch literal 1286 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 literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4794ac584fc05d4c294f3df6ca3fe257355939ed GIT binary patch literal 2421 zcmV-*35xcKP)=Ew0~4 zIL)ymg!~*mZ3C2zmUp*ZqjTuvD4sbc?H!hZC0elt{{!7UiB+ya` zRwBlIoc!zJKO*3|?Mm9P2~(oow!3wSUq=LMHM2IxysC5w2h)J;;Q!T*gsLvJ|FQ1C?BV%2E+{tJ`x4 zHdu^;`8gSRk%-UGNaD4=elqDZyAJpy9Xmn;<+)VsP(uwcb&4Zh)AKekIPA!A8*SJC zJ$>O4pv`}QQJ{BZ1FM(|z8zr%?8&6KmPu<;WgsAVu9r>lSbT=u4TS7bh#dJZpchN3 zg@5%^qLT2rn%iAqL1WUV)>@#Oo(qjDaD%m$awuQhaJs1%gH6?(249I#0R}L#-wb-L zf)i&F;LWa(0}Qm~d8HS4UP7-e<5Bho^vWw`#&UYv*}SINw%8h=%0PvtHux zb#ojlHT_qCi3>zi4%o=WgAcfCBOlOEtWhlXK0tqS^sw^(H`}w^#|9J@dHa@CakVb}&gW?IcoY_m!nm)-66v7GD0^|A5mSo&#p{94%jv@uIYt3yOR(gvphF zHjiZKIUCF&VO?OH!dY`DW1pZ8c0C8YbV6DQ7&>7Ii>B#S3GZ8Lo{x+%7AATf7QqUr z(cHi$eRPNP(Q{!o)5ZSRf3fCH_e5cM<6=O&m=1GDi_!ue!={0WKn9X5J!j9ANJkuJ z3V37}@bK?}%{zfdN&otf!0(<-Dif!aHadGNmAtrVsmLJ{Z=vT%j*MvQ0zXqWcP5+Q z>7{WBPl;j+{Dmc2m;@SmPH*PbXSkEn@o@4@PbIiK9A>+!_6Ld>mFV$sYg%&AR@6e*#24`@Nh&ZHeF(pf9_ zh`LU^3uUJS^pz zTGj$*$lad>?!OCI%dfN>C`*SqWWWX59k?>pRbB2a#_Z(5v8<@rSv-x}p-pD)W_QG#aq2^CSk5~tX(|~yp>Yby4xWMiR8xpbOOtCy zwbSCu;nZ7si6S91PQ|hkQ>e8dz5GMjxU{)|7>}Vce!!R~S?eVOGUIH_RVPB%x?P^` z$Wrqn>&FvJ|6VYSRl-fz1Jd=f5Qmq$k4F{SCp7kLMhz6%B*V{1-bi56KqFp*TY8ZFk@p2oe{1R=-)&}Y-DeseKTI#>!p{#c$9dym59So~xiMCar$sJo z%BkiUWk_8CzUEY?5{b^7Xn~9iivY>yl@-)r)l>lQV7#wi-Z*RZ?ZQuhbS~9vO3ib4 z4m_xG(Z#7`lB$hD`pZF8j2|QXv9ddf2gcQ~>JzBkYvOxyli6MjM<0@LaYd2u%u0A2 z@Vh<@=$`SQ`$iw4x(0F!2^jqcvwB5-+^r1bK*fdhy}XG1yz6+E>4Fb+V2+uYkFoB{ z2`9`%In9v*zbfsqoJ^slv*kfaMt7iBvKWAk?(t zL+KZDqxY7$_d(>1Yh=-Aq8*%PqPsN$gWV`pZztZ&#RPvu;)DGx4xnyuH$K2GXPhg; zYNu=mqKCN9^W)BIv6p|${sc9@qQ~Q3ATm$TNTu&_hrWwK%)Y&dqxE66LD_qL{to~E n|NrfULJj}`00v1!K~w_(-@|@BD`BH+00000NkvXXu0mjfBon3G literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/Contents.json new file mode 100644 index 0000000..dfb0343 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_voice@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_voice@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..64ff19fca9ffe40c5f52309cd8ac5f44304efd48 GIT binary patch literal 994 zcmV<810DQ{P)zVycg#P!0P8oW!8ConB+rqK%O}GiTQhg-s3^g&umz;uy$f*Lp z7cPWP!a=|X)pOxqa>%GzwiG3#Aes3ag?J`x3r*!r^0xvyO>(ZWqJ-r6O4t*u1zB{g z@~v{k2x+ESLIl|AG!xj9E*Z_byFC^oB=_tURhyeg#8K?C)Mi3*@Kpx6NOJwB*5jb%R@V9XF_&-iUC&HN#?#vX z7s~XibEomXR{ITO0;Kf#uP8gm zda7kz&%BFN*@}x$2qF*URDtA6Wa(YYTXq!S15$;Y{^0QB>$VEQE3rtL;&LU;;}InAD08XOkvEj~g5+7L!P z2R1m$nT&kQ{M?HWUPOvhh-(npA}G2&VDqE9A8dJaS7dt=!lD9s6j(xJi&GGi3^f56 z_RlW50>ql+O=Cp}MNbNf_YUtGmd;H55L8twWHY{8c{ddy5|iBp^~#Xgso?np}znC0RR6O4~xJ6000I_L_t&o0C43Gc&joz QcmMzZ07*qoM6N<$f>G_pUjP6A literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..869122a72b18d5464139e0f45370cd815888b0be GIT binary patch literal 2029 zcmVogD{jbD=dqog-UIqqQZ=9 zgEGXVeStEi#rDkwHN)5M_n3Ekciy?rd(YgNdy{#5|98&$=A7^Q&VSCCIcH|>dL89o z6ayu3QM7e*l*E<9MKTcCtQ>JAaghu}HY-QmxWyI0j1HdETPOv?wSF9_6Q)#dlXo<9hI7Z9y^!7z?I@l02Dz-U; zMza!IWQ&zTiKCNF&%Np5!(b=r)q`XP>xnlD>matx3(lBUR>SQ!g> zTap$gMH6=-Jv$3HT1c8A+BzFcCxODGFya^yUYEwwvyDNsWg`rZ!N(?~g-Bt<(HlqG zzNC4Hwol2+c-n4}#0^M0&!Oy;&B1J6lZ6n+6xsmS2Z6lhaC~i=w-fCbLL82E1Vvnb zyw+`puiT|5;@m!YbI7|x`f$mUx1Yiuox5bnve<2eh(i1nHR2lS`2V7ANnGS$KA==x)+u&XB6gU>7`c=#0%6ebsmc<;y{|WF_t#Jp0Iqq$0bLGdPlp z{7Np=A=FKkrC3`GD#A%Tl*0a?w;1!Oy%mk-vl3?jA)j0KR(5uFuA)32(yl)adT=o z+K-EJ=&Pa^s6P`lTb{$9BbwwtA%<-!`Hc!mADP!j(|{r?ao^zUCs2_j<8%K$FK3ua ze{p;~_!Kltv^5Fa-ci#wePt+lY5jL7jGZJ-vJ&UbA#~i0WOUH_gHf82 zWD;!*PHa{gN_?My(pX5U0oS&0p@L2-e5MBs?CWDad5FmSj&RVLyR7w?mLogwKXBbYMjRePlp z!7l|9QJf4$g2%vn;79Oh0uSld?p8u0)DzGjv=pZDCynQt#y((+|hwA@8*(b z+O13dn}CgFDP6Pd~cr zhyEp`jpNwCAS6#>!&pPd8qzg|xWuCiP(OlBij~A0#Slt<{MRpe)QOgaw6Pe_mp;i> ziLu>QrO8leCUGAS#}wcNoTN(pChi(E_az-9+dRRhmx2eds1JRSt&-K09s-$m3$(9D z(}-gVc!!lZf2&Y&&@1C8xQOyhI(i7OOfg=t;qN03#DX`D3rK6(G^V?f7^#+Bnns+V z5SVv59}@aRSXBsK_`M$9LdOpPepeEzS5rru4S`FI2~=`p??Sg$U%Vp^Phz8bbEKBD zXzK*{J&k?3YQSWJ;?x?&k(aJG#AN@IHM(Sr^pEMPTfp!$jZA#k(TY29s2Zb&0PTr&H6D;IC<}$L5>B zMK0=Mq)_5|xa?*{n@Q zTx9euY*rE%Nq$M(Iz-$jfxd)vfojF6+Hu7BiqB6feDoyzc=5{OD5=j=I}+#17vF~Y zV%eVp_z+-jecdUpR@)KBMt(K${emNJH2K+}EjISOPfObo*ApCMtpROESWkRyOI%NY z?V6UvMV^_GxRSU?1|pl4BQBD-e*pjh|NrSg*Gd2Y00v1!K~w_(Z0qr?u;L@D00000 LNkvXXu0mjfSbfo! literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Src/Components/UI/NaviBar/NavigationView.swift b/Visual_Novel_iOS/Src/Components/UI/NaviBar/NavigationView.swift index beac538..42037ed 100644 --- a/Visual_Novel_iOS/Src/Components/UI/NaviBar/NavigationView.swift +++ b/Visual_Novel_iOS/Src/Components/UI/NaviBar/NavigationView.swift @@ -49,6 +49,20 @@ import UIKit return v }() + @objc lazy var centerStackH : UIStackView = { + let v = UIStackView() + v.spacing = 5 + v.alignment = .center + addSubview(v) + v.snp.makeConstraints { make in + make.centerY.equalTo(backButton) + make.centerX.equalToSuperview() + make.leading.greaterThanOrEqualTo(leftStackH.snp.trailing) + make.trailing.lessThanOrEqualTo(rightStackH.snp.leading) + } + return v + }() + @objc lazy var backButton: UIButton = { let backButton = UIButton(type: .custom) leftStackH.addArrangedSubview(backButton) @@ -69,16 +83,30 @@ import UIKit titleLabel.preferredMaxLayoutWidth = 120 titleLabel.textAlignment = .center titleLabel.font = .t.ttm//.fredokaOne(size: 18) - addSubview(titleLabel) +// addSubview(titleLabel) + centerStackH.addArrangedSubview(titleLabel) - titleLabel.snp.makeConstraints { make in - make.centerY.equalTo(backButton) - make.centerX.equalToSuperview() - make.leading.greaterThanOrEqualTo(leftStackH.snp.trailing) - make.trailing.lessThanOrEqualTo(rightStackH.snp.leading) - } +// titleLabel.snp.makeConstraints { make in +// make.centerY.equalTo(backButton) +// make.centerX.equalToSuperview() +// make.leading.greaterThanOrEqualTo(leftStackH.snp.trailing) +// make.trailing.lessThanOrEqualTo(rightStackH.snp.leading) +// } return titleLabel }() + + @objc lazy var iconImgView: UIImageView = { + let icon = UIImageView() + icon.isHidden = true + icon.cornerRadius = 10.0 + icon.snp.makeConstraints { make in + make.width.height.equalTo(20) + } + centerStackH.addArrangedSubview(icon) + + return icon + }() + /// btn 44x44 is ok @objc lazy var rightStackH: UIStackView = { @@ -131,6 +159,8 @@ import UIKit //backgroundColor = .c.cbd backgroundColor = .clear + + iconImgView.backgroundColor = .blue } @available(*, unavailable) diff --git a/Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleCell.swift b/Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleCell.swift similarity index 100% rename from Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleCell.swift rename to Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleCell.swift diff --git a/Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleDataSource.swift b/Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleDataSource.swift similarity index 100% rename from Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleDataSource.swift rename to Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleDataSource.swift diff --git a/Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleItemModel.swift b/Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleItemModel.swift similarity index 100% rename from Visual_Novel_iOS/Src/Components/UI/PagingView/BgSegmentedView/JXSegmentedTagStyleItemModel.swift rename to Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/BgSegmentedView/JXSegmentedTagStyleItemModel.swift diff --git a/Visual_Novel_iOS/Src/Components/UI/PagingView/CLSegmentedViews.swift b/Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/CLSegmentedViews.swift similarity index 100% rename from Visual_Novel_iOS/Src/Components/UI/PagingView/CLSegmentedViews.swift rename to Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/CLSegmentedViews.swift diff --git a/Visual_Novel_iOS/Src/Components/UI/PagingView/PagingView.swift b/Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/PagingView.swift similarity index 100% rename from Visual_Novel_iOS/Src/Components/UI/PagingView/PagingView.swift rename to Visual_Novel_iOS/Src/Components/UI/Placeholder/PagingView/PagingView.swift diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputSafeView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputSafeView.swift new file mode 100644 index 0000000..691f378 --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputSafeView.swift @@ -0,0 +1,34 @@ +// +// InputSafeView.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/21. +// + +import UIKit + +class InputSafeView: UIView { + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + // 1. 自身不可见/无交互 → 剪枝 + if alpha <= 0.01 || isHidden || !isUserInteractionEnabled { return nil } + + // 2. 自身命中(含子视图)→ 正常返回 + let hit = super.hitTest(point, with: event) + if hit != nil { return hit } + + // 3. 自身没命中,继续测**所有子视图(含超框)** + for sub in subviews.reversed() { + let converted = sub.convert(point, from: self) + if sub.bounds.contains(converted) { + return sub.hitTest(converted, with: event) + } else { + if sub is SessionPhoneExpandView { + return sub.hitTest(converted, with: event) + } + } + } + return nil + } + +} diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputStackView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputStackView.swift new file mode 100644 index 0000000..a61726a --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/InputStackView.swift @@ -0,0 +1,29 @@ +// +// InputStackView.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/21. +// + +import UIKit + +class InputStackView: UIStackView { + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + // 1. 自身不可见/无交互 → 剪枝 + if alpha <= 0.01 || isHidden || !isUserInteractionEnabled { return nil } + + // 2. 自身命中(含子视图)→ 正常返回 + let hit = super.hitTest(point, with: event) + if hit != nil { return hit } + + // 3. 自身没命中,继续测**所有子视图(含超框)** + for sub in subviews.reversed() { + if sub is SessionInputOperateView { + let converted = sub.convert(point, from: self) + return sub.hitTest(converted, with: event) + } + } + return nil + } +} diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionCoverView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionCoverView.swift new file mode 100644 index 0000000..ae7a304 --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionCoverView.swift @@ -0,0 +1,124 @@ +// +// SessionCoverView.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/21. +// + +import UIKit + +class SessionCoverView: UIView { + + var aiAnswerBlock: (()->Void)? = nil + + lazy var expandBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.setImage(UIImage(named: "role_chat_expand_open"), for: .normal) + btn.setImage(UIImage(named: "role_chat_expand_close"), for: .selected) + btn.backgroundColor = .clear + btn.isUserInteractionEnabled = false + return btn + }() + + lazy var lineView: UIView = { + let view = UIView() +// view.backgroundColor = UIColor.init(white: 1.0, alpha: 0.2) + view.backgroundColor = .red + view.cornerRadius = 0.5 + view.alpha = 0 + return view + }() + + lazy var phoneBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.setImage(UIImage(named: "role_chat_expand_phone"), for: .normal) + btn.addTarget(self, action: #selector(phoneBtnClicked), for: .touchDown) + btn.alpha = 0 + return btn + }() + + lazy var emailBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.setImage(UIImage(named: "role_chat_expand_phone"), for: .normal) + btn.addTarget(self, action: #selector(emailBtnClicked), for: .touchDown) + btn.alpha = 0 + return btn + }() + + lazy var bgview: UIView = { + let view = UIView() + view.backgroundColor = .clear + view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(bgviewTap))) + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func bgviewTap() { + print("bgviewTap-bgviewTap") + } + + @objc func phoneBtnClicked() { + self.aiAnswerBlock?() + } + + @objc func emailBtnClicked() { + self.aiAnswerBlock?() + } + + func expandStatusChanged(_ expand: Bool) { + expandBtn.isSelected = expand + self.backgroundColor = expand ? .orange : .blue + UIView.animate(withDuration: 0.25) { + self.phoneBtn.alpha = expand ? 1 : 0 + self.emailBtn.alpha = expand ? 1 : 0 + self.lineView.alpha = expand ? 1 : 0 + } + } + + private func setupUI() { + + addSubview(expandBtn) + addSubview(lineView) + addSubview(bgview) + addSubview(phoneBtn) + addSubview(emailBtn) + + expandBtn.snp.makeConstraints { make in + make.bottom.left.right.equalToSuperview() + make.height.equalTo(44) + } + + lineView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.height.equalTo(1.0) + make.width.equalTo(10) + make.bottom.equalTo(expandBtn.snp.top) + } + + phoneBtn.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(lineView.snp.top).offset(-17) + make.width.height.equalTo(30) + } + + emailBtn.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(phoneBtn.snp.top).offset(-20) + make.width.height.equalTo(30) + } + + bgview.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.bottom.equalTo(lineView.snp.top) + } + } +} diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionInputOperateView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionInputOperateView.swift index 0c2bbe3..ced3819 100644 --- a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionInputOperateView.swift +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionInputOperateView.swift @@ -1,4 +1,5 @@ // +// // SessionInputOperateView.swift // @@ -23,19 +24,20 @@ enum InputOperateState { class SessionInputOperateView: UIView { weak var delegate: SessionInputOperateViewDelegate? - var safeView: UIView! - var giftButton: EPIconPrimaryButton! + var safeView: InputSafeView! + + var expandView: SessionPhoneExpandView! var block: UIView! var effectViewOnBlock: UIVisualEffectView! var modeButton: UIButton! - var rightStackH: UIStackView! - var helpButton: UIButton! - var moreButton: UIButton! - var fakeTextfield: UITextField! var voiceHoldView: UIView! + var inputTextView: CLTextView! + let minTextViewHeight = 40.0//56.0 + var sendBtn: UIButton! + //var tapInputFieldAction: (() -> Void)? // var voiceHoldAction: ((_ onVoice: Bool) -> Void)? @@ -45,6 +47,9 @@ class SessionInputOperateView: UIView { override init(frame: CGRect) { super.init(frame: frame) + self.clipsToBounds = false // 允许子视图绘制到框外 + self.isUserInteractionEnabled = true + setupViews() setupData() setupEvent() @@ -54,28 +59,47 @@ class SessionInputOperateView: UIView { fatalError("init(coder:) has not been implemented") } + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + // 1. 自身不可见/无交互 → 剪枝 + if alpha <= 0.01 || isHidden || !isUserInteractionEnabled { return nil } + + // 2. 自身命中(含子视图)→ 正常返回 + let hit = super.hitTest(point, with: event) + if hit != nil { return hit } + + // 3. 自身没命中,继续测**所有子视图(含超框)** + for sub in subviews.reversed() { + let converted = sub.convert(point, from: self) + return sub.hitTest(converted, with: event) + } + return nil + } + private func setupViews() { safeView = { - let v = UIView() - v.backgroundColor = .clear + let v = InputSafeView() +// v.backgroundColor = .orange addSubview(v) v.snp.makeConstraints { make in - make.leading.top.trailing.equalToSuperview() + make.left.top.right.equalToSuperview() // make.bottom.equalToSuperview().offset(-UIWindow.safeAreaBottom*0.5-16) make.bottom.equalToSuperview() } return v }() - giftButton = { - let v = EPIconPrimaryButton(radius: .round, iconSize: .large, iconCode: .giftBorder) - v.addTarget(self, action: #selector(tapGiftButton), for: .touchUpInside) + expandView = { + let v = SessionPhoneExpandView() + safeView.clipsToBounds = false + safeView.isUserInteractionEnabled = true + safeView.addSubview(v) +// v.backgroundColor = .blue v.snp.makeConstraints { make in - make.leading.equalToSuperview().offset(24) - make.top.equalToSuperview().offset(16) - make.bottom.equalToSuperview().offset(-16) - make.size.equalTo(v.bgImageSize()) + make.left.equalToSuperview().offset(24) + make.top.equalToSuperview().inset(16).priority(999) + make.bottom.equalToSuperview().inset(16) + make.width.height.equalTo(44) } return v }() @@ -83,13 +107,13 @@ class SessionInputOperateView: UIView { block = { let v = UIView() v.backgroundColor = .c.cseln - v.layer.cornerRadius = 24 - v.layer.masksToBounds = true + v.cornerRadius = 24 safeView.addSubview(v) v.snp.makeConstraints { make in - make.leading.equalTo(giftButton.snp.trailing).offset(12) - make.trailing.equalToSuperview().offset(-24) - make.height.equalTo(48) + make.left.equalTo(expandView.snp.right).offset(12) + make.right.equalToSuperview().offset(-24) +// make.height.equalTo(48) + make.top.equalToSuperview().inset(16) make.centerY.equalToSuperview() } return v @@ -108,75 +132,51 @@ class SessionInputOperateView: UIView { modeButton = { let v = UIButton() block.addSubview(v) - let size = CGSize(width: 20, height: 20) - let image = MWIconFont.image(fromIcon: .voiceMsg, size: size, color: .white) + let size = CGSize(width: 26, height: 26) +// let image = MWIconFont.image(fromIcon: .voiceMsg, size: size, color: .white) + let image = UIImage(named: "role_chat_voice") v.setImage(image, for: .normal) v.touchAreaInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) v.addTarget(self, action: #selector(tapModeButton), for: .touchUpInside) v.snp.makeConstraints { make in make.size.equalTo(size) - make.leading.equalToSuperview().offset(16) - make.centerY.equalToSuperview() + make.left.equalToSuperview().inset(12) + make.bottom.equalToSuperview().inset(11) } return v }() - rightStackH = { - let v = UIStackView() - v.spacing = 20 - v.alignment = .center + sendBtn = { + let btn = UIButton() + block.addSubview(btn) + btn.setImage(UIImage(named: "role_chat_send"), for: .normal) + btn.addTarget(self, action: #selector(tapSendButton), for: .touchUpInside) + btn.snp.makeConstraints { make in + make.bottom.equalToSuperview().inset(2) + make.right.equalToSuperview().inset(3) + make.width.equalTo(60) + make.height.equalTo(44) + } + return btn + }() + + inputTextView = { + let v = CLTextView() block.addSubview(v) - v.snp.makeConstraints { make in - make.trailing.equalToSuperview().offset(-16) - make.centerY.equalToSuperview() - } - return v - }() - - helpButton = { - let v = UIButton() - rightStackH.addArrangedSubview(v) - let size = CGSize(width: 20, height: 20) - let image = MWIconFont.image(fromIcon: .prompt, size: size, color: .white) - v.setImage(image, for: .normal) - v.touchAreaInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) - v.addTarget(self, action: #selector(tapHelpButton), for: .touchUpInside) - v.snp.makeConstraints { make in - make.size.equalTo(size) - } - return v - }() - - moreButton = { - let v = UIButton() - rightStackH.addArrangedSubview(v) - let size = CGSize(width: 20, height: 20) - let image = MWIconFont.image(fromIcon: .add, size: size, color: .white) - v.setImage(image, for: .normal) - v.touchAreaInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) - v.addTarget(self, action: #selector(tapMoreButton), for: .touchUpInside) - v.snp.makeConstraints { make in - make.size.equalTo(size) - } - return v - }() - - fakeTextfield = { - let v = UITextField() + v.placeholder = "Type a message..." + v.placeholderTextColor = UIColor.init(white: 1, alpha: 0.4) + v.backgroundColor = .clear + v.limit.maxCharacterNumber = 500 v.font = .t.tll - v.textColor = .c.ctpn - block.addSubview(v) + v.textColor = UIColor.white + v.font = UIFont.systemFont(ofSize: 14) v.snp.makeConstraints { make in + make.left.equalTo(modeButton.snp.right).offset(10) + make.right.equalTo(sendBtn.snp.left).offset(-10) + make.height.equalTo(minTextViewHeight) make.centerY.equalToSuperview() - make.leading.equalTo(modeButton.snp.trailing).offset(16) - make.trailing.equalTo(rightStackH.snp.leading).offset(-16) + make.top.equalToSuperview().inset(4) } -// v.text = "Chat" - v.attributedPlaceholder = "Chat".withAttributes([ - .font(.t.tll), - .textColor(UIColor.c.ctsn), - ]) - v.delegate = self return v }() @@ -185,19 +185,26 @@ class SessionInputOperateView: UIView { block.addSubview(v) v.snp.makeConstraints { make in make.top.bottom.equalToSuperview() - make.leading.trailing.equalTo(fakeTextfield) + make.left.right.equalTo(inputTextView) } + let voiceImgView = UIImageView(image: UIImage(named: "role_chat_remind_voice")) + let label = UILabel() label.font = .t.tll label.textColor = .white label.textAlignment = .center label.text = "Hold to Talk" - v.addSubview(label) - label.snp.makeConstraints { make in - make.leading.trailing.equalToSuperview() - make.centerY.equalToSuperview() + + let stackView = UIStackView(arrangedSubviews: [voiceImgView, label]) + stackView.spacing = 3 + stackView.alignment = .center + stackView.distribution = .fill + v.addSubview(stackView) + stackView.snp.makeConstraints { make in + make.centerX.centerY.equalToSuperview() } + return v }() } @@ -207,6 +214,11 @@ class SessionInputOperateView: UIView { } private func setupEvent() { + + inputTextView.textPublisher.sink {[weak self] str in + self?.fixTextViewHeight() + }.store(in: &cancellables) + // 添加长按手势 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:))) longPress.minimumPressDuration = 0.5 // 长按时间,默认 0.5 秒 @@ -222,22 +234,37 @@ class SessionInputOperateView: UIView { // MARK: - Helper private func refreshByState(stateOf: InputOperateState) { - let size = CGSize(width: 20, height: 20) +// let size = CGSize(width: 26, height: 26) switch stateOf { case .text: - fakeTextfield.isHidden = false +// fakeTextfield.isHidden = false + inputTextView.isHidden = false voiceHoldView.isHidden = true - let image = MWIconFont.image(fromIcon: .voiceMsg, size: size, color: .white) +// let image = MWIconFont.image(fromIcon:4 .voiceMsg, size: size, color: .white) + let image = UIImage(named: "role_chat_voice") modeButton.setImage(image, for: .normal) case .voice: - fakeTextfield.isHidden = true +// fakeTextfield.isHidden = true + inputTextView.isHidden = true voiceHoldView.isHidden = false - let image = MWIconFont.image(fromIcon: .iconKeyboard, size: size, color: .white) + let image = UIImage(named: "role_chat_keyboard") modeButton.setImage(image, for: .normal) AudioRecordTool.audioAuth() } } + private func fixTextViewHeight(){ + if inputTextView.contentSize.height > minTextViewHeight { + inputTextView.snp.updateConstraints { make in + make.height.equalTo(max(inputTextView.contentSize.height, 48)) // 73 + } + }else{ + inputTextView.snp.updateConstraints { make in + make.height.equalTo(inputTextView.contentSize.height) //minTextViewHeight + } + } + } + // MARK: - Action @objc private func tapGiftButton() { @@ -253,6 +280,10 @@ class SessionInputOperateView: UIView { } } + @objc private func tapSendButton() { + + } + @objc private func tapMoreButton() { delegate?.operateTapMoreAction() } diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionPhoneExpandView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionPhoneExpandView.swift new file mode 100644 index 0000000..1dcdf70 --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/Input/SessionPhoneExpandView.swift @@ -0,0 +1,101 @@ +// +// SessionPhoneExpandView.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/20. +// + +import Foundation + +class SessionPhoneExpandView: UIView { + + lazy var expandView: SessionCoverView = { + let view = SessionCoverView() +// view.backgroundColor = UIColor.init(white: 0, alpha: 0.4) + view.backgroundColor = .blue + view.cornerRadius = 22.0 + view.aiAnswerBlock = { [weak self] in + self?.tapClicked() + } + let tap = UITapGestureRecognizer(target: self, action: #selector(tapClicked)) + view.addGestureRecognizer(tap) + return view + }() + + var expand: Bool = false + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + // 1. 自身不可见/无交互 → 剪枝 + if alpha <= 0.01 || isHidden || !isUserInteractionEnabled { return nil } + + // 2. 自身命中(含子视图)→ 正常返回 + let hit = super.hitTest(point, with: event) + if hit != nil { return hit } + + // 3. 自身没命中,继续测**所有子视图(含超框)** + for sub in subviews.reversed() { + let converted = sub.convert(point, from: self) + if sub.bounds.contains(converted) { + return sub.hitTest(converted, with: event) + } + } + return nil + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.clipsToBounds = false // 允许子视图绘制到框外 + setupViews() + setupData() + setupEvent() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func tapClicked() { + print("tapClicked 被调用 - expand: \(expand)") + self.expandView.expandStatusChanged(!self.expand) + UIView.animate(withDuration: 0.25) { + // 同时调整自身和expandView的高度 + self.expandView.snp.updateConstraints { make in + make.height.equalTo(self.expand ? 44 : 152) + } + + self.layoutIfNeeded() + } completion: { finish in + if finish { + self.expand = !self.expand + + print("动画完成 - 新的 expand 状态: \(self.expand)") + } + } + + } + + private func setupViews() { + + addSubview(expandView) + + expandView.snp.makeConstraints { make in + make.height.width.equalTo(44.0) + make.bottom.equalToSuperview() + make.centerX.equalToSuperview() + } + + // 设置自身的高度约束,允许动态调整 + self.snp.makeConstraints { make in + make.height.equalTo(44.0) + } + + } + + private func setupData() { + + } + + private func setupEvent() { + + } +} diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController+Input.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController+Input.swift index 0b4f7f4..6a22d7d 100755 --- a/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController+Input.swift +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController+Input.swift @@ -14,8 +14,9 @@ extension SessionController { func setupInputView() { bottomViewsStackV = { - let v = UIStackView() + let v = InputStackView() v.axis = .vertical + v.clipsToBounds = false // 允许子视图绘制到框外,支持超框点击 view.addSubview(v) v.snp.makeConstraints { make in make.leading.trailing.equalToSuperview() @@ -97,7 +98,7 @@ extension SessionController { } inputBar.textView.textPublisher.sink {[weak self] string in - self?.inputEntrance.fakeTextfield.text = string + self?.inputEntrance.inputTextView.text = string }.store(in: &cancellables) } diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController.swift index 23f3031..71196f2 100755 --- a/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController.swift +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/SessionController.swift @@ -13,7 +13,7 @@ class SessionController: CLBaseViewController { // var headView: SessionAIHeadView! // MARK: BottomViews - var bottomViewsStackV : UIStackView! + var bottomViewsStackV : InputStackView! var inputEntrance: SessionInputOperateView! var inputBar: SessionInputView! var moreView: IMMoreItemView! @@ -23,6 +23,7 @@ class SessionController: CLBaseViewController { var voiceHoldView: IMVoiceHoldView! var pureBgOperateView:SessionPureBgOperateView! + var titleStr: String? = nil // 长按菜单响应的cell var menuCell: SessionCell? @@ -78,9 +79,10 @@ class SessionController: CLBaseViewController { } } - convenience init(conversationId: String) { + convenience init(conversationId: String, title: String? = "") { self.init() self.conversationId = conversationId + self.titleStr = title conversation = V2NIMConversation() let stings = conversationId.components(separatedBy: "|") @@ -149,11 +151,14 @@ class SessionController: CLBaseViewController { extension SessionController { func setupUI() { - view.clipsToBounds = true + view.clipsToBounds = false // 允许子视图绘制到框外,支持超框点击 navigationView.backgroundColor = .clear - + navigationView.backButton.setImage(nil, for: .normal) + sessionNavigationView = { let v = SessionNavigationView() + v.navigationView.title = self.titleStr ?? "" + v.navigationView.iconImgView.isHidden = false view.addSubview(v) v.snp.makeConstraints { make in make.top.leading.trailing.equalToSuperview() @@ -368,9 +373,9 @@ extension SessionController { } func doKeyboardShowActions(){ - self.inputBar.isHidden = false + self.inputBar.isHidden = true - self.inputEntrance.isHidden = true + self.inputEntrance.isHidden = false // self.moreView.isHidden = true //showMoreItems(show: false) } diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Session/View/SessionNavigationView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Session/View/SessionNavigationView.swift index 767d780..112c2c8 100644 --- a/Visual_Novel_iOS/Src/Modules/Chat/Session/View/SessionNavigationView.swift +++ b/Visual_Novel_iOS/Src/Modules/Chat/Session/View/SessionNavigationView.swift @@ -180,11 +180,13 @@ class SessionNavigationView: UIView { private func setupViews() { addNavigationView() navigationView.bgView.alpha = 0 + navigationView.backButton.setImage(UIImage(named: "role_back_white"), for: .normal) navigationView.paddingRightForRightStack = 2 likeView = { let v = HeartLikeCountView(viewSize: .xl) v.purIconStyle() + v.isHidden = true navigationView.rightStackH.addArrangedSubview(v) return v }() @@ -192,7 +194,10 @@ class SessionNavigationView: UIView { naviMoreButton = { let v = EPIconGhostButton(radius: .none, iconSize: .medium, iconCode: .chatroomMore) navigationView.rightStackH.addArrangedSubview(v) - + v.setBackgroundImage(nil, for: .highlighted) + v.setImage(UIImage(named: "role_chat_setting"), for: .normal) + v.setImage(UIImage(named: "role_chat_setting"), for: .selected) + v.setImage(UIImage(named: "role_chat_setting"), for: .highlighted) v.snp.makeConstraints { make in make.size.equalTo(CGSize(width: 52, height: 44)) } diff --git a/Visual_Novel_iOS/Src/Modules/Roles/View/RolesRootPageView.swift b/Visual_Novel_iOS/Src/Modules/Roles/View/RolesRootPageView.swift index 8a66cf2..29a22a7 100644 --- a/Visual_Novel_iOS/Src/Modules/Roles/View/RolesRootPageView.swift +++ b/Visual_Novel_iOS/Src/Modules/Roles/View/RolesRootPageView.swift @@ -122,7 +122,8 @@ extension RolesRootPageView: UICollectionViewDelegate, UICollectionViewDataSourc } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - + let sessionId = "439217670979585@r@t" + AppRouter.goChatVC(conversationId: sessionId, title: "Character · 18", complete: nil) } func collectionView(_ collectionView: UICollectionView, diff --git a/Visual_Novel_iOS/Src/Utils/Router/AppRouterChat.swift b/Visual_Novel_iOS/Src/Utils/Router/AppRouterChat.swift index ca61afd..9b4132e 100644 --- a/Visual_Novel_iOS/Src/Utils/Router/AppRouterChat.swift +++ b/Visual_Novel_iOS/Src/Utils/Router/AppRouterChat.swift @@ -35,11 +35,11 @@ extension AppRouter{ complete?() } - static func goChatVC(conversationId: String?, complete: (() -> Void)? = nil) { + static func goChatVC(conversationId: String?, title: String? = nil, complete: (() -> Void)? = nil) { guard UserCore.shared.checkUserLoginIfNotPushUserToLogin() else{return} guard let sessionId = conversationId else{return} - let vc = SessionController(conversationId: sessionId) + let vc = SessionController(conversationId: sessionId, title: title) let nvc = UIWindow.getTopViewController(base: UIWindow.applicationKey?.rootViewController)?.navigationController nvc?.pushViewController(vc, animated: true) complete?()