处理聊天UI细节问题

This commit is contained in:
mh 2025-12-02 14:27:09 +08:00
parent 9405f4e42c
commit 8db4792e61
8 changed files with 122 additions and 6 deletions

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "role_chat_response@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "role_chat_response@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -7,6 +7,37 @@ final class StreamChatBubbleCell: UITableViewCell {
private let bubbleView = UIView()
private let messageLabel = UILabel()
var onLongPress: (() -> Void)?
lazy var sendBgImgView: UIImageView = {
guard let originalImage = UIImage(named: "role_chat_bg_send") else {
return UIImageView()
}
// focus
// focus
let imageSize = originalImage.size
let focusX = imageSize.width - 20.0 // 20pt
let focusY = 20.0 // 20pt
let stretchedImage = originalImage.makeStretchable(from: originalImage, focus: CGPoint(x: focusX, y: focusY))
let imgV = UIImageView(image: stretchedImage)
imgV.contentMode = .scaleToFill
return imgV
}()
lazy var respBgImgView: UIImageView = {
guard let originalImage = UIImage(named: "role_chat_bg_response") else {
return UIImageView()
}
// focus
// focus
let imageSize = originalImage.size
let focusX = 20.0 // 20pt
let focusY = 20.0 // 20pt
let stretchedImage = originalImage.makeStretchable(from: originalImage, focus: CGPoint(x: focusX, y: focusY))
let imgV = UIImageView(image: stretchedImage)
imgV.contentMode = .scaleToFill
return imgV
}()
private lazy var longPressGesture: UILongPressGestureRecognizer = {
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
gesture.minimumPressDuration = 0.4
@ -34,8 +65,8 @@ final class StreamChatBubbleCell: UITableViewCell {
private func setupViews() {
contentView.addSubview(bubbleView)
bubbleView.layer.cornerRadius = 18
bubbleView.layer.masksToBounds = true
bubbleView.addSubview(sendBgImgView)
bubbleView.addSubview(respBgImgView)
bubbleView.setContentHuggingPriority(.defaultLow, for: .horizontal)
bubbleView.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
contentView.addGestureRecognizer(longPressGesture)
@ -52,20 +83,30 @@ final class StreamChatBubbleCell: UITableViewCell {
func configure(message: StreamChatMessageModel) {
messageLabel.text = message.text
respBgImgView.isHidden = message.isSelf
sendBgImgView.isHidden = !message.isSelf
if message.isSelf {
bubbleView.backgroundColor = UIColor.c.cpn
//
messageLabel.textColor = .white
bubbleView.backgroundColor = .clear
bubbleView.snp.remakeConstraints { make in
make.top.equalToSuperview().offset(6)
make.bottom.equalToSuperview().offset(-6)
make.width.lessThanOrEqualTo(UIScreen.width * 2.0 / 3.0)
make.width.greaterThanOrEqualTo(60)
make.width.greaterThanOrEqualTo(40)
make.trailing.equalToSuperview().offset(-16)
}
sendBgImgView.snp.remakeConstraints { make in
make.edges.equalToSuperview()
}
} else {
bubbleView.backgroundColor = UIColor.white.withAlphaComponent(0.2)
messageLabel.textColor = .white
//
messageLabel.textColor = UIColor(hex: "#333333")
bubbleView.backgroundColor = .clear
bubbleView.snp.remakeConstraints { make in
make.top.equalToSuperview().offset(6)
make.bottom.equalToSuperview().offset(-6)
@ -73,6 +114,10 @@ final class StreamChatBubbleCell: UITableViewCell {
make.width.greaterThanOrEqualTo(60)
make.leading.equalToSuperview().offset(16)
}
respBgImgView.snp.remakeConstraints { make in
make.edges.equalToSuperview()
}
}
messageLabel.snp.remakeConstraints { make in

View File

@ -460,6 +460,33 @@ public extension UIImage {
func pngBase64String() -> String? {
return pngData()?.base64EncodedString()
}
/// UIImage
/// ** resizable Auto Layout
func makeStretchable(from image: UIImage,
focus: CGPoint) -> UIImage {
let scale = image.scale
let w = image.size.width * scale
let h = image.size.height * scale
let fx = focus.x * scale
let fy = focus.y * scale
// cap
let capLeft = min(fx, w - fx) * 0.5
let capRight = w - capLeft
let capTop = min(fy, h - fy) * 0.5
let capBottom = h - capTop
let insets = UIEdgeInsets(top: capTop,
left: capLeft,
bottom: capBottom,
right: capRight)
//
return image.resizableImage(withCapInsets: insets,
resizingMode: .stretch)
}
/// Base 64 encoded JPEG data of the image.
///