Bark/View/MessageList/MessageTableViewCell.swift
2024-12-26 09:34:42 +08:00

235 lines
7.1 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MessageTableViewCell.swift
// Bark
//
// Created by huangfeng on 2020/5/26.
// Copyright © 2020 Fin. All rights reserved.
//
import Material
import RxSwift
import SnapKit
import UIKit
/// cell
class MessageTableViewCell: UITableViewCell {
private let messageView = MessageItemView()
var message: Message? {
get {
return messageView.message
}
set {
messageView.message = newValue
}
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = .none
self.contentView.backgroundColor = BKColor.background.primary
self.contentView.addSubview(messageView)
messageView.snp.makeConstraints { make in
make.left.top.right.equalToSuperview()
make.bottom.equalTo(-10)
}
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// cell
class MessageGroupTableViewCell: UITableViewCell {
/// 便
private let panel: UIView = {
let panel = UIView()
panel.backgroundColor = BKColor.background.primary
return panel
}()
/// 5 5
private let messageViews = [
MessageItemView(isShowShadow: true),
MessageItemView(isShowShadow: true),
MessageItemView(isShowShadow: true),
MessageItemView(isShowShadow: true),
MessageItemView(isShowShadow: true)
]
/// header
private let groupHeader = MessageGroupHeaderView()
/// 5
private let moreView = MessageGroupMoreView()
/// header top offset
private var groupHeaderTopConstraint: Constraint? = nil
///
var isExpanded: Bool = false {
didSet {
refreshViewState()
refreshLayout()
self.contentView.layoutIfNeeded()
}
}
///
var messages: [Message] = [] {
didSet {
for (index, item) in messageViews.enumerated() {
if index < messages.count {
item.message = messages[index]
item.isHidden = false
} else {
item.isHidden = true
}
}
refreshLayout()
}
}
///
var moreCount: Int = 0 {
didSet {
moreView.count = moreCount
}
}
///
var groupName: String? {
set {
if let newValue, !newValue.isEmpty {
groupHeader.groupName = newValue
} else {
groupHeader.groupName = NSLocalizedString("default")
}
}
get {
return groupHeader.groupName
}
}
///
var showLessAction: (() -> Void)? {
get {
return groupHeader.showLessAction
}
set {
groupHeader.showLessAction = newValue
}
}
///
var clearAction: (() -> Void)? {
get {
return groupHeader.clearAction
}
set {
groupHeader.clearAction = newValue
}
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = .none
self.contentView.addSubview(panel)
panel.addSubview(groupHeader)
panel.addSubview(moreView)
for view in messageViews.reversed() {
panel.addSubview(view)
}
panel.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
groupHeader.snp.remakeConstraints { make in
groupHeaderTopConstraint = make.top.equalToSuperview().offset(0).constraint
make.left.equalTo(16)
make.right.equalTo(-16)
}
moreView.snp.remakeConstraints { make in
make.bottom.equalToSuperview().offset(-18)
make.centerX.equalToSuperview()
}
refreshViewState()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// UI
private func refreshViewState() {
self.messageViews.first?.bodyLabel.isUserInteractionEnabled = isExpanded
self.contentView.gestureRecognizers?.first?.isEnabled = !isExpanded
for (index, view) in messageViews.enumerated() {
if isExpanded {
view.maskAlpha = 0
} else {
view.maskAlpha = index == 0 ? 0 : CGFloat(index + 1) * 0.01
}
}
}
///
private func refreshLayout() {
// header
groupHeaderTopConstraint?.update(offset: isExpanded ? 0 : 15)
// 5 messageViews.count
let maxCount = min(self.messages.count, self.messageViews.count)
//
for view in messageViews {
view.snp.removeConstraints()
}
for (index, item) in messageViews.enumerated() {
if index >= maxCount {
break
}
item.snp.remakeConstraints { make in
make.left.right.equalToSuperview()
if isExpanded {
if index == 0 {
make.top.equalTo(groupHeader.snp.bottom).offset(8)
} else {
make.top.equalTo(messageViews[index - 1].snp.bottom).offset(8)
}
if index == maxCount - 1 {
if moreCount > 0 {
make.bottom.equalTo(moreView.snp.top).offset(-18)
} else {
make.bottom.equalToSuperview().offset(-18)
}
}
item.transform = .identity
} else {
if index == 0 {
make.top.equalToSuperview()
item.transform = .identity
} else {
// 1
make.top.equalToSuperview().offset(min(index * 8, 1 * 8))
make.height.equalTo(messageViews[0])
// index
let scale = 1 - CGFloat(index) * 0.04
item.transform = CGAffineTransform(scaleX: scale, y: 1)
}
if index == maxCount - 1 {
make.bottom.equalToSuperview().offset(-8)
}
}
}
}
}
}