PreviewCardCell.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // PreviewCardCell.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2018/6/26.
  6. // Copyright © 2018 Fin. All rights reserved.
  7. //
  8. import Material
  9. import UIKit
  10. class PreviewCardCell: BaseTableViewCell<PreviewCardCellViewModel> {
  11. let previewButton = IconButton(image: Icon.cm.skipForward, tintColor: BKColor.grey.base)
  12. let copyButton = IconButton(image: UIImage(named: "baseline_file_copy_white_24pt"), tintColor: BKColor.grey.base)
  13. let titleLabel: UILabel = {
  14. let label = UILabel()
  15. label.font = RobotoFont.regular(with: 14)
  16. label.textColor = BKColor.grey.darken3
  17. label.numberOfLines = 0
  18. return label
  19. }()
  20. let bodyLabel: UILabel = {
  21. let label = UILabel()
  22. label.font = RobotoFont.regular(with: 14)
  23. label.textColor = BKColor.grey.darken2
  24. label.numberOfLines = 0
  25. return label
  26. }()
  27. let noticeLabel: UILabel = {
  28. let label = UILabel()
  29. label.font = RobotoFont.regular(with: 12)
  30. label.textColor = BKColor.grey.base
  31. label.numberOfLines = 0
  32. label.isUserInteractionEnabled = true
  33. return label
  34. }()
  35. let contentImageView: UIImageView = {
  36. let imageView = UIImageView()
  37. imageView.contentMode = .scaleAspectFit
  38. return imageView
  39. }()
  40. let card: UIView = {
  41. let view = UIView()
  42. view.backgroundColor = BKColor.background.secondary
  43. view.layer.cornerRadius = 2
  44. view.clipsToBounds = true
  45. return view
  46. }()
  47. var copyHandler: (() -> Void)?
  48. let contentLabel: UILabel = {
  49. let label = UILabel()
  50. label.lineBreakMode = .byCharWrapping
  51. label.numberOfLines = 0
  52. label.font = RobotoFont.regular(with: 14)
  53. return label
  54. }()
  55. @available(*, unavailable)
  56. required init?(coder aDecoder: NSCoder) {
  57. fatalError("init(coder:) has not been implemented")
  58. }
  59. override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  60. super.init(style: style, reuseIdentifier: reuseIdentifier)
  61. self.selectionStyle = .none
  62. self.backgroundColor = BKColor.background.primary
  63. contentView.addSubview(card)
  64. card.addSubview(copyButton)
  65. card.addSubview(previewButton)
  66. card.snp.makeConstraints { make in
  67. make.left.top.equalToSuperview().offset(16)
  68. make.right.equalToSuperview().offset(-16)
  69. make.bottom.equalToSuperview()
  70. }
  71. previewButton.snp.makeConstraints { make in
  72. make.right.equalToSuperview().offset(-10)
  73. make.centerY.equalTo(card.snp.top).offset(40)
  74. make.width.height.equalTo(40)
  75. }
  76. copyButton.snp.makeConstraints { make in
  77. make.right.equalTo(previewButton.snp.left).offset(-10)
  78. make.centerY.equalTo(previewButton)
  79. make.width.height.equalTo(40)
  80. }
  81. let titleStackView = UIStackView()
  82. titleStackView.axis = .vertical
  83. titleStackView.addArrangedSubview(titleLabel)
  84. titleStackView.addArrangedSubview(bodyLabel)
  85. card.addSubview(titleStackView)
  86. titleLabel.snp.makeConstraints { make in
  87. make.left.equalToSuperview().offset(15)
  88. }
  89. bodyLabel.snp.makeConstraints { make in
  90. make.left.equalToSuperview().offset(15)
  91. }
  92. titleStackView.snp.makeConstraints { make in
  93. make.centerY.equalTo(copyButton)
  94. make.left.equalToSuperview()
  95. make.right.equalTo(copyButton.snp.left)
  96. }
  97. let contentStackView = UIStackView()
  98. contentStackView.axis = .vertical
  99. contentStackView.spacing = 20
  100. contentStackView.setCustomSpacing(10, after: contentLabel)
  101. card.addSubview(contentStackView)
  102. contentStackView.addArrangedSubview(contentImageView)
  103. contentStackView.addArrangedSubview(contentLabel)
  104. contentStackView.addArrangedSubview(noticeLabel)
  105. contentLabel.snp.makeConstraints { make in
  106. make.left.equalToSuperview().offset(12)
  107. make.right.equalToSuperview().offset(-12)
  108. }
  109. contentImageView.snp.remakeConstraints { make in
  110. make.left.right.equalToSuperview()
  111. }
  112. noticeLabel.snp.makeConstraints { make in
  113. make.left.equalTo(10)
  114. make.right.equalTo(-10)
  115. }
  116. contentStackView.snp.makeConstraints { make in
  117. make.left.right.equalToSuperview()
  118. make.top.equalTo(previewButton.snp.bottom).offset(20)
  119. make.bottom.equalToSuperview().offset(-10)
  120. }
  121. noticeLabel.addGestureRecognizer(UITapGestureRecognizer())
  122. }
  123. override func bindViewModel(model: PreviewCardCellViewModel) {
  124. super.bindViewModel(model: model)
  125. model.title
  126. .bind(to: self.titleLabel.rx.text).disposed(by: rx.reuseBag)
  127. model.body
  128. .bind(to: self.bodyLabel.rx.text).disposed(by: rx.reuseBag)
  129. model.content
  130. .bind(to: self.contentLabel.rx.attributedText).disposed(by: rx.reuseBag)
  131. model.notice
  132. .bind(to: self.noticeLabel.rx.attributedText).disposed(by: rx.reuseBag)
  133. model.contentImage
  134. .compactMap { $0 }
  135. .bind(to: self.contentImageView.rx.image)
  136. .disposed(by: rx.reuseBag)
  137. model.contentImage
  138. .map { $0 == nil }
  139. .bind(to: self.contentImageView.rx.isHidden)
  140. .disposed(by: rx.reuseBag)
  141. // 点击通知
  142. noticeLabel.gestureRecognizers!.first!
  143. .rx.event
  144. .compactMap { [weak weakModel = viewModel] _ -> ViewModel? in
  145. // 仅在有 moreViewModel 时 点击
  146. weakModel?.previewModel.moreViewModel
  147. }
  148. .bind(to: model.noticeTap)
  149. .disposed(by: rx.reuseBag)
  150. // 点击复制
  151. copyButton.rx.tap.map { [weak self] () -> String in
  152. self?.contentLabel.text ?? ""
  153. }
  154. .bind(to: model.copy)
  155. .disposed(by: rx.reuseBag)
  156. // 点击预览
  157. previewButton.rx.tap.compactMap { [weak self] () -> URL? in
  158. if let urlStr = self?.contentLabel.text?.urlEncoded(),
  159. let url = URL(string: urlStr)
  160. {
  161. return url
  162. }
  163. return nil
  164. }
  165. .bind(to: model.preview)
  166. .disposed(by: rx.reuseBag)
  167. }
  168. }