From cfc0be618acefec2e66cde42fcc99aee8ebbdf8a Mon Sep 17 00:00:00 2001 From: Fin Date: Wed, 26 Jul 2023 17:52:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8E=86=E5=8F=B2=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=89=8B=E5=8A=BF=E4=BA=A4=E4=BA=92=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controller/MessageListViewController.swift | 5 - Controller/MessageListViewModel.swift | 13 -- View/MessageTableViewCell.swift | 134 +++++++++++---------- View/MessageTableViewCellViewModel.swift | 4 +- 4 files changed, 74 insertions(+), 82 deletions(-) diff --git a/Controller/MessageListViewController.swift b/Controller/MessageListViewController.swift index 3fe137e..486a44a 100644 --- a/Controller/MessageListViewController.swift +++ b/Controller/MessageListViewController.swift @@ -169,11 +169,6 @@ class MessageListViewController: BaseViewController { 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 diff --git a/Controller/MessageListViewModel.swift b/Controller/MessageListViewModel.swift index fa9cb13..8a0fae3 100644 --- a/Controller/MessageListViewModel.swift +++ b/Controller/MessageListViewModel.swift @@ -27,7 +27,6 @@ class MessageListViewModel: ViewModel, ViewModelType { var messages: Driver<[MessageSection]> var refreshAction: Driver var alertMessage: Driver - var urlTap: Driver var groupFilter: Driver var title: Driver } @@ -178,17 +177,6 @@ class MessageListViewModel: ViewModel, ViewModelType { } }).disposed(by: rx.disposeBag) - // cell 中点击 url。 - let urlTap = messagesRelay.flatMapLatest { section -> Observable in - if let section = section.first { - let taps = section.messages.compactMap { model -> Observable 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() ) diff --git a/View/MessageTableViewCell.swift b/View/MessageTableViewCell.swift index e3c1182..4ca050b 100644 --- a/View/MessageTableViewCell.swift +++ b/View/MessageTableViewCell.swift @@ -7,7 +7,9 @@ // import Material +import RxSwift import UIKit + class MessageTableViewCell: BaseTableViewCell { let backgroundPanel: UIView = { let view = UIView() @@ -17,16 +19,8 @@ class MessageTableViewCell: BaseTableViewCell { 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 { 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 { 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 { 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 { } 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 { 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) } } diff --git a/View/MessageTableViewCellViewModel.swift b/View/MessageTableViewCellViewModel.swift index d4452ea..a708e22 100644 --- a/View/MessageTableViewCellViewModel.swift +++ b/View/MessageTableViewCellViewModel.swift @@ -19,7 +19,6 @@ class MessageTableViewCellViewModel: ViewModel { let url: BehaviorRelay let date: BehaviorRelay - let urlTap: PublishRelay init(message: Message) { self.message = message @@ -28,8 +27,7 @@ class MessageTableViewCellViewModel: ViewModel { self.body = BehaviorRelay(value: message.body ?? "") self.url = BehaviorRelay(value: message.url ?? "") self.date = BehaviorRelay(value: (message.createDate ?? Date()).agoFormatString()) - - self.urlTap = PublishRelay() + super.init() } }