CommunityViewController.swift 22 KB

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