From 3543d9c9e8b370e976b7d2a45179ed8d4a913359 Mon Sep 17 00:00:00 2001 From: mh <729263080@qq.com> Date: Thu, 30 Oct 2025 14:13:23 +0800 Subject: [PATCH] =?UTF-8?q?chat=20setting=20=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contents.json | 22 ++ .../role_chat_buttle_chat@2x.png | Bin 0 -> 1316 bytes .../role_chat_buttle_chat@3x.png | Bin 0 -> 2914 bytes .../Contents.json | 22 ++ .../role_chat_buttle_lock@2x.png | Bin 0 -> 423 bytes .../role_chat_buttle_lock@3x.png | Bin 0 -> 894 bytes .../Contents.json | 22 ++ .../role_chat_buttle_stone@2x.png | Bin 0 -> 1023 bytes .../role_chat_buttle_stone@3x.png | Bin 0 -> 2045 bytes .../Contents.json | 22 ++ .../role_chat_buttle_vip@2x.png | Bin 0 -> 1387 bytes .../role_chat_buttle_vip@3x.png | Bin 0 -> 3261 bytes .../Cell/ChatButtleCollectionCell.swift | 144 ++++++++++++ .../Setting/Cell/SubItemsContainerCell.swift | 213 ++++++++++++++++++ .../Setting/View/ChatSettingSwipeView.swift | 206 +---------------- 15 files changed, 449 insertions(+), 202 deletions(-) create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/role_chat_buttle_chat@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/role_chat_buttle_chat@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/role_chat_buttle_lock@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/role_chat_buttle_lock@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_stone.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_stone.imageset/role_chat_buttle_stone@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_stone.imageset/role_chat_buttle_stone@3x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/Contents.json create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/role_chat_buttle_vip@2x.png create mode 100644 Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/role_chat_buttle_vip@3x.png create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/ChatButtleCollectionCell.swift create mode 100644 Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/SubItemsContainerCell.swift diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/Contents.json new file mode 100644 index 0000000..8d91299 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_buttle_chat@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_buttle_chat@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/role_chat_buttle_chat@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_chat.imageset/role_chat_buttle_chat@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b20b5c1c27ce930332c208ac2aff7cab129b87d7 GIT binary patch literal 1316 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 M07*qoM6N<$f*X!_O#lD@ literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/Contents.json new file mode 100644 index 0000000..bf7b2f6 --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_buttle_lock@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_buttle_lock@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/role_chat_buttle_lock@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_lock.imageset/role_chat_buttle_lock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..92c36938e17bdc130903048eaa1de0973e394d5e GIT binary patch literal 423 zcmV;Y0a*TtP)#LdG8+Y z|ICq?1)e;jz#@}Xk&8GnkNy56u*~IP7C0MV>%^S3{SgflmF{yaMh zWMlX~%%ht&2T0ERISW|kvRBQ)_JO0v!UC0Q0vNnE;1vycvrv!EU$658ApiL7-)+*m zH}f7HJ?pxW*0%?s7HZxsJisrMnW?3E)a&&F00960Hw7;n00006Nkl5xM7^X$=xnZpJy;+l_^@pD z5V4v4fnhH_1w}zoKJ{c|1Ywklt2;lpb9bBBncbRZMj^V~v-i8_oc+F;`*Rou|ET#E zjvwx;6z2E2JqyPg68mF~@*@Z=ywC&LSFwmZ9&5VX;`IUC3ggM}rLB2Ei9Z2^Lmc>a z1lUG``+)1WM69j3XEV)RbyvdCu)IcMfg~Uvu&~Y|;G#LFn5Jo0PanIo*7P|5SHj4k zo&$sdxCDS%!Z(n!J-URo$e~a83NdKNW^?u6qPY|15GSrxWB|xV()Z-{)M(e+bf)WF zYEu41w%A;8;fqNVZ&^kw_g|nKRFcASRy}3Z@|o(S5WpZ6UPO z-wj$$Bkm%NO}OZGMwqWy_>{7q7ce1*PJ12D0}QPxeuU?BgpT0k)WP87=e+_G;XIkA z?nihEG=6jF^^hV=U{Wl*+vIcXo`q@IIMYL#!78xu8FROzXJG`o$5OV@6d;`UnGScr zvoHXzrrNy)jD|p%e8$}6=tI~g^Iy{bGhu}F(Wt!Yd~<(@4wkQiWh^ zJ{oSL8cL?0$qUvzo3IF^9(K&45<0^H+o&QXX@9Q!G2-e)hAkD@=~IG}=C)oYETSSY zJ=&d_l_q)uRU0q(u{mi%PTlPu8yFiXe)J3SU-lCK0RR6din;*QSCV#3m zZ{72QA7!5__BqM(fp1u8jT;m!aik`5*j!+5S_x3etMO9VR(v=|#U0P6Rn%BbYM34) z*7-q|RaXbYih(TzN-tRVbGM`nA@4t_x`r|jBOXt;oM z4<}!-Pq$n%2~2Nh1Fx&;H~7G?gr5aw5jd`ZCmC|Uf!A`mT@GGXD~5EPd=X6&p0;_? z2@QwLX3^`q>?;donoS44rX~MLbg8k(*p#Gkcl@;EgsL3nQ!M&r>++ta!Y>AQ)Z`6q zCp2ob#EFH@46IIeOwM|;D3vQk%kiVy+uEd~78lrg@V1)ldhu0`ymsA=CJ&!u+09{k zIhNCVps{CB4toH~jtVxtqRXq!=_@N|CXX>V@8qVsT;*@SL>-s^cy9EX%!xPS&Ll)> zbLTTggd?nw2b!##duMPG13<)6(MytOmnt#=0O?TMQopilQh2cN(< zp9P0s61Tq=cfW&QzgPTzOZ;_*`1h{jIp7uhrhOaqA;jlM-e`ct6cWZSA7q zxmfSnKEnkcz2SN1=~;kAVQ3ggsx&ZMK#yRVoha{-DOQ^@cRJN;4;bESqoN;$@7;0u|Gn-SfuLmcxOs-sSDPv316#FJ92)!;uUA()KR9rwy!002ovPDHLkV1m-b=HmbW literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_stone.imageset/role_chat_buttle_stone@3x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_stone.imageset/role_chat_buttle_stone@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac6e0e349241d3f1ab2ce7c192398049d69b99f GIT binary patch literal 2045 zcmVfFCp@P5Gkrg*L$rwxk9cTcd^81VS2#F$6;j z4Psj~En*b0XlX(bYcPhUr1ph&x4S@DcH3<##nqBRZP~J$?e5&;|2#9ZEp%x+JI{VF z@$Nm(IrrRq?)^Py&fb}f|H1Zu=&=v&n?9XK{YH*Sk2#AoCMVOQ+-k5HXAzUoCI`C2 zEsl^Ye20TRwP^0*q38P?b7m>is9nP}z93y_FBbY+Ucy<5(c-QrWSnL>?kz=97Yhxa z!}ziQU4mX9)NJ~4U)Y66anN5??K%t1_;|odSHX>siu5LS`ZVc6dU4Q~=2>2 z(s~BIN~FR(E@37GwPK)e(|w%rBQZ^vaa-K#Hzng{U2}0m1g9yhbu_uFr6TZ5gC%VDZ?jRiOnt=! zbaT*`GD{VEKXADu?^SAH3tgZtYs{}Yzl;h$<|BMQcTVszap+|}gEGIfoHlHF#eSmw4n=UF%ux5m2@AxSDyD zN@X37`dS{l`0Mb(&=2`E?)9sAm!}ilseD})=SM9_yCgqfI$*<=iI$=CDx=8sT=c-> z6R0hSEztOKoFxqMI4k{HR_mLU^S2L%UZ)>95BltEm{l0hYV#YUgd>BuYzuv1(jZ`LK%hKvR`$S~;L_T&c0@D@0oDu%a zr`W(UpCjKn{S5Ros;S5P2YiU_l-RCK+qA*Qa9J`UQp%-6ke6s0=$-PB#WTi=iK(i1 zcp>0IP?N@_qbnJvLA*HOClO3nYL7O_b9~qLu+VSkHjkeO5t1*+4YusMfnB@SvU~S+ zwC~O6?7&~%hwbk&x?gb)?8p1MjeqnQZydn-`{3vy?AT#A{yLm|15WkB(7)mIn^^at z+q1a+73Xg{Vw;lucZ@yKovMoc^7Tj#NseGB%#UgA1ZM9lW*ApCT10pq(^!o&mi2fm zMXA5A{dsooyo22@?q%jKkO9K=yL3iCJRdmCp!F+++Ol{OM( z_A-@aTtVzYv@_7XcMs5g=Nh_y_(gp5EAEwzc)p$@GV_WBl6iRcplzIHA**dCYiwADyr*aH8J#_Ns;xrTk}d`Z?;%Tbgtl2n zj3~n$b-yOqrE^gwEUx)v>i%2HAG2}jpd4y&Ow6>+LWykZC* zWm} zVvs-Xs{j+IA!sYfUDkA2%R)*7@B;eTC{IJZap^-IOnrJr*K9OfSzdcY5CzZ!~-a)^(Vqx=A9Q3ZXA;E6K(p!eO z&50~ajtcYljPn~p{t5MLLQx+Swu}>^jMN{uclM|Nm%p_vZir00v1! bK~w_(y@Wf6V3(?200000NkvXXu0mjf{)F^M literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/Contents.json b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/Contents.json new file mode 100644 index 0000000..5a09e5a --- /dev/null +++ b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "role_chat_buttle_vip@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "role_chat_buttle_vip@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/role_chat_buttle_vip@2x.png b/Visual_Novel_iOS/Assets.xcassets/Role/role_chat_buttle_vip.imageset/role_chat_buttle_vip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..22af838540853253a3cba0f702731db84c656b46 GIT binary patch literal 1387 zcmV-x1(f=UP)d@%*4 z011i0N(U6Uq9Ia3N#Vp4whL_ENg#3rXD9F5*|~W$x0kb{toECE^X9#oZ{EC_z005; z+ngJ)yY;aY%A`x|<&%!VHl0}?1+;w}I>c>r_A2uG_izebu>19UwppLo0~LguvrEX^ z%_^TNo!y^3hHc&2gDbb~UVT~S9@BGEE{IFVJaV%Pm;qEjW5}^!_dlNNbU$n_BR8Sl z>3E!AdW~Q0WbHT%t|GU$qq)U8v(1?S2q}?|@S6D|(tGt88StYcI6Ng2E;w5%0$h%m z;qdf$DZA?ae?ar^0H-ZW8Q`!zE~Mv6g{!K3s&vjejIHNMWpAr%39$XEK1o%ElUWP; zX+Hq2e;e@IAG#OF%#tYLoLl-K*#C4(y5(K_G3Y3Zs`IYg41IboEr0$s@cl0U1JH34 z;RK4HWx&5%(hTq5^T3&BLwk2G$b}?%SJY*3OBTjxl})@e;iTPtSF;=$V(CC4+TLlq z%eL%1$NokFpnEMQc`IdRaIGaxdhY&ZU$GT#4W}g@rU+zXHk|Tia3es=#?g5RJoPD{dyT~wl}v~2I%oL39S#- zfL^H9E7=h@h*L#xE#x72siOC1IfP!%XumxXx^=`;61{RicmwIKoRxE@`;oUC@e|m9 zep2FTx}?$eDdNZIMUI5@?xl;OKl{^LsLL+9QxG?U4T-pI(XRk+6-KdWNRi$wjJBwY zmv%f@MMH{|+=Wq5mhZtorBGJfF{T^A^TO-z`giW0FHOL)IfrkdvYgD$RXQmV_A$E`Zk{{Rk3HcN1ovU4ghY@c|uBd8Jc@ zlhBi3G}3L{R=38PQ-D5z>7qDB6;8`{2zTnEhVRSP5Y<0Pv0(( zFcy)Si)MIL{wu@=9pX-H;;3`mTt_HLm8J54@{{w6I^gl?htyVs zXTsaD<~i_|OgZX2IIizw{r_S74WX_NBH}KeapPWY4=YM2U~7s3m)BShwn(8G4+q8Yj&s2Hc#n4&Mo tcoIAU00960%b>n?UR#^e6YCz1x9ys- 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 literal 0 HcmV?d00001 diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/ChatButtleCollectionCell.swift b/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/ChatButtleCollectionCell.swift new file mode 100644 index 0000000..2fe613f --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/ChatButtleCollectionCell.swift @@ -0,0 +1,144 @@ +// +// ChatButtleCollectionCell.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/30. +// + +import UIKit + +class ChatButtleCollectionCell: UICollectionViewCell { + + lazy var statusImgView: UIImageView = { + let imgView = UIImageView() + imgView.backgroundColor = .blue + return imgView + }() + + lazy var stoneImgView: UIImageView = { + let imgView = UIImageView(image: UIImage(named: "role_chat_buttle_stone")) + return imgView + }() + + lazy var stoneLa: UILabel = { + let lab = UILabel() + lab.font = UIFont.boldSystemFont(ofSize: 12) + lab.textColor = UIColor(hex: "#D7E7FF") + lab.text = "12" + return lab + }() + + lazy var lockImgView: UIImageView = { + let imgView = UIImageView(image: UIImage(named: "role_chat_buttle_lock")) + return imgView + }() + + lazy var hiImgView: UIImageView = { + let imgView = UIImageView(image: UIImage(named: "role_chat_buttle_chat")) + return imgView + }() + + lazy var hiLab: UILabel = { + let lab = UILabel() + lab.text = "hi" + lab.textColor = UIColor(hex: "#333333") + lab.font = UIFont.systemFont(ofSize: 14) + return lab + }() + + lazy var vipImgView: UIImageView = { + let imgView = UIImageView(image: UIImage(named: "role_chat_buttle_vip")) + return imgView + }() + + lazy var nameLab: UILabel = { + let lab = UILabel() + lab.font = UIFont.boldSystemFont(ofSize: 12) + lab.text = "Default" + lab.textColor = .white + return lab + }() + + lazy var getBtn: UIButton = { + let btn = UIButton() + btn.backgroundColor = UIColor(hex: "#8A48FF") + btn.setTitle("Get", for: .normal) + btn.cornerRadius = 12.5 + btn.addTarget(self, action: #selector(getBtnTap), for: .touchUpInside) + return btn + }() + + lazy var stoneStackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [stoneImgView, stoneLa]) + stackView.axis = .horizontal + stackView.spacing = 5 + stackView.alignment = .center + stackView.distribution = .fill + return stackView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + setupData() + setupEvent() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc func getBtnTap() { + + } + + func setupViews() { + contentView.addSubview(vipImgView) + contentView.addSubview(statusImgView) + contentView.addSubview(stoneStackView) + contentView.addSubview(lockImgView) + contentView.addSubview(hiImgView) + hiImgView.addSubview(hiLab) + contentView.addSubview(nameLab) + contentView.addSubview(getBtn) + + vipImgView.snp.makeConstraints { make in + make.top.left.equalToSuperview().inset(5) + } + + stoneStackView.snp.makeConstraints { make in + make.left.top.equalToSuperview().inset(5) + } + + statusImgView.snp.makeConstraints { make in + make.right.equalToSuperview().inset(5) + make.centerY.equalTo(stoneStackView.snp.centerY) + make.width.height.equalTo(13) + } + + hiImgView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(statusImgView.snp.bottom).offset(10) + } + + hiLab.snp.makeConstraints { make in + make.centerX.centerX.equalToSuperview() + } + + lockImgView.snp.makeConstraints { make in + make.right.equalToSuperview().inset(5) + make.centerY.equalTo(stoneStackView.snp.centerY) + } + + nameLab.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.left.equalToSuperview().inset(5) + make.top.equalTo(hiImgView.snp.bottom).offset(15) + make.bottom.equalToSuperview().inset(10).priority(.low) + } + } + + func setupData() {} + + func setupEvent() {} +} diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/SubItemsContainerCell.swift b/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/SubItemsContainerCell.swift new file mode 100644 index 0000000..b86f6ff --- /dev/null +++ b/Visual_Novel_iOS/Src/Modules/Chat/Setting/Cell/SubItemsContainerCell.swift @@ -0,0 +1,213 @@ +// +// SubItemsContainerCell.swift +// Visual_Novel_iOS +// +// Created by mh on 2025/10/30. +// + +import UIKit +import SnapKit + +// switch model中点击展开的item +// SubItemsRow - 用于标识子项容器cell +struct SubItemsRow: RowModel { + let subItems: [ImageRow] + var cellReuseID: String { "SubItemsContainerCell" } + func cellHeight(tableWidth: CGFloat) -> CGFloat { + let maxDisplayCount = 4 + let displayCount = min(subItems.count, maxDisplayCount) + return CGFloat(displayCount) * 58 // 每行40高度 + } +} + +// SubItemsContainerCell - 子项容器cell +class SubItemsContainerCell: UITableViewCell, CellConfigurable { + + private var subItems: [ImageRow] = [] + private var tableViewHeightConstraint: Constraint? + + lazy var tableView: UITableView = { + let tableView = UITableView(frame: .zero, style: .plain) + tableView.separatorStyle = .none + tableView.delegate = self + tableView.dataSource = self + tableView.backgroundColor = UIColor(hex: "#F5F5FF") + tableView.showsVerticalScrollIndicator = true + tableView.isScrollEnabled = true + tableView.register(SubItemCell.self, forCellReuseIdentifier: "SubItemCell") + tableView.estimatedRowHeight = 58 + tableView.rowHeight = 58 + tableView.contentInset = .zero + tableView.scrollIndicatorInsets = .zero + tableView.showsVerticalScrollIndicator = false + tableView.bounces = false + tableView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] // 左下、右下 + tableView.layer.cornerRadius = 15 + return tableView + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupViews() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setupViews() { + backgroundColor = .clear + selectionStyle = .none + + contentView.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.equalToSuperview().inset(20) + make.top.bottom.equalToSuperview().inset(2.5) + tableViewHeightConstraint = make.height.equalTo(0).constraint + } + } + + func configure(with row: RowModel) { + guard let subItemsRow = row as? SubItemsRow else { return } + subItems = subItemsRow.subItems + + tableView.reloadData() + updateTableViewHeight() + } + + private func updateTableViewHeight() { + let maxDisplayCount = 4 + let displayCount = min(subItems.count, maxDisplayCount) + let height = CGFloat(displayCount) * 58 + + tableViewHeightConstraint?.update(offset: height) + layoutIfNeeded() + } +} + +extension SubItemsContainerCell: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return subItems.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "SubItemCell", for: indexPath) as! SubItemCell + let subItem = subItems[indexPath.row] + cell.configure(with: subItem) + cell.lineView.isHidden = subItems.count - 1 == indexPath.row + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + } +} + +// SubItemCell - 子项cell +class SubItemCell: UITableViewCell { + private lazy var titleLabel: UILabel = { + let lab = UILabel() + lab.text = "Max-0618" + lab.textColor = UIColor(hex: "#333333") + lab.font = UIFont.systemFont(ofSize: 13) + return lab + }() + + private lazy var iconImageView: UIImageView = { + let view = UIImageView() + view.cornerRadius = 12.5 + view.backgroundColor = .darkText + return view + }() + + lazy var subTitleLab: UILabel = { + let lab = UILabel() + lab.text = "Previous-generation large model" + lab.textColor = UIColor(hex: "#9494C3") + lab.font = UIFont.systemFont(ofSize: 10) + return lab + }() + + lazy var tokenLab: UILabel = { + let lab = UILabel() + lab.textColor = UIColor(hex: "#0066FF") + lab.text = "0.3 points / 1K tokens (Recommended)" + lab.font = UIFont.systemFont(ofSize: 11) + return lab + }() + + lazy var statusImgView: UIImageView = { + let imgView = UIImageView(image: UIImage(named: "")) + imgView.backgroundColor = .blue + return imgView + }() + + lazy var lineView: UIView = { + let view = UIView() + view.backgroundColor = UIColor(hex: "#ECECF9") + return view + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setupViews() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setupViews() { + backgroundColor = .clear + selectionStyle = .none + + contentView.addSubview(iconImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(subTitleLab) + contentView.addSubview(tokenLab) + contentView.addSubview(statusImgView) + contentView.addSubview(lineView) + + iconImageView.snp.makeConstraints { make in + make.left.top.equalToSuperview().offset(10) + make.width.height.equalTo(25) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(iconImageView.snp.right).offset(8) + make.top.equalTo(iconImageView.snp.top).offset(-2) + make.right.equalTo(statusImgView.snp.left).inset(-10) + } + + subTitleLab.snp.makeConstraints { make in + make.left.equalTo(titleLabel.snp.left) + make.top.equalTo(titleLabel.snp.bottom) + make.right.equalTo(titleLabel.snp.right) + } + + lineView.snp.makeConstraints { make in + make.left.right.equalToSuperview().inset(10) + make.bottom.equalToSuperview() + make.height.equalTo(1) + } + + tokenLab.snp.makeConstraints { make in + make.left.equalTo(titleLabel.snp.left) + make.right.equalTo(titleLabel.snp.right) + make.bottom.equalToSuperview().inset(5) + } + + statusImgView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().inset(10) + make.width.height.equalTo(13) + } + } + + func configure(with item: ImageRow) { + iconImageView.image = UIImage(named: item.icon) + titleLabel.text = item.title + } +} + diff --git a/Visual_Novel_iOS/Src/Modules/Chat/Setting/View/ChatSettingSwipeView.swift b/Visual_Novel_iOS/Src/Modules/Chat/Setting/View/ChatSettingSwipeView.swift index bfaa535..c031428 100644 --- a/Visual_Novel_iOS/Src/Modules/Chat/Setting/View/ChatSettingSwipeView.swift +++ b/Visual_Novel_iOS/Src/Modules/Chat/Setting/View/ChatSettingSwipeView.swift @@ -35,6 +35,10 @@ class ChatSettingSwipeView: CLContainer { // ImageRow(icon: "role_exchange_mode", title: "Sub Item 10", showAvatar: false, showArrow: false, showSwitch: false) ]) + let buttleRow = ImageRow(icon: "role_chat_buttle", title: "Chat buttle", showAvatar: false, showArrow: true, showSwitch: false, subItems: [ + + ]) + rows = [ [modelRow, ImageRow(icon: "role_text_mode", title: "Short Text Mode", showAvatar: false, showArrow: false, showSwitch: true)], [ImageRow(icon: "role_voice", title: "Voice actor", showAvatar: true, showArrow: true, showSwitch: false), ImageRow(icon: "role_talk", title: "Play dialogue only", showAvatar: false, showArrow: false, showSwitch: true)], @@ -272,205 +276,3 @@ extension ChatSettingSwipeView: UITableViewDelegate, UITableViewDataSource { return CGFLOAT_MIN } } - -// SubItemsRow - 用于标识子项容器cell -struct SubItemsRow: RowModel { - let subItems: [ImageRow] - var cellReuseID: String { "SubItemsContainerCell" } - func cellHeight(tableWidth: CGFloat) -> CGFloat { - let maxDisplayCount = 4 - let displayCount = min(subItems.count, maxDisplayCount) - return CGFloat(displayCount) * 58 // 每行40高度 - } -} - -// SubItemsContainerCell - 子项容器cell -class SubItemsContainerCell: UITableViewCell, CellConfigurable { - - private var subItems: [ImageRow] = [] - private var tableViewHeightConstraint: Constraint? - - lazy var tableView: UITableView = { - let tableView = UITableView(frame: .zero, style: .plain) - tableView.separatorStyle = .none - tableView.delegate = self - tableView.dataSource = self - tableView.backgroundColor = UIColor(hex: "#F5F5FF") - tableView.showsVerticalScrollIndicator = true - tableView.isScrollEnabled = true - tableView.register(SubItemCell.self, forCellReuseIdentifier: "SubItemCell") - tableView.estimatedRowHeight = 58 - tableView.rowHeight = 58 - tableView.contentInset = .zero - tableView.scrollIndicatorInsets = .zero - tableView.showsVerticalScrollIndicator = false - tableView.bounces = false - tableView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] // 左下、右下 - tableView.layer.cornerRadius = 15 - return tableView - }() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - setupViews() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func setupViews() { - backgroundColor = .clear - selectionStyle = .none - - contentView.addSubview(tableView) - - tableView.snp.makeConstraints { make in - make.left.right.equalToSuperview().inset(20) - make.top.bottom.equalToSuperview().inset(2.5) - tableViewHeightConstraint = make.height.equalTo(0).constraint - } - } - - func configure(with row: RowModel) { - guard let subItemsRow = row as? SubItemsRow else { return } - subItems = subItemsRow.subItems - - tableView.reloadData() - updateTableViewHeight() - } - - private func updateTableViewHeight() { - let maxDisplayCount = 4 - let displayCount = min(subItems.count, maxDisplayCount) - let height = CGFloat(displayCount) * 58 - - tableViewHeightConstraint?.update(offset: height) - layoutIfNeeded() - } -} - -extension SubItemsContainerCell: UITableViewDelegate, UITableViewDataSource { - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return subItems.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "SubItemCell", for: indexPath) as! SubItemCell - let subItem = subItems[indexPath.row] - cell.configure(with: subItem) - cell.lineView.isHidden = subItems.count - 1 == indexPath.row - return cell - } - - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - - } -} - -// SubItemCell - 子项cell -class SubItemCell: UITableViewCell { - private lazy var titleLabel: UILabel = { - let lab = UILabel() - lab.text = "Max-0618" - lab.textColor = UIColor(hex: "#333333") - lab.font = UIFont.systemFont(ofSize: 13) - return lab - }() - - private lazy var iconImageView: UIImageView = { - let view = UIImageView() - view.cornerRadius = 12.5 - view.backgroundColor = .darkText - return view - }() - - lazy var subTitleLab: UILabel = { - let lab = UILabel() - lab.text = "Previous-generation large model" - lab.textColor = UIColor(hex: "#9494C3") - lab.font = UIFont.systemFont(ofSize: 10) - return lab - }() - - lazy var tokenLab: UILabel = { - let lab = UILabel() - lab.textColor = UIColor(hex: "#0066FF") - lab.text = "0.3 points / 1K tokens (Recommended)" - lab.font = UIFont.systemFont(ofSize: 11) - return lab - }() - - lazy var statusImgView: UIImageView = { - let imgView = UIImageView(image: UIImage(named: "")) - imgView.backgroundColor = .blue - return imgView - }() - - lazy var lineView: UIView = { - let view = UIView() - view.backgroundColor = UIColor(hex: "#ECECF9") - return view - }() - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - setupViews() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func setupViews() { - backgroundColor = .clear - selectionStyle = .none - - contentView.addSubview(iconImageView) - contentView.addSubview(titleLabel) - contentView.addSubview(subTitleLab) - contentView.addSubview(tokenLab) - contentView.addSubview(statusImgView) - contentView.addSubview(lineView) - - iconImageView.snp.makeConstraints { make in - make.left.top.equalToSuperview().offset(10) - make.width.height.equalTo(25) - } - - titleLabel.snp.makeConstraints { make in - make.left.equalTo(iconImageView.snp.right).offset(8) - make.top.equalTo(iconImageView.snp.top).offset(-2) - make.right.equalTo(statusImgView.snp.left).inset(-10) - } - - subTitleLab.snp.makeConstraints { make in - make.left.equalTo(titleLabel.snp.left) - make.top.equalTo(titleLabel.snp.bottom) - make.right.equalTo(titleLabel.snp.right) - } - - lineView.snp.makeConstraints { make in - make.left.right.equalToSuperview().inset(10) - make.bottom.equalToSuperview() - make.height.equalTo(1) - } - - tokenLab.snp.makeConstraints { make in - make.left.equalTo(titleLabel.snp.left) - make.right.equalTo(titleLabel.snp.right) - make.bottom.equalToSuperview().inset(5) - } - - statusImgView.snp.makeConstraints { make in - make.centerY.equalToSuperview() - make.right.equalToSuperview().inset(10) - make.width.height.equalTo(13) - } - } - - func configure(with item: ImageRow) { - iconImageView.image = UIImage(named: item.icon) - titleLabel.text = item.title - } -}