swift 自定义融云聊天 cell
2020-06-26 本文已影响0人
松龄学编程
使用融云uilib
private let font = UIFont(fd_fontName: .pingFangSCRegular, fd_size: 14)
private let headAndContentSpacing: CGFloat = 8
private let textBubblePadding: CGFloat = 13
private let portraitPadding: CGFloat = 10
class TextMessageCell: RCMessageCell {
let bubble = UIImageView()
let label = UILabel()
override init!(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override class func size(for model: RCMessageModel!, withCollectionViewWidth collectionViewWidth: CGFloat, referenceExtraHeight extraHeight: CGFloat) -> CGSize {
guard let model = model,
let textMessage = model.content as? RCTextMessage else { return .zero }
let size = TextMessageCell.getBubbleBackgroundViewSize(message: textMessage)
var height = size.height
height = max(height, RCIM.current.globalMessagePortraitSize.height)
height += extraHeight
return CGSize(width: collectionViewWidth, height: height)
}
override func setDataModel(_ model: RCMessageModel!) {
super.setDataModel(model)
doLayout()
}
private func doLayout() {
guard let model = model,
let textMessage = model.content as? RCTextMessage else { return }
label.text = textMessage.content
let labelSize = TextMessageCell.getTextLabelSize(message: textMessage)
let bubbleSize = TextMessageCell.getBubbleSize(textLabelSize: labelSize)
var messageContentViewRect = messageContentView.frame
if messageDirection == .MessageDirection_RECEIVE {
label.frame = CGRect(x: textBubblePadding, y: headAndContentSpacing, width: labelSize.width, height: labelSize.height)
messageContentViewRect.size.width = bubbleSize.width
messageContentView.frame = messageContentViewRect
bubble.frame = CGRect(x: 0, y: 0, width: bubbleSize.width, height: bubbleSize.height)
bubble.image = UIImage(named: "chat_from")?.resizableImage(withCapInsets: UIEdgeInsets(top: 18, left: 18, bottom: 18, right: 18), resizingMode: .stretch)
} else {
label.frame = CGRect(x: textBubblePadding, y: headAndContentSpacing, width: labelSize.width, height: labelSize.height)
messageContentViewRect.size.width = bubbleSize.width
messageContentViewRect.size.height = bubbleSize.height
messageContentViewRect.origin.x = baseContentView.bounds.width
- messageContentViewRect.size.width
- CGFloat(headAndContentSpacing)
- RCIM.current.globalMessagePortraitSize.width
- portraitPadding
messageContentView.frame = messageContentViewRect
bubble.frame = CGRect(x: 0, y: 0, width: bubbleSize.width, height: bubbleSize.height)
bubble.image = UIImage(named: "chat_to")?.resizableImage(withCapInsets: UIEdgeInsets(top: 18, left: 18, bottom: 18, right: 18), resizingMode: .stretch)
}
}
private func setupViews() {
setupBubble()
setupLabel()
}
private func setupBubble() {
messageContentView.addSubview(bubble)
}
private func setupLabel() {
messageContentView.addSubview(label)
label.numberOfLines = 0
label.font = font
label.textColor = UIColor(hexString: "#222222")
label.lineBreakMode = .byWordWrapping
label.textAlignment = .left
}
class func getTextLabelSize(message: RCTextMessage) -> CGSize {
guard !message.content.isEmpty else { return .zero }
let maxWidth = UIScreen.main.bounds.width - (10 + RCIM.current.globalMessagePortraitSize.width + 10) * 2 - 5 - 35
let textRect = (message.content as NSString)
.boundingRect(with: CGSize(width: maxWidth, height: 8000),
options: [.truncatesLastVisibleLine, .usesLineFragmentOrigin, .usesFontLeading],
attributes: [NSAttributedString.Key.font: font],
context: nil)
return CGSize(width: textRect.size.width + 5, height: textRect.size.height + 5)
}
class func getBubbleSize(textLabelSize: CGSize) -> CGSize {
return CGSize(width: textLabelSize.width + textBubblePadding * 2, height: textLabelSize.height + headAndContentSpacing * 2)
}
class func getBubbleBackgroundViewSize(message: RCTextMessage) -> CGSize {
let size = TextMessageCell.self.getTextLabelSize(message: message)
return TextMessageCell.self.getBubbleSize(textLabelSize: size)
}
}