CommunityRecommnendViewController.swift 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. //
  2. // CommunityRecommnendViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/6/28.
  6. // Copyright © 2019 RainbowPlanet. All rights reserved.
  7. //
  8. import UIKit
  9. import JXSegmentedView
  10. class CommunityRecommnendViewController: UIViewController {
  11. var cellHeightsDictionary = Dictionary<IndexPath, Any>()
  12. var communityRecommendDataModels = Array<CommunityRecommendDataModel>()
  13. /// 评论需要的模型
  14. var communityRecommendDataModel : CommunityRecommendDataModel?
  15. override func viewDidLoad() {
  16. super.viewDidLoad()
  17. setupViews()
  18. setupLayouts()
  19. setupData()
  20. }
  21. func setupViews() {
  22. view.backgroundColor = kf7f8faColor
  23. view.addSubview(tableView)
  24. let emptyView = DIYEmptyView.empty(with: kImage(name: "default_page_data"), titleStr: nil, detailStr: "当前暂无数据")
  25. emptyView!.contentViewY = kScaleValue(value: 182)
  26. tableView.ly_emptyView = emptyView
  27. view.addSubview(commentInputView)
  28. }
  29. func setupLayouts() {
  30. tableView.snp.makeConstraints { (make) in
  31. make.top.left.right.equalToSuperview()
  32. make.height.equalTo(kScreenHeight-48-kNavBarTotalHeight-kTabBarTotalHeight)
  33. }
  34. tableView.reloadData()
  35. }
  36. lazy var commentInputView: CommentInputView = {
  37. let commentInputView = CommentInputView(isHidden: true)
  38. return commentInputView
  39. }()
  40. func setupData() {
  41. //下拉刷新
  42. tableView.addHeaderWithHeader(withBeginRefresh: true, animation: false) {
  43. [weak self] (page) in
  44. self?.communityPostSuggestApi(page:page)
  45. }
  46. tableView.addFooterWithWithHeader(withAutomaticallyRefresh: false) {
  47. [weak self] (page) in
  48. self?.communityPostSuggestApi(page:page)
  49. }
  50. commentInputView.commentInputViewClosure = {
  51. [weak self] text in
  52. self?.communityPostCommentApi(text: text)
  53. }
  54. }
  55. private lazy var tableView: UITableView = {
  56. let tableView = UITableView(frame: CGRect.zero, style: UITableView.Style.grouped)
  57. tableView.separatorStyle = .none
  58. tableView.backgroundColor = kf7f8faColor
  59. tableView.dataSource = self
  60. tableView.delegate = self
  61. return tableView
  62. }()
  63. private lazy var followTableHeaderView: CommunityFollowTableHeaderView = {
  64. let followTableHeaderView = CommunityFollowTableHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 286))
  65. return followTableHeaderView
  66. }()
  67. /// 关注接口
  68. func followData(indexPath: IndexPath) {
  69. tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
  70. }
  71. }
  72. extension CommunityRecommnendViewController {
  73. /// 推荐feed流
  74. ///
  75. /// - Parameter page: 分页
  76. func communityPostSuggestApi(page:Int) {
  77. SwiftMoyaNetWorkServiceCommunity.shared().communityPostSuggestApi(page:page) {
  78. [weak self] (communityRecommendFeedModel) -> (Void) in
  79. let communityRecommendFeedModel = communityRecommendFeedModel as? CommunityRecommendFeedModel
  80. if communityRecommendFeedModel?.pagination?.currentPage ?? 1 <= communityRecommendFeedModel?.pagination?.totalPages ?? 1 {
  81. if communityRecommendFeedModel?.pagination?.currentPage == 1{
  82. self?.communityRecommendDataModels.removeAll()
  83. }
  84. self?.communityRecommendDataModels = (self?.communityRecommendDataModels)! + (communityRecommendFeedModel?.data!)!
  85. self?.tableView.reloadData()
  86. if self?.communityRecommendDataModels.count ?? 0 >= communityRecommendFeedModel?.pagination?.total ?? 0 {
  87. self?.tableView.endFooterNoMoreData()
  88. }
  89. }else {
  90. self?.tableView.endFooterNoMoreData()
  91. }
  92. }
  93. }
  94. /// 评论
  95. func communityPostCommentApi(text:String) {
  96. let communityCustomCommnetModel = CommunityCustomCommnetModel()
  97. communityCustomCommnetModel.postId = communityRecommendDataModel?.id ?? 0
  98. communityCustomCommnetModel.content = text
  99. SwiftMoyaNetWorkServiceCommunity.shared().communityPostCommentApi(communityCustomCommnetModel: communityCustomCommnetModel) {
  100. [weak self] (communityPostCommentIdModel) -> (Void) in
  101. let communityPostCommentIdModel = communityPostCommentIdModel as? CommunityPostCommentIdModel
  102. let communityRecommendCommentModel = CommunityRecommendCommentModel()
  103. communityRecommendCommentModel.content = text
  104. communityRecommendCommentModel.id = communityPostCommentIdModel?.id
  105. communityRecommendCommentModel.username = UserModel.shared().getModel()?.username
  106. if self?.communityRecommendDataModel?.comment?.isEmpty ?? true {
  107. self?.communityRecommendDataModel?.comment = Array<CommunityRecommendCommentModel>()
  108. }
  109. self?.communityRecommendDataModel?.comment?.insert(communityRecommendCommentModel, at: 0)
  110. VirusViewModel.shared.comment(communityRecommendDataModel: self?.communityRecommendDataModel, id: communityPostCommentIdModel?.id ?? 0)
  111. let count = self?.communityRecommendDataModel?.commentCount ?? 0 + 1
  112. self?.communityRecommendDataModel?.commentCount = count
  113. self?.tableView.reloadData()
  114. self?.commentInputView.sendSuccess()
  115. }
  116. }
  117. }
  118. extension CommunityRecommnendViewController : UITableViewDelegate,UITableViewDataSource {
  119. func numberOfSections(in tableView: UITableView) -> Int {
  120. return communityRecommendDataModels.isEmpty ? 0 : communityRecommendDataModels.count
  121. }
  122. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  123. let communityRecommendDataModel = communityRecommendDataModels[section]
  124. if CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "") == .post {
  125. return 6
  126. }else {
  127. return 1
  128. }
  129. }
  130. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  131. let communityRecommendDataModel = communityRecommendDataModels[indexPath.section]
  132. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "")
  133. switch communityPostSuggestCType {
  134. case .banner?: //banner
  135. let cell = CommunityBannerTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  136. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  137. cell.communityRecommendTypeDataModels = communityRecommendDataModel.data
  138. }
  139. return cell
  140. case .user?: //推荐用户
  141. let cell = CommunityRecommendFollowTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  142. cell.type = .recommend
  143. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  144. cell.communityRecommendTypeDataModels = communityRecommendDataModel.data
  145. cell.followClosure1 = {
  146. [weak self] (isFollow,communityRecommendTypeDataModel) in
  147. for (_,model) in (self?.communityRecommendDataModels.enumerated())! {
  148. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: model.showType ?? "")
  149. if communityPostSuggestCType == .post {
  150. if model.uid == communityRecommendTypeDataModel.uid {
  151. model.isFollow = isFollow
  152. tableView.reloadData()
  153. }
  154. }
  155. }
  156. }
  157. }
  158. return cell
  159. case .video?: //推荐视频
  160. let cell = PopularVideoTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  161. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  162. cell.communityRecommendTypeDataModels = communityRecommendDataModel.data
  163. }
  164. return cell
  165. case .topic?: //推荐话题
  166. let cell = FeaturedTopicsTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  167. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  168. cell.communityRecommendTypeDataModels = communityRecommendDataModel.data
  169. }
  170. return cell
  171. case .post?: //贴子
  172. switch indexPath.row {
  173. //贴子用户
  174. case 0:
  175. let cell = CardContentUserTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  176. cell.communityRecommendDataModel = communityRecommendDataModel
  177. cell.followClosure = {
  178. [weak self] in
  179. CommunityFollowUserViewModel.shared.follow(communityRecommendDataModel: communityRecommendDataModel, communityRecommendDataModels: (self?.communityRecommendDataModels)!, tableView: tableView)
  180. }
  181. cell.likeClosure = { y in
  182. VirusViewModel.shared.like(communityRecommendDataModel: communityRecommendDataModel, y: y, tableView: tableView)
  183. }
  184. return cell
  185. //图片视频
  186. case 1:
  187. let cell = CardContentPicVideoTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  188. cell.type = .recommend
  189. cell.communityRecommendDataModel = communityRecommendDataModel
  190. return cell
  191. //内容标题
  192. case 2:
  193. let cell = CardContentTitleTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  194. cell.communityRecommendDataModel = communityRecommendDataModel
  195. return cell
  196. //点赞,收藏,分享
  197. case 3:
  198. let cell = CardContentActionTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  199. cell.communityRecommendDataModel = communityRecommendDataModel
  200. cell.praiseClosureName = { (button:UIButton) in
  201. VirusViewModel.shared.praise(communityRecommendDataModel: communityRecommendDataModel, tableView: tableView)
  202. }
  203. cell.collectClosureName = {
  204. (button:UIButton) in
  205. VirusViewModel.shared.collection(communityRecommendDataModel: communityRecommendDataModel, tableView: tableView)
  206. }
  207. return cell
  208. //评论列表
  209. case 4:
  210. let cell = CardContentCommentListTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  211. cell.communityRecommendDataModel = communityRecommendDataModel
  212. cell.frame = tableView.bounds
  213. cell.layoutIfNeeded()
  214. cell.reloadData()
  215. return cell
  216. //评论
  217. case 5:
  218. let cell = CardContentCommnetTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
  219. cell.addCommnetClosureName = {
  220. [weak self] in
  221. self?.communityRecommendDataModel = self?.communityRecommendDataModels[indexPath.section]
  222. self?.commentInputView.inputTextView.becomeFirstResponder()
  223. }
  224. return cell
  225. default:
  226. return UITableViewCell()
  227. }
  228. default:
  229. return UITableViewCell()
  230. }
  231. }
  232. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  233. let communityRecommendDataModel = communityRecommendDataModels[indexPath.section]
  234. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "")
  235. switch communityPostSuggestCType {
  236. //banner
  237. case .banner?:
  238. break
  239. //推荐用户
  240. case .user?:
  241. break
  242. //推荐视频
  243. case .video?:
  244. break
  245. //推荐话题
  246. case .topic?:
  247. break
  248. //贴子
  249. case .post?:
  250. switch indexPath.row {
  251. //贴子用户
  252. case 0:
  253. break
  254. //图片视频/内容标题/评论列表
  255. case 1,2,4:
  256. if PostType(rawValue: communityRecommendDataModel.type ?? "video") == .video {
  257. NotificationCenter.default.post(name: NSNotification.Name("CommunityContentVideoClosure"), object: communityRecommendDataModel.id)
  258. }else {
  259. NotificationCenter.default.post(name: NSNotification.Name("CommunityContentDetailClosure"), object: communityRecommendDataModel.id)
  260. }
  261. break
  262. //点赞,收藏,分享
  263. case 3:
  264. break
  265. //评论
  266. case 5:
  267. break
  268. default:
  269. break
  270. }
  271. break
  272. default:
  273. break
  274. }
  275. }
  276. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  277. let communityRecommendDataModel = communityRecommendDataModels[indexPath.section]
  278. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "")
  279. switch communityPostSuggestCType {
  280. //banner
  281. case .banner?:
  282. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  283. return 150 * kScaleWidth
  284. }
  285. return 0
  286. //推荐用户
  287. case .user?:
  288. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  289. return 191
  290. }
  291. return 0
  292. //推荐视频
  293. case .video?:
  294. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  295. return 241
  296. }
  297. return 0
  298. //推荐话题
  299. case .topic?:
  300. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  301. return 173
  302. }
  303. return 0
  304. //贴子
  305. case .post?:
  306. switch indexPath.row {
  307. //贴子用户
  308. case 0:
  309. if communityRecommendDataModel.uid != nil {
  310. return 80
  311. }
  312. return 0
  313. //图片视频
  314. case 1:
  315. let cardContentPicVideoModel = CardContentPicVideoModel()
  316. cardContentPicVideoModel.postType = PostType(rawValue: communityRecommendDataModel.type ?? "html")
  317. let imgStr = communityRecommendDataModel.img
  318. if communityRecommendDataModel.imgs?.count ?? 0 == 0 {
  319. if communityRecommendDataModel.img != "" && communityRecommendDataModel.img != nil {
  320. cardContentPicVideoModel.number = 1
  321. cardContentPicVideoModel.width = getImageWidth(imgStr: (imgStr)!)
  322. cardContentPicVideoModel.height = getImageHeight(imgStr: (imgStr)!)
  323. return cardContentPicVideoModel.collectionViewHeight() + 20
  324. }else {
  325. return 0
  326. }
  327. }else {
  328. if communityRecommendDataModel.imgs?.count ?? 0 == 1 {
  329. if communityRecommendDataModel.img != "" || communityRecommendDataModel.img != nil {
  330. cardContentPicVideoModel.number = 1
  331. cardContentPicVideoModel.width = getImageWidth(imgStr: (imgStr)!)
  332. cardContentPicVideoModel.height = getImageHeight(imgStr: (imgStr)!)
  333. return cardContentPicVideoModel.collectionViewHeight() + 20
  334. }else {
  335. return 0
  336. }
  337. }else {
  338. cardContentPicVideoModel.number = communityRecommendDataModel.imgs?.count ?? 0
  339. return cardContentPicVideoModel.collectionViewHeight() + 20
  340. }
  341. }
  342. //内容标题
  343. case 2:
  344. return UITableView.automaticDimension
  345. //点赞,收藏,分享
  346. case 3:
  347. return 54
  348. //评论列表
  349. case 4:
  350. if !(communityRecommendDataModel.comment?.isEmpty ?? true) {
  351. return UITableView.automaticDimension
  352. }
  353. return 0
  354. //评论
  355. case 5:
  356. return 74
  357. default:
  358. return 0
  359. }
  360. default:
  361. return 0
  362. }
  363. }
  364. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  365. let communityRecommendDataModel = communityRecommendDataModels[section]
  366. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "")
  367. switch communityPostSuggestCType {
  368. //banner
  369. case .banner?:
  370. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  371. return 0
  372. }
  373. return 0
  374. //推荐用户
  375. case .user?:
  376. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  377. return 62
  378. }
  379. return 0
  380. //推荐视频
  381. case .video?:
  382. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  383. return 62
  384. }
  385. return 0
  386. //推荐话题
  387. case .topic?:
  388. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  389. return 62
  390. }
  391. return 0
  392. //贴子
  393. case .post?:
  394. return 0
  395. default:
  396. return 0
  397. }
  398. }
  399. func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
  400. return 10
  401. }
  402. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  403. let communityRecommendDataModel = communityRecommendDataModels[section]
  404. let communityPostSuggestCType = CommunityPostSuggestType(rawValue: communityRecommendDataModel.showType ?? "")
  405. let headerView = CommunityCommonSectionHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 62))
  406. switch communityPostSuggestCType {
  407. //banner
  408. case .banner?:
  409. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  410. return nil
  411. }
  412. return nil
  413. //推荐用户
  414. case .user?:
  415. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  416. headerView.communityCommonSectionHeaderViewType = .recommendFollow
  417. return headerView
  418. }
  419. return nil
  420. //推荐视频
  421. case .video?:
  422. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  423. headerView.communityCommonSectionHeaderViewType = .popularVideo
  424. return headerView
  425. }
  426. return nil
  427. //推荐话题
  428. case .topic?:
  429. if !(communityRecommendDataModel.data?.isEmpty ?? true) {
  430. headerView.communityCommonSectionHeaderViewType = .featuredTopics
  431. return headerView
  432. }
  433. return nil
  434. //贴子
  435. case .post?:
  436. return nil
  437. default:
  438. return nil
  439. }
  440. }
  441. func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
  442. cellHeightsDictionary.updateValue(cell.frame.size.height, forKey: indexPath)
  443. }
  444. func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  445. let height = cellHeightsDictionary[indexPath]
  446. if let height = height {
  447. return height as! CGFloat
  448. }
  449. return UITableView.automaticDimension
  450. }
  451. func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
  452. return nil
  453. }
  454. }
  455. extension CommunityRecommnendViewController : JXSegmentedListContainerViewListDelegate {
  456. func listView() -> UIView {
  457. return view
  458. }
  459. }