调整历史消息手势交互逻辑

This commit is contained in:
Fin 2023-07-26 17:52:39 +08:00
parent 40fcc658d3
commit cfc0be618a
No known key found for this signature in database
GPG Key ID: CFB59B99D87A7B93
4 changed files with 74 additions and 82 deletions

View File

@ -169,11 +169,6 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
self?.alertMessage(message: message) self?.alertMessage(message: message)
}).disposed(by: rx.disposeBag) }).disposed(by: rx.disposeBag)
// messageURL
output.urlTap.drive(onNext: { url in
Client.shared.openUrl(url: url)
}).disposed(by: rx.disposeBag)
// //
output.groupFilter output.groupFilter
.drive(onNext: { [weak self] groupModel in .drive(onNext: { [weak self] groupModel in

View File

@ -27,7 +27,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
var messages: Driver<[MessageSection]> var messages: Driver<[MessageSection]>
var refreshAction: Driver<MJRefreshAction> var refreshAction: Driver<MJRefreshAction>
var alertMessage: Driver<String> var alertMessage: Driver<String>
var urlTap: Driver<URL>
var groupFilter: Driver<GroupFilterViewModel> var groupFilter: Driver<GroupFilterViewModel>
var title: Driver<String> var title: Driver<String>
} }
@ -178,17 +177,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
} }
}).disposed(by: rx.disposeBag) }).disposed(by: rx.disposeBag)
// cell url
let urlTap = messagesRelay.flatMapLatest { section -> Observable<String> in
if let section = section.first {
let taps = section.messages.compactMap { model -> Observable<String> in
model.urlTap.asObservable()
}
return Observable.merge(taps)
}
return .empty()
}
.compactMap { URL(string: $0) } // url
// //
input.delete.drive(onNext: { [weak self] type in input.delete.drive(onNext: { [weak self] type in
@ -260,7 +248,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
messages: messagesRelay.asDriver(onErrorJustReturn: []), messages: messagesRelay.asDriver(onErrorJustReturn: []),
refreshAction: refreshAction.asDriver(), refreshAction: refreshAction.asDriver(),
alertMessage: alertMessage, alertMessage: alertMessage,
urlTap: urlTap.asDriver(onErrorDriveWith: .empty()),
groupFilter: groupFilter.asDriver(), groupFilter: groupFilter.asDriver(),
title: titleRelay.asDriver() title: titleRelay.asDriver()
) )

View File

@ -7,7 +7,9 @@
// //
import Material import Material
import RxSwift
import UIKit import UIKit
class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> { class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
let backgroundPanel: UIView = { let backgroundPanel: UIView = {
let view = UIView() let view = UIView()
@ -17,16 +19,8 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
return view return view
}() }()
let titleLabel: UILabel = { let bodyLabel: UITextView = {
let label = UILabel() let label = UITextView()
label.font = RobotoFont.medium(with: 16)
label.textColor = BKColor.grey.darken4
label.numberOfLines = 0
return label
}()
let bodyLabel: GesturePassTextView = {
let label = GesturePassTextView()
label.isEditable = false label.isEditable = false
label.dataDetectorTypes = [.phoneNumber, .link] label.dataDetectorTypes = [.phoneNumber, .link]
label.isScrollEnabled = false label.isScrollEnabled = false
@ -37,16 +31,6 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
return label return label
}() }()
let urlLabel: UILabel = {
let label = BKLabel()
label.hitTestSlop = UIEdgeInsets(top: -20, left: -20, bottom: -20, right: -20)
label.isUserInteractionEnabled = true
label.font = RobotoFont.regular(with: 14)
label.textColor = BKColor.blue.darken1
label.numberOfLines = 0
return label
}()
let dateLabel: UILabel = { let dateLabel: UILabel = {
let label = UILabel() let label = UILabel()
label.font = RobotoFont.medium(with: 11) label.font = RobotoFont.medium(with: 11)
@ -54,12 +38,6 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
return label return label
}() }()
let bodyStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
return stackView
}()
let separatorLine: UIImageView = { let separatorLine: UIImageView = {
let imageView = UIImageView() let imageView = UIImageView()
imageView.backgroundColor = BKColor.background.primary imageView.backgroundColor = BKColor.background.primary
@ -72,22 +50,38 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
self.backgroundColor = BKColor.background.primary self.backgroundColor = BKColor.background.primary
contentView.addSubview(backgroundPanel) contentView.addSubview(backgroundPanel)
contentView.addSubview(bodyStackView) contentView.addSubview(bodyLabel)
bodyStackView.addArrangedSubview(titleLabel)
bodyStackView.addArrangedSubview(bodyLabel)
bodyStackView.addArrangedSubview(urlLabel)
bodyStackView.spacing = 6
bodyStackView.setCustomSpacing(12, after: bodyLabel)
contentView.addSubview(dateLabel) contentView.addSubview(dateLabel)
contentView.addSubview(separatorLine) contentView.addSubview(separatorLine)
self.urlLabel.addGestureRecognizer(UITapGestureRecognizer())
layoutView() layoutView()
self.bodyLabel.superCell = self
// bodyLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap))) let tap = UITapGestureRecognizer(target: self, action: #selector(tap))
tap.delegate = self
bodyLabel.addGestureRecognizer(tap)
}
@objc func tap() {
var view = self.superview
while view != nil, (view as? UITableView) == nil {
view = view?.superview
}
guard let tableView = view as? UITableView else {
return
}
guard let indexPath = tableView.indexPath(for: self) else {
return
}
tableView.delegate?.tableView?(tableView, didSelectRowAt: indexPath)
}
// UITableView didSelectRow
override func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print(otherGestureRecognizer.name ?? "")
if otherGestureRecognizer.name == "UITextInteractionNameLinkTap" {
return true
}
return false
} }
@available(*, unavailable) @available(*, unavailable)
@ -96,23 +90,15 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
} }
func layoutView() { func layoutView() {
bodyStackView.snp.makeConstraints { make in
make.left.top.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
}
titleLabel.snp.remakeConstraints { make in
make.left.equalTo(12)
make.right.equalTo(-12)
}
bodyLabel.snp.remakeConstraints { make in bodyLabel.snp.remakeConstraints { make in
make.left.right.equalTo(titleLabel) make.top.equalTo(16)
} make.left.equalTo(28)
urlLabel.snp.makeConstraints { make in make.right.equalTo(-28)
make.left.right.equalTo(bodyLabel)
} }
dateLabel.snp.remakeConstraints { make in dateLabel.snp.remakeConstraints { make in
make.left.equalTo(bodyLabel) make.left.equalTo(bodyLabel)
make.top.equalTo(bodyStackView.snp.bottom).offset(12) make.top.equalTo(bodyLabel.snp.bottom).offset(12)
} }
separatorLine.snp.remakeConstraints { make in separatorLine.snp.remakeConstraints { make in
make.left.right.bottom.equalToSuperview() make.left.right.bottom.equalToSuperview()
@ -131,16 +117,42 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
override func bindViewModel(model: MessageTableViewCellViewModel) { override func bindViewModel(model: MessageTableViewCellViewModel) {
super.bindViewModel(model: model) super.bindViewModel(model: model)
model.title.bind(to: self.titleLabel.rx.text).disposed(by: rx.reuseBag) Observable.combineLatest(model.title, model.body, model.url).subscribe { title, body, url in
model.body.bind(to: self.bodyLabel.rx.text).disposed(by: rx.reuseBag)
model.url.bind(to: self.urlLabel.rx.text).disposed(by: rx.reuseBag) let text = NSMutableAttributedString(
string: body,
attributes: [.font: RobotoFont.regular(with: 14), .foregroundColor: BKColor.grey.darken4]
)
if title.count > 0 {
// spacer
text.insert(NSAttributedString(
string: "\n",
attributes: [.font: RobotoFont.medium(with: 6)]
), at: 0)
text.insert(NSAttributedString(
string: title + "\n",
attributes: [.font: RobotoFont.medium(with: 16), .foregroundColor: BKColor.grey.darken4]
), at: 0)
}
if url.count > 0 {
// spacer
text.append(NSAttributedString(
string: "\n ",
attributes: [.font: RobotoFont.medium(with: 8)]
))
text.append(NSAttributedString(string: "\n\(url)", attributes: [
.font: RobotoFont.regular(with: 14),
.foregroundColor: BKColor.grey.darken4,
.link: url
]))
}
self.bodyLabel.attributedText = text
}.disposed(by: rx.disposeBag)
model.date.bind(to: self.dateLabel.rx.text).disposed(by: rx.reuseBag) model.date.bind(to: self.dateLabel.rx.text).disposed(by: rx.reuseBag)
model.title.map { $0.count <= 0 }.bind(to: self.titleLabel.rx.isHidden).disposed(by: rx.reuseBag)
model.url.map { $0.count <= 0 }.bind(to: self.urlLabel.rx.isHidden).disposed(by: rx.reuseBag)
self.urlLabel.gestureRecognizers?.first?.rx.event
.map { [weak self] _ in self?.urlLabel.text ?? "" }
.bind(to: model.urlTap).disposed(by: rx.reuseBag)
} }
} }

View File

@ -19,7 +19,6 @@ class MessageTableViewCellViewModel: ViewModel {
let url: BehaviorRelay<String> let url: BehaviorRelay<String>
let date: BehaviorRelay<String> let date: BehaviorRelay<String>
let urlTap: PublishRelay<String>
init(message: Message) { init(message: Message) {
self.message = message self.message = message
@ -28,8 +27,7 @@ class MessageTableViewCellViewModel: ViewModel {
self.body = BehaviorRelay<String>(value: message.body ?? "") self.body = BehaviorRelay<String>(value: message.body ?? "")
self.url = BehaviorRelay<String>(value: message.url ?? "") self.url = BehaviorRelay<String>(value: message.url ?? "")
self.date = BehaviorRelay<String>(value: (message.createDate ?? Date()).agoFormatString()) self.date = BehaviorRelay<String>(value: (message.createDate ?? Date()).agoFormatString())
self.urlTap = PublishRelay<String>()
super.init() super.init()
} }
} }