CommunityViewController.swift 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. //
  2. // CommunityViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/6/11.
  6. // Copyright © 2019 RainbowPlanet. All rights reserved.
  7. // 社区首页
  8. import UIKit
  9. import JXSegmentedView
  10. import SwiftyMediator
  11. import Kingfisher
  12. var communityNavigationBarIsHidden: Bool = false
  13. var communityIndex: Int = 1
  14. enum CommunityModuleTopType : String {
  15. case communityModuleFollowTop = "CommunityModuleFollowTop"
  16. case communityModuleRecommendTop = "CommunityModuleRecommendTop"
  17. case communityModulePlanetTop = "CommunityModulePlanetTop"
  18. }
  19. var communityModuleTopType :CommunityModuleTopType?
  20. class CommunityViewController: BaseViewController {
  21. override func didReceiveMemoryWarning() {
  22. super.didReceiveMemoryWarning()
  23. KingfisherManager.shared.cache.clearDiskCache()
  24. KingfisherManager.shared.cache.clearMemoryCache()
  25. }
  26. deinit {
  27. NXLLog("deinit")
  28. if observe != nil {
  29. NotificationCenter.default.removeObserver(observe!)
  30. }
  31. }
  32. weak var observe : NSObjectProtocol?
  33. var communityRecommendCategorysModel: CommunityRecommendCategorysModel?
  34. override func viewWillAppear(_ animated: Bool) {
  35. super.viewWillAppear(animated)
  36. self.view.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-kTabBarTotalHeight)
  37. self.view.layoutIfNeeded()
  38. }
  39. override func viewDidAppear(_ animated: Bool) {
  40. super.viewDidAppear(animated)
  41. self.view.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-kTabBarTotalHeight)
  42. self.view.layoutIfNeeded()
  43. }
  44. override func viewDidLoad() {
  45. super.viewDidLoad()
  46. setupViews()
  47. setupLayouts()
  48. setupData()
  49. }
  50. override func setupViews() {
  51. navigationBar.isHidden = true
  52. view.addSubview(segmentedView)
  53. view.addSubview(listContainerView)
  54. // listContainerView.addSubview(publishUploadProgressView)
  55. // listContainerView.bringSubviewToFront(publishUploadProgressView)
  56. listContainerView.addSubview(publishManagerUploadView)
  57. listContainerView.bringSubviewToFront(publishManagerUploadView)
  58. view.addSubview(communityNavigationBarView)
  59. }
  60. override func setupLayouts() {
  61. communityNavigationBarView.snp.makeConstraints { (make) in
  62. make.top.equalTo(kSafeStatusBarHeight)
  63. make.left.right.equalToSuperview()
  64. make.height.equalTo(kNavBarHeight)
  65. }
  66. segmentedView.snp.makeConstraints { (make) in
  67. make.left.equalToSuperview()
  68. make.right.equalToSuperview()
  69. make.height.equalTo(44)
  70. make.top.equalTo(kNavBarTotalHeight)
  71. }
  72. listContainerView.snp.makeConstraints { (make) in
  73. make.top.equalTo(segmentedView.snp.bottom)
  74. make.left.right.bottom.equalToSuperview()
  75. }
  76. // publishUploadProgressView.snp.makeConstraints { (make) in
  77. // make.top.left.right.equalToSuperview()
  78. // make.height.equalTo(62)
  79. // }
  80. publishManagerUploadView.snp.makeConstraints { (make) in
  81. make.top.left.right.equalToSuperview()
  82. make.height.equalTo(62)
  83. }
  84. }
  85. override func setupData() {
  86. communityPostCategoryApi()
  87. //搜索
  88. communityNavigationBarView.searchClosure = {
  89. [weak self] in
  90. if UserModel.isTokenNil() {
  91. kAppDelegate.setLogin()
  92. }else {
  93. let vc = SearchViewController()
  94. vc.searchType = .content
  95. self?.navigationController?.pushViewController(vc, animated: true)
  96. }
  97. }
  98. //U米
  99. communityNavigationBarView.rightButtonClosure = {
  100. [weak self] in
  101. if UserModel.isTokenNil() {
  102. kAppDelegate.setLogin()
  103. }else {
  104. self?.tabBarController?.selectedIndex = 1
  105. }
  106. }
  107. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("login"), object: nil, queue: OperationQueue.main, using: {
  108. [weak self] (notification) in
  109. self?.reloadSegmentedView()
  110. })
  111. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("loginOut"), object: nil, queue: OperationQueue.main, using: {
  112. [weak self] (notification) in
  113. self?.reloadSegmentedView()
  114. })
  115. // 找朋友 查看全部推荐关注
  116. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityFindFriends"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
  117. let vc = CommunityFindFriendsViewController()
  118. self?.navigationController?.pushViewController(vc, animated: true)
  119. }
  120. // 推荐分享
  121. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityRecommendShare"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
  122. let communityRecommendDataModel = notification.object as? CommunityRecommendDataModel
  123. let communityRecommendTopicModel = communityRecommendDataModel?.topic?[0]
  124. self?.share(
  125. imgUrl: communityRecommendDataModel?.img,
  126. topicStr: communityRecommendTopicModel?.name,
  127. titleStr: communityRecommendDataModel?.title,
  128. avatarStr: communityRecommendDataModel?.avatar,
  129. nameStr: communityRecommendDataModel?.username,
  130. H5UrlStr: communityRecommendDataModel?.h5url,
  131. bean: communityRecommendDataModel?.willCollectBean,
  132. postId: communityRecommendDataModel?.id,
  133. uid: communityRecommendDataModel?.uid,
  134. type: communityRecommendDataModel?.type,
  135. contentStr: communityRecommendDataModel?.content
  136. )
  137. }
  138. // 关注分享
  139. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityFollowShare"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
  140. let communityFollowDataModel = notification.object as? CommunityFollowDataModel
  141. let communityFollowTopicModel = communityFollowDataModel?.relateData?.topic?[0]
  142. self?.share(
  143. imgUrl: communityFollowDataModel?.relateData?.img,
  144. topicStr: communityFollowTopicModel?.name,
  145. titleStr: communityFollowDataModel?.relateData?.title,
  146. avatarStr: communityFollowDataModel?.relateData?.avatar,
  147. nameStr: communityFollowDataModel?.relateData?.username,
  148. H5UrlStr: communityFollowDataModel?.relateData?.h5url,
  149. bean: communityFollowDataModel?.relateData?.willCollectBean,
  150. postId: communityFollowDataModel?.relateData?.id,
  151. uid: communityFollowDataModel?.relateData?.uid,
  152. type: communityFollowDataModel?.relateData?.type,
  153. contentStr: communityFollowDataModel?.relateData?.content)
  154. }
  155. // 查看全部热门视频
  156. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityPopularVideo"), object: nil, queue: OperationQueue.main) {
  157. [weak self] (notification) in
  158. let id = notification.object as? Int
  159. let vc = CommunityVideoListController()
  160. vc.contentId = id ?? 0
  161. vc.departureVc = .hotVideos
  162. self?.navigationController?.pushViewController(vc, animated: true)
  163. }
  164. // 查看其他用户中心
  165. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityUser"), object: nil, queue: OperationQueue.main) {
  166. [weak self] (notification) in
  167. let uid = notification.object as? Int
  168. if uid != UserModel.shared().getModel()?.uid {
  169. let vc = OtherPersonalCenterViewController()
  170. vc.uid = uid ?? 0
  171. self?.navigationController?.pushViewController(vc, animated: true)
  172. }
  173. }
  174. // 待发布
  175. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("DismissFromPublishEditVc"), object: nil, queue: OperationQueue.main) {[weak self] (notification) in
  176. self?.reloadSegmentedFollowView()
  177. // let aliyunVodUpToYoPublishModel = notification.object as? AliyunVodUpToYoPublishModel
  178. // self?.publishUploadProgressView.aliyunVodUpToYoPublishModel = aliyunVodUpToYoPublishModel
  179. let publishManagerModel = notification.object as? PublishManagerModel
  180. self?.publishManagerUploadView.publishManagerModel = publishManagerModel
  181. }
  182. // 滚动
  183. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityViewControllerScrollView"), object: nil, queue: OperationQueue.main) {[weak self] (notification) in
  184. let navigationBarIsHidden = notification.object as? Bool
  185. if communityNavigationBarIsHidden { //隐藏
  186. if !(navigationBarIsHidden!) {
  187. self?.communityNavigationBarView.snp.updateConstraints { (make) in
  188. make.top.equalTo(kSafeStatusBarHeight)
  189. }
  190. self?.segmentedView.snp.updateConstraints { (make) in
  191. make.top.equalTo(kNavBarTotalHeight)
  192. }
  193. }
  194. }else {
  195. if (navigationBarIsHidden!) {
  196. self?.communityNavigationBarView.snp.updateConstraints { (make) in
  197. make.top.equalTo(-kNavBarTotalHeight)
  198. }
  199. self?.segmentedView.snp.updateConstraints { (make) in
  200. make.top.equalTo(kSafeStatusBarHeight)
  201. }
  202. }
  203. }
  204. communityNavigationBarIsHidden = navigationBarIsHidden!
  205. UIView.animate(withDuration: 0.15, animations: { [weak self] in
  206. self?.view.layoutIfNeeded()
  207. self?.listContainerView.layoutSubviews()
  208. }) { (complete) in}
  209. }
  210. }
  211. // 分享
  212. func share(imgUrl : String?,
  213. topicStr : String?,
  214. titleStr : String?,
  215. avatarStr : String?,
  216. nameStr : String?,
  217. H5UrlStr : String?,
  218. bean : Int?,
  219. postId : Int?,
  220. uid : Int?,
  221. type : String?,
  222. contentStr : String?) {
  223. var title = titleStr
  224. if title == nil || title == "" {
  225. title = contentStr ?? ""
  226. }
  227. let shareCommunityView = ShareCommunityView.shareCommunityView(
  228. postId: postId ?? 0, uid: uid ?? 0,
  229. h5Str: (H5UrlStr ?? "" + "\(UserModel.shared().getModel()?.inviteCode ?? "")"),
  230. thumbnailImg: UIImage.imageUrl(imgUrl),
  231. sharedTitle: String(title ?? ""),
  232. sharedDetailTitle: kCommunityPostShareDetailTitle,
  233. shareCommunityViewType: ShareCommunityViewType.postDetail,
  234. completion: {
  235. VirusViewModel.shared.forwarVirueRecordAddApi(postId: postId, postAuthorUid: "\(uid ?? 0)", title: titleStr, content: contentStr, postType: type, postCover: imgUrl)
  236. })
  237. shareCommunityView.saveCompletion = {
  238. [weak self] in
  239. let vc = CommunityShareContentViewController()
  240. vc.imgUrl = imgUrl
  241. vc.topicStr = topicStr ?? ""
  242. if titleStr == "" || titleStr == nil {
  243. vc.titleStr =
  244. String(contentStr?.prefix(20) ?? "")
  245. }else {
  246. vc.titleStr = String(titleStr?.prefix(20) ?? "")
  247. }
  248. vc.avatarStr = avatarStr
  249. vc.nameStr = nameStr ?? ""
  250. vc.H5UrlStr = (H5UrlStr ?? "" + "\(UserModel.shared().getModel()?.inviteCode ?? "")")
  251. vc.bean = bean ?? 0
  252. vc.postId = postId
  253. vc.uid = uid
  254. vc.type = type
  255. vc.contentStr = contentStr
  256. self?.navigationController?.pushViewController(vc, animated: true)
  257. }
  258. shareCommunityView.deleteCompletion = {
  259. [weak self] in
  260. self?.communityDeleteApi(postId: postId ?? 0)
  261. }
  262. }
  263. /// 删除帖子
  264. func communityDeleteApi(postId:Int) {
  265. SwiftMoyaNetWorkServiceCommunity.shared().communityDeleteApi(postId: postId) {(data) -> (Void) in}
  266. }
  267. //选中关注
  268. func reloadSegmentedFollowView() {
  269. self.segmentedView.selectItemAt(index: 0)
  270. self.segmentedView.defaultSelectedIndex = 0
  271. self.listContainerView.defaultSelectedIndex = 0
  272. self.segmentedDataSource.reloadData(selectedIndex: 0)
  273. self.listContainerView.reloadData()
  274. }
  275. //选中推荐
  276. func reloadSegmentedView() {
  277. self.segmentedView.selectItemAt(index: 1)
  278. self.segmentedView.defaultSelectedIndex = 1
  279. self.listContainerView.defaultSelectedIndex = 1
  280. self.segmentedDataSource.reloadData(selectedIndex: 1)
  281. self.listContainerView.reloadData()
  282. }
  283. //选中星球
  284. func reloadSegmentedStarView() {
  285. self.segmentedView.selectItemAt(index: 2)
  286. self.segmentedView.defaultSelectedIndex = 2
  287. self.listContainerView.defaultSelectedIndex = 2
  288. self.segmentedDataSource.reloadData(selectedIndex: 2)
  289. self.listContainerView.reloadData()
  290. }
  291. /// navigationBar
  292. private lazy var communityNavigationBarView: CommunityNavigationBarView = {
  293. let communityNavigationBarView = CommunityNavigationBarView()
  294. return communityNavigationBarView
  295. }()
  296. //1.初始化JXSegmentedViewx
  297. private lazy var segmentedView: JXSegmentedView = {
  298. let segmentedView = JXSegmentedView()
  299. segmentedView.delegate = self
  300. segmentedView.indicators = [indicator]
  301. segmentedView.contentScrollView = listContainerView.scrollView
  302. segmentedView.defaultSelectedIndex = 1
  303. segmentedView.contentEdgeInsetLeft = 14
  304. segmentedView.contentEdgeInsetRight = 14
  305. return segmentedView
  306. }()
  307. //2.初始化dataSource
  308. private lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  309. let segmentedDataSource = JXSegmentedTitleDataSource()
  310. segmentedDataSource.isTitleColorGradientEnabled = true
  311. segmentedDataSource.isItemSpacingAverageEnabled = false
  312. segmentedDataSource.isTitleZoomEnabled = true
  313. segmentedDataSource.titleNormalColor = kbbbbbbColor
  314. segmentedDataSource.titleSelectedColor = k333333Color
  315. segmentedDataSource.titleNormalFont = kRegularFont15!
  316. segmentedDataSource.titleSelectedFont = kRegularFont15
  317. segmentedDataSource.titleSelectedZoomScale = 1.13
  318. segmentedDataSource.isTitleStrokeWidthEnabled = true
  319. //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
  320. segmentedDataSource.reloadData(selectedIndex: 1)
  321. return segmentedDataSource
  322. }()
  323. /// 刷新数据
  324. func reloadDataDefault() {
  325. self.setupViews()
  326. self.setupLayouts()
  327. segmentedDataSource.titles = ["关注","推荐"]
  328. segmentedView.dataSource = segmentedDataSource
  329. listContainerView.defaultSelectedIndex = 0
  330. segmentedView.defaultSelectedIndex = 0
  331. segmentedDataSource.reloadData(selectedIndex: 0)
  332. listContainerView.reloadData()
  333. }
  334. //3.初始化指示器indicator
  335. private lazy var indicator: JXSegmentedIndicatorLineView = {
  336. let indicator = JXSegmentedIndicatorLineView()
  337. indicator.indicatorColor = kThemeColor
  338. indicator.indicatorHeight = 3
  339. indicator.indicatorWidth = 14
  340. return indicator
  341. }()
  342. //4.初始化JXSegmentedListContainerView
  343. private lazy var listContainerView: JXSegmentedListContainerView = {
  344. let listContainerView = JXSegmentedListContainerView(dataSource: self)
  345. listContainerView.defaultSelectedIndex = 1
  346. return listContainerView
  347. }()
  348. lazy var linebgImageView: UIImageView = {
  349. let linebgImageView = UIImageView()
  350. linebgImageView.image = kImage(name: "navbar_shadow_pic_up")
  351. return linebgImageView
  352. }()
  353. lazy var publishUploadProgressView: PublishUploadProgressView = {
  354. let publishUploadProgressView = PublishUploadProgressView()
  355. return publishUploadProgressView
  356. }()
  357. lazy var publishManagerUploadView: PublishManagerUploadView = {
  358. let publishManagerUploadView = PublishManagerUploadView()
  359. return publishManagerUploadView
  360. }()
  361. var index : Int?
  362. /// 推荐分类
  363. func communityPostCategoryApi() {
  364. SwiftMoyaNetWorkServiceCommunity.shared().communityPostCategoryApi(completion: { [weak self] (communityRecommendCategorysModel) -> (Void) in
  365. self?.communityRecommendCategorysModel = communityRecommendCategorysModel as? CommunityRecommendCategorysModel
  366. self?.communityRecommendCategorysModel?.categoryListName?.insert("关注", at: 0)
  367. self?.segmentedDataSource.titles = self?.communityRecommendCategorysModel?.categoryListName ?? ["关注","推荐"]
  368. self?.segmentedView.dataSource = self?.segmentedDataSource
  369. self?.listContainerView.defaultSelectedIndex = 1
  370. self?.segmentedView.defaultSelectedIndex = 1
  371. self?.segmentedDataSource.reloadData(selectedIndex: 1)
  372. self?.listContainerView.reloadData()
  373. self?.segmentedView.reloadData()
  374. }) { [weak self] (loadingStatus) in
  375. self?.reloadDataDefault()
  376. }
  377. }
  378. }
  379. extension CommunityViewController : JXSegmentedViewDelegate {
  380. //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
  381. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  382. // if index == 0 {
  383. // communityModuleTopType = .communityModuleFollowTop
  384. // }
  385. // if index == 1 {
  386. // communityModuleTopType = .communityModuleRecommendTop
  387. // }
  388. // if index == 2 {
  389. // communityModuleTopType = .communityModulePlanetTop
  390. // if (communityNavigationBarIsHidden) {
  391. // self.communityNavigationBarView.snp.updateConstraints { (make) in
  392. // make.top.equalTo(kSafeStatusBarHeight)
  393. // }
  394. // self.segmentedView.snp.updateConstraints { (make) in
  395. // make.top.equalTo(kNavBarTotalHeight)
  396. // }
  397. // communityNavigationBarIsHidden = false
  398. // UIView.animate(withDuration: 0.15, animations: { [weak self] in
  399. // self?.view.layoutIfNeeded()
  400. // self?.listContainerView.layoutSubviews()
  401. // }) { (complete) in}
  402. // }
  403. // }
  404. // communityIndex = index
  405. listContainerView.didClickSelectedItem(at: index)
  406. // self.index = index
  407. }
  408. // 点击选中的情况才会调用该方法
  409. func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
  410. //传递didClickSelectedItemAt事件给listContainerView,必须调用!!!
  411. }
  412. // 滚动选中的情况才会调用该方法
  413. func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
  414. }
  415. // 正在滚动中的回调
  416. func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
  417. //传递scrolling事件给listContainerView,必须调用!!!
  418. // listContainerView.segmentedViewScrolling(from: leftIndex, to: rightIndex, percent: percent, selectedIndex: segmentedView.selectedIndex)
  419. }
  420. /// 是否允许点击选中目标index的item
  421. func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
  422. return true
  423. }
  424. }
  425. extension CommunityViewController :JXSegmentedListContainerViewDataSource {
  426. func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
  427. if let titleDataSource = segmentedView.dataSource as? JXSegmentedBaseDataSource {
  428. return titleDataSource.dataSource.count
  429. }
  430. return 0
  431. }
  432. func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
  433. if index == 0 {
  434. let vc = CommunityFollowViewController()
  435. communityModuleTopType = .communityModuleFollowTop
  436. return vc
  437. }else {
  438. let vc = CommunityRecommnendViewController()
  439. vc.communityRecommendCategoryModel = communityRecommendCategorysModel?.categoryList?[index-1]
  440. communityModuleTopType = .communityModuleRecommendTop
  441. return vc
  442. }
  443. }
  444. }