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 0000000..305bc4b Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@3x.png new file mode 100644 index 0000000..e826261 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/back_black.imageset/back_black@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/Contents.json new file mode 100644 index 0000000..9f05abe --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_back_white@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_back_white@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@2x.png new file mode 100644 index 0000000..fc57aa2 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@3x.png new file mode 100644 index 0000000..7c68f8e Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_back_white.imageset/role_back_white@3x.png differ 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 0000000..2d282da Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@2x.png differ 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 0000000..47be72a Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_close.imageset/role_chat_change_close@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/Contents.json new file mode 100644 index 0000000..c2e0699 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_change_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_change_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@2x.png new file mode 100644 index 0000000..8477589 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@3x.png new file mode 100644 index 0000000..0b759ce Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_normal.imageset/role_chat_change_normal@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/Contents.json new file mode 100644 index 0000000..dbb410c --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_change_open@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_change_open@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@2x.png new file mode 100644 index 0000000..5f7325f Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@3x.png new file mode 100644 index 0000000..8056b22 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_change_open.imageset/role_chat_change_open@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/Contents.json new file mode 100644 index 0000000..a941ba2 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_expand_close@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_expand_close@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@2x.png new file mode 100644 index 0000000..6bccf77 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@3x.png new file mode 100644 index 0000000..441648d Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_close.imageset/role_chat_expand_close@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/Contents.json new file mode 100644 index 0000000..e00d168 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_expand_open@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_expand_open@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@2x.png new file mode 100644 index 0000000..fe2375e Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@3x.png new file mode 100644 index 0000000..5aa01c4 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_open.imageset/role_chat_expand_open@3x.png differ 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 0000000..c8389d8 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@2x.png differ 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 0000000..4870827 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_expand_phone.imageset/role_chat_expand_phone@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/Contents.json new file mode 100644 index 0000000..09b7c46 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_keyboard@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_keyboard@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@2x.png new file mode 100644 index 0000000..fa573ff Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@2x.png differ 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 0000000..dd9a63f Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_keyboard.imageset/role_chat_keyboard@3x.png differ 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 0000000..cb3eb16 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@2x.png differ 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 0000000..7b8538e Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_phone_vip.imageset/role_chat_phone_vip@3x.png differ 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 0000000..19c571d Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@3x.png new file mode 100644 index 0000000..e47b6cf Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_remind_voice.imageset/role_chat_remind_voice@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/Contents.json new file mode 100644 index 0000000..a34a740 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_send@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_send@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@2x.png new file mode 100644 index 0000000..ce12aec Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@3x.png new file mode 100644 index 0000000..68e3a2f Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_send.imageset/role_chat_send@3x.png differ 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 0000000..6716771 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@2x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@3x.png new file mode 100644 index 0000000..3908b80 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_setting.imageset/role_chat_setting@3x.png differ diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/Contents.json new file mode 100644 index 0000000..7d24f27 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_vip@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_vip@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@2x.png new file mode 100644 index 0000000..a9d3e97 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@2x.png differ 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 0000000..4794ac5 Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_vip.imageset/role_chat_vip@3x.png differ 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 0000000..64ff19f Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@2x.png differ 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 0000000..869122a Binary files /dev/null and b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_voice.imageset/role_chat_voice@3x.png differ 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?()