mirror of
https://github.com/Finb/Bark.git
synced 2025-12-08 21:36:01 +00:00
调整历史消息手势交互逻辑
This commit is contained in:
parent
40fcc658d3
commit
cfc0be618a
@ -169,11 +169,6 @@ class MessageListViewController: BaseViewController<MessageListViewModel> {
|
||||
self?.alertMessage(message: message)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
// 点击message中的URL
|
||||
output.urlTap.drive(onNext: { url in
|
||||
Client.shared.openUrl(url: url)
|
||||
}).disposed(by: rx.disposeBag)
|
||||
|
||||
// 选择群组
|
||||
output.groupFilter
|
||||
.drive(onNext: { [weak self] groupModel in
|
||||
|
||||
@ -27,7 +27,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
|
||||
var messages: Driver<[MessageSection]>
|
||||
var refreshAction: Driver<MJRefreshAction>
|
||||
var alertMessage: Driver<String>
|
||||
var urlTap: Driver<URL>
|
||||
var groupFilter: Driver<GroupFilterViewModel>
|
||||
var title: Driver<String>
|
||||
}
|
||||
@ -178,17 +177,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
|
||||
}
|
||||
}).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
|
||||
@ -260,7 +248,6 @@ class MessageListViewModel: ViewModel, ViewModelType {
|
||||
messages: messagesRelay.asDriver(onErrorJustReturn: []),
|
||||
refreshAction: refreshAction.asDriver(),
|
||||
alertMessage: alertMessage,
|
||||
urlTap: urlTap.asDriver(onErrorDriveWith: .empty()),
|
||||
groupFilter: groupFilter.asDriver(),
|
||||
title: titleRelay.asDriver()
|
||||
)
|
||||
|
||||
@ -7,7 +7,9 @@
|
||||
//
|
||||
|
||||
import Material
|
||||
import RxSwift
|
||||
import UIKit
|
||||
|
||||
class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
let backgroundPanel: UIView = {
|
||||
let view = UIView()
|
||||
@ -17,16 +19,8 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
return view
|
||||
}()
|
||||
|
||||
let titleLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.font = RobotoFont.medium(with: 16)
|
||||
label.textColor = BKColor.grey.darken4
|
||||
label.numberOfLines = 0
|
||||
return label
|
||||
}()
|
||||
|
||||
let bodyLabel: GesturePassTextView = {
|
||||
let label = GesturePassTextView()
|
||||
let bodyLabel: UITextView = {
|
||||
let label = UITextView()
|
||||
label.isEditable = false
|
||||
label.dataDetectorTypes = [.phoneNumber, .link]
|
||||
label.isScrollEnabled = false
|
||||
@ -37,16 +31,6 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
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 label = UILabel()
|
||||
label.font = RobotoFont.medium(with: 11)
|
||||
@ -54,12 +38,6 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
return label
|
||||
}()
|
||||
|
||||
let bodyStackView: UIStackView = {
|
||||
let stackView = UIStackView()
|
||||
stackView.axis = .vertical
|
||||
return stackView
|
||||
}()
|
||||
|
||||
let separatorLine: UIImageView = {
|
||||
let imageView = UIImageView()
|
||||
imageView.backgroundColor = BKColor.background.primary
|
||||
@ -72,22 +50,38 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
|
||||
self.backgroundColor = BKColor.background.primary
|
||||
contentView.addSubview(backgroundPanel)
|
||||
contentView.addSubview(bodyStackView)
|
||||
|
||||
bodyStackView.addArrangedSubview(titleLabel)
|
||||
bodyStackView.addArrangedSubview(bodyLabel)
|
||||
bodyStackView.addArrangedSubview(urlLabel)
|
||||
bodyStackView.spacing = 6
|
||||
bodyStackView.setCustomSpacing(12, after: bodyLabel)
|
||||
contentView.addSubview(bodyLabel)
|
||||
contentView.addSubview(dateLabel)
|
||||
contentView.addSubview(separatorLine)
|
||||
|
||||
self.urlLabel.addGestureRecognizer(UITapGestureRecognizer())
|
||||
|
||||
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)
|
||||
@ -96,23 +90,15 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
}
|
||||
|
||||
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
|
||||
make.left.right.equalTo(titleLabel)
|
||||
}
|
||||
urlLabel.snp.makeConstraints { make in
|
||||
make.left.right.equalTo(bodyLabel)
|
||||
make.top.equalTo(16)
|
||||
make.left.equalTo(28)
|
||||
make.right.equalTo(-28)
|
||||
}
|
||||
dateLabel.snp.remakeConstraints { make in
|
||||
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
|
||||
make.left.right.bottom.equalToSuperview()
|
||||
@ -131,16 +117,42 @@ class MessageTableViewCell: BaseTableViewCell<MessageTableViewCellViewModel> {
|
||||
override func bindViewModel(model: MessageTableViewCellViewModel) {
|
||||
super.bindViewModel(model: model)
|
||||
|
||||
model.title.bind(to: self.titleLabel.rx.text).disposed(by: rx.reuseBag)
|
||||
model.body.bind(to: self.bodyLabel.rx.text).disposed(by: rx.reuseBag)
|
||||
model.url.bind(to: self.urlLabel.rx.text).disposed(by: rx.reuseBag)
|
||||
Observable.combineLatest(model.title, model.body, model.url).subscribe { title, body, url in
|
||||
|
||||
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.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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,7 +19,6 @@ class MessageTableViewCellViewModel: ViewModel {
|
||||
let url: BehaviorRelay<String>
|
||||
let date: BehaviorRelay<String>
|
||||
|
||||
let urlTap: PublishRelay<String>
|
||||
|
||||
init(message: Message) {
|
||||
self.message = message
|
||||
@ -29,7 +28,6 @@ class MessageTableViewCellViewModel: ViewModel {
|
||||
self.url = BehaviorRelay<String>(value: message.url ?? "")
|
||||
self.date = BehaviorRelay<String>(value: (message.createDate ?? Date()).agoFormatString())
|
||||
|
||||
self.urlTap = PublishRelay<String>()
|
||||
super.init()
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user