CircleViewController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. //
  2. // CircleViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/10/14.
  6. // Copyright © 2019 RainbowPlanet. All rights reserved.
  7. //
  8. import UIKit
  9. import JXSegmentedView
  10. import JXPagingView
  11. import RxSwift
  12. import SwiftyMediator
  13. import Kingfisher
  14. class CircleViewController: BaseViewController {
  15. deinit {
  16. NXLLog("deinit")
  17. }
  18. override func didReceiveMemoryWarning() {
  19. super.didReceiveMemoryWarning()
  20. KingfisherManager.shared.cache.clearDiskCache()
  21. KingfisherManager.shared.cache.clearMemoryCache()
  22. }
  23. var circleId : Int?
  24. var JXTableHeaderViewHeight: Int = Int(114 + kNavBarTotalHeight + 104)
  25. let JXHeightForHeaderInSection: Int = 44
  26. var communityCircleModel : CommunityCircleModel?
  27. var cmsTemplateTitles = ["精选", "提问"]
  28. var circleLeavingMessageView : CircleLeavingMessageView?
  29. override func viewDidLoad() {
  30. super.viewDidLoad()
  31. setupData()
  32. }
  33. override func setupViews() {
  34. circleContainerView.addSubview(circleHeaderView)
  35. view.addSubview(segmentedView)
  36. view.addSubview(pagingView)
  37. view.insertSubview(navigationBar, aboveSubview: pagingView)
  38. setnavigationBar()
  39. view.addSubview(plusButton)
  40. }
  41. override func setupLayouts() {
  42. navigationBgView.snp.makeConstraints { (make) in
  43. make.edges.equalToSuperview()
  44. }
  45. avatarButton.snp.makeConstraints { (make) in
  46. make.left.equalTo(navigationBar.leftButton.snp.right)
  47. make.size.equalTo(20)
  48. make.centerY.equalTo(navigationBar.rightButton)
  49. }
  50. nameButton.snp.makeConstraints { (make) in
  51. make.centerY.equalTo(avatarButton)
  52. make.left.equalTo(avatarButton.snp.right).offset(4)
  53. }
  54. plusButton.snp.makeConstraints { (make) in
  55. make.bottom.equalTo(-(kSafeTabBarHeight + 48))
  56. make.right.equalTo(-14)
  57. make.size.equalTo(46)
  58. }
  59. }
  60. override func setupData() {
  61. navigationBar.onClickRightButton = {
  62. [weak self] in
  63. if UserModel.isTokenNil() {
  64. kAppDelegate.setLogin()
  65. }else {
  66. let vc = CircleShareContentViewController()
  67. vc.imgUrl = self?.communityCircleModel?.image
  68. vc.circleNameStr = self?.communityCircleModel?.name ?? ""
  69. self?.navigationController?.pushViewController(vc, animated: true)
  70. }
  71. }
  72. plusButton.rx.tap.subscribe(onNext: {[weak self] (_) in
  73. if UserModel.isTokenNil() { //是否登录
  74. kAppDelegate.setLogin()
  75. }else {
  76. if self?.communityCircleModel?.isJoin == 0 { //是否加入圈子
  77. SwiftProgressHUD.shared().showText("您还没有加入圈子哦,\n请您先加入圈子")
  78. }else if self?.communityCircleModel?.isJoin == 1 {
  79. if self?.communityCircleModel?.isBlack == 1 { //是否黑名单
  80. SwiftProgressHUD.shared().showText("您在本圈子内的权限受限")
  81. }else {
  82. let vc = CirclePublishMessageViewController()
  83. vc.circleId = self?.communityCircleModel?.id
  84. vc.maxImageCount = 3
  85. vc.reloadClosure = {
  86. [weak self] in
  87. self?.reloadCircleLeavingMessageView()
  88. }
  89. self?.navigationController?.pushViewController(vc, animated: true)
  90. }
  91. }
  92. }
  93. }).disposed(by: disposeBag)
  94. loadCircleData()
  95. }
  96. /// 加载圈子详情
  97. func loadCircleData() {
  98. SwiftMoyaNetWorkServiceCommunity.shared().communityCircleApi(id: circleId ?? 0, completion: {
  99. [weak self](communityCircleModel) -> (Void) in
  100. self?.communityCircleModel = communityCircleModel as? CommunityCircleModel
  101. if self?.communityCircleModel?.notice != nil && self?.communityCircleModel?.notice != "" {
  102. self?.JXTableHeaderViewHeight = (self?.JXTableHeaderViewHeight ?? 0) + 84
  103. }
  104. self?.setupViews()
  105. self?.setupLayouts()
  106. self?.reloadData()
  107. self?.navigationBar.backgroundImageView.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? "default_pic"), placeholder: kImage(name: "default_pic"))
  108. self?.avatarButton.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "default_avatar"))
  109. self?.nameButton.setTitle(self?.communityCircleModel?.name, for: UIControl.State.normal)
  110. self?.circleHeaderView.communityCircleModel = self?.communityCircleModel
  111. }) { (loadingStatus) in
  112. }
  113. }
  114. /// 设置navigationBar
  115. func setnavigationBar() {
  116. navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
  117. navigationBar.wr_setRightButton(image: kImage(name: "nav_share_white")!)
  118. navigationBar.addSubview(navigationBgView)
  119. navigationBar.addSubview(avatarButton)
  120. navigationBar.addSubview(nameButton)
  121. navigationBar.insertSubview(navigationBgView, aboveSubview: navigationBar.backgroundImageView)
  122. navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
  123. navigationBar.backgroundImageView.contentMode = .scaleAspectFill
  124. navigationBar.layer.masksToBounds = true
  125. // 设置导航栏显示图片
  126. navigationBar.barBackgroundImage = UIImage(named: "default_pic")
  127. // 设置初始导航栏透明度
  128. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  129. // 设置状态栏style
  130. statusBarStyle = .lightContent
  131. }
  132. /// 刷新页面
  133. func reloadData() {
  134. segmentedDataSource.titles = cmsTemplateTitles
  135. segmentedView.indicators = [indicator]
  136. self.segmentedDataSource.reloadData(selectedIndex: 0)
  137. self.segmentedView.defaultSelectedIndex = 0
  138. self.segmentedView.reloadData()
  139. self.pagingView.reloadData()
  140. }
  141. lazy var avatarButton: UIButton = {
  142. let avatarButton = UIButton(type: UIButton.ButtonType.custom)
  143. avatarButton.setImage(kImage(name: "default_avatar"), for: UIControl.State.normal)
  144. avatarButton.cornerRadius = 10
  145. avatarButton.masksToBounds = true
  146. avatarButton.alpha = 0
  147. return avatarButton
  148. }()
  149. lazy var nameButton: UIButton = {
  150. let nameButton = UIButton(type: UIButton.ButtonType.custom)
  151. nameButton.setTitle("昵称", for: UIControl.State.normal)
  152. nameButton.setTitleColor(kffffffColor, for: UIControl.State.normal)
  153. nameButton.titleLabel?.font = kBoldFont18
  154. nameButton.alpha = 0
  155. return nameButton
  156. }()
  157. lazy var navigationBgView: UIView = {
  158. let navigationBgView = UIView()
  159. navigationBgView.backgroundColor = UIColor(hexString: "000000", alpha: 0.5)
  160. navigationBgView.alpha = 0
  161. return navigationBgView
  162. }()
  163. lazy var plusButton: UIButton = {
  164. let plusButton = UIButton()
  165. plusButton.setImage(kImage(name: "question_btn_add"), for: UIControl.State.normal)
  166. return plusButton
  167. }()
  168. func reloadCircleLeavingMessageView() {
  169. self.circleLeavingMessageView?.isRefresh = true
  170. self.segmentedView.selectItemAt(index: 1)
  171. self.segmentedView.reloadData()
  172. }
  173. //1.初始化JXSegmentedView
  174. lazy var segmentedView: JXSegmentedView = {
  175. let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(JXHeightForHeaderInSection)))
  176. segmentedView.delegate = self
  177. segmentedView.dataSource = segmentedDataSource
  178. segmentedView.contentScrollView = pagingView.listContainerView.collectionView
  179. segmentedView.contentEdgeInsetLeft = 14
  180. segmentedView.contentEdgeInsetRight = 14
  181. return segmentedView
  182. }()
  183. //2.初始化dataSource
  184. lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  185. let segmentedDataSource = JXSegmentedTitleDataSource()
  186. segmentedDataSource.isTitleColorGradientEnabled = true
  187. segmentedDataSource.isItemSpacingAverageEnabled = false
  188. segmentedDataSource.isTitleZoomEnabled = true
  189. segmentedDataSource.titleNormalColor = k999999Color
  190. segmentedDataSource.titleSelectedColor = k333333Color
  191. segmentedDataSource.titleNormalFont = kMediumFont18!
  192. segmentedDataSource.titleSelectedFont = kMediumFont18
  193. segmentedDataSource.titleSelectedZoomScale = 1.0
  194. segmentedDataSource.itemSpacing = 30
  195. //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
  196. segmentedDataSource.reloadData(selectedIndex: 0)
  197. return segmentedDataSource
  198. }()
  199. //3.初始化指示器indicator
  200. lazy var indicator: JXSegmentedIndicatorLineView = {
  201. let indicator = JXSegmentedIndicatorLineView()
  202. indicator.indicatorColor = kThemeColor
  203. indicator.indicatorHeight = 3
  204. indicator.indicatorWidth = 14
  205. indicator.verticalOffset = 5
  206. return indicator
  207. }()
  208. //4.pagingView
  209. lazy var pagingView: JXPagingListRefreshView = {
  210. let pagingView = JXPagingListRefreshView(delegate: self)
  211. pagingView.pinSectionHeaderVerticalOffset = Int(kNavBarTotalHeight)
  212. pagingView.frame = self.view.frame
  213. return pagingView
  214. }()
  215. // 5.头部headerView
  216. lazy var circleContainerView: UIView = {
  217. let circleContainerView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  218. return circleContainerView
  219. }()
  220. /// 6.包含头部
  221. lazy var circleHeaderView: CircleHeaderView = {
  222. var circleHeaderView = CircleHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  223. return circleHeaderView
  224. }()
  225. override func viewDidLayoutSubviews() {
  226. super.viewDidLayoutSubviews()
  227. pagingView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight)
  228. }
  229. }
  230. extension CircleViewController : JXSegmentedViewDelegate {
  231. //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
  232. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  233. // self.otherPersonalCenterVCType = index
  234. }
  235. // 点击选中的情况才会调用该方法
  236. func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
  237. }
  238. // 滚动选中的情况才会调用该方法
  239. func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
  240. }
  241. // 正在滚动中的回调
  242. func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
  243. }
  244. /// 是否允许点击选中目标index的item
  245. func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
  246. return true
  247. }
  248. }
  249. extension CircleViewController : JXPagingViewDelegate {
  250. func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
  251. return JXTableHeaderViewHeight
  252. }
  253. func tableHeaderView(in pagingView: JXPagingView) -> UIView {
  254. return circleContainerView
  255. }
  256. func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
  257. return JXHeightForHeaderInSection
  258. }
  259. func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView {
  260. return segmentedView
  261. }
  262. func numberOfLists(in pagingView: JXPagingView) -> Int {
  263. return cmsTemplateTitles.count
  264. }
  265. func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
  266. switch index {
  267. case 0:
  268. let view = CircleEssenceView()
  269. view.circleId = circleId
  270. return view
  271. default:
  272. let view = CircleLeavingMessageView()
  273. view.circleId = circleId
  274. view.communityCircleModel = communityCircleModel
  275. circleLeavingMessageView = view
  276. return view
  277. }
  278. }
  279. func mainTableViewDidScroll(_ scrollView: UIScrollView) {
  280. circleHeaderView.scrollViewDidScroll(contentOffsetY: scrollView.contentOffset.y)
  281. let offsetY = scrollView.contentOffset.y
  282. if (offsetY > kSafeStatusBarHeight) {
  283. let alpha = (offsetY - kSafeStatusBarHeight) / CGFloat(kNavBarTotalHeight)
  284. navigationBar.wr_setBackgroundAlpha(alpha: alpha)
  285. avatarButton.alpha = alpha
  286. nameButton.alpha = alpha
  287. navigationBgView.alpha = alpha
  288. circleHeaderView.bgView.alpha = 1 - alpha
  289. circleHeaderView.bgImageView.alpha = 1 - alpha
  290. } else {
  291. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  292. avatarButton.alpha = 0
  293. nameButton.alpha = 0
  294. navigationBgView.alpha = 0
  295. circleHeaderView.bgView.alpha = 1
  296. circleHeaderView.bgImageView.alpha = 1
  297. }
  298. }
  299. }