CircleViewController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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. override func viewDidLoad() {
  29. super.viewDidLoad()
  30. setupData()
  31. }
  32. override func setupViews() {
  33. circleContainerView.addSubview(circleHeaderView)
  34. view.addSubview(segmentedView)
  35. view.addSubview(pagingView)
  36. view.insertSubview(navigationBar, aboveSubview: pagingView)
  37. setnavigationBar()
  38. }
  39. override func setupLayouts() {
  40. navigationBgView.snp.makeConstraints { (make) in
  41. make.edges.equalToSuperview()
  42. }
  43. avatarButton.snp.makeConstraints { (make) in
  44. make.left.equalTo(navigationBar.leftButton.snp.right)
  45. make.size.equalTo(20)
  46. make.centerY.equalTo(navigationBar.rightButton)
  47. }
  48. nameButton.snp.makeConstraints { (make) in
  49. make.centerY.equalTo(avatarButton)
  50. make.left.equalTo(avatarButton.snp.right).offset(4)
  51. }
  52. }
  53. override func setupData() {
  54. navigationBar.onClickRightButton = {
  55. [weak self] in
  56. let vc = CircleShareContentViewController()
  57. vc.imgUrl = self?.communityCircleModel?.image
  58. vc.circleNameStr = self?.communityCircleModel?.name ?? ""
  59. self?.navigationController?.pushViewController(vc, animated: true)
  60. }
  61. loadCircleData()
  62. }
  63. /// 加载圈子详情
  64. func loadCircleData() {
  65. SwiftMoyaNetWorkServiceCommunity.shared().communityCircleApi(id: circleId ?? 0, completion: {
  66. [weak self](communityCircleModel) -> (Void) in
  67. self?.communityCircleModel = communityCircleModel as? CommunityCircleModel
  68. if self?.communityCircleModel?.notice != nil && self?.communityCircleModel?.notice != "" {
  69. self?.JXTableHeaderViewHeight = (self?.JXTableHeaderViewHeight ?? 0) + 84
  70. }
  71. self?.setupViews()
  72. self?.setupLayouts()
  73. self?.reloadData()
  74. self?.navigationBar.backgroundImageView.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? "default_pic"), placeholder: kImage(name: "default_pic"))
  75. self?.avatarButton.kf.setImage(with: kURLImage(name: self?.communityCircleModel?.image ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "default_avatar"))
  76. self?.nameButton.setTitle(self?.communityCircleModel?.name, for: UIControl.State.normal)
  77. self?.circleHeaderView.communityCircleModel = self?.communityCircleModel
  78. }) { (loadingStatus) in
  79. }
  80. }
  81. /// 设置navigationBar
  82. func setnavigationBar() {
  83. navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
  84. navigationBar.wr_setRightButton(image: kImage(name: "nav_share_white")!)
  85. navigationBar.addSubview(navigationBgView)
  86. navigationBar.addSubview(avatarButton)
  87. navigationBar.addSubview(nameButton)
  88. navigationBar.insertSubview(navigationBgView, aboveSubview: navigationBar.backgroundImageView)
  89. navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
  90. navigationBar.backgroundImageView.contentMode = .scaleAspectFill
  91. navigationBar.layer.masksToBounds = true
  92. // 设置导航栏显示图片
  93. navigationBar.barBackgroundImage = UIImage(named: "default_pic")
  94. // 设置初始导航栏透明度
  95. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  96. // 设置状态栏style
  97. statusBarStyle = .lightContent
  98. }
  99. /// 刷新页面
  100. func reloadData() {
  101. segmentedDataSource.titles = cmsTemplateTitles
  102. segmentedView.indicators = [indicator]
  103. self.segmentedDataSource.reloadData(selectedIndex: 0)
  104. self.segmentedView.defaultSelectedIndex = 0
  105. self.segmentedView.reloadData()
  106. self.pagingView.reloadData()
  107. }
  108. lazy var avatarButton: UIButton = {
  109. let avatarButton = UIButton(type: UIButton.ButtonType.custom)
  110. avatarButton.setImage(kImage(name: "default_avatar"), for: UIControl.State.normal)
  111. avatarButton.cornerRadius = 10
  112. avatarButton.masksToBounds = true
  113. avatarButton.alpha = 0
  114. return avatarButton
  115. }()
  116. lazy var nameButton: UIButton = {
  117. let nameButton = UIButton(type: UIButton.ButtonType.custom)
  118. nameButton.setTitle("昵称", for: UIControl.State.normal)
  119. nameButton.setTitleColor(kffffffColor, for: UIControl.State.normal)
  120. nameButton.titleLabel?.font = kBoldFont18
  121. nameButton.alpha = 0
  122. return nameButton
  123. }()
  124. lazy var navigationBgView: UIView = {
  125. let navigationBgView = UIView()
  126. navigationBgView.backgroundColor = UIColor(hexString: "000000", alpha: 0.5)
  127. navigationBgView.alpha = 0
  128. return navigationBgView
  129. }()
  130. //1.初始化JXSegmentedView
  131. lazy var segmentedView: JXSegmentedView = {
  132. let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(JXHeightForHeaderInSection)))
  133. segmentedView.delegate = self
  134. segmentedView.dataSource = segmentedDataSource
  135. segmentedView.contentScrollView = pagingView.listContainerView.collectionView
  136. segmentedView.contentEdgeInsetLeft = 14
  137. segmentedView.contentEdgeInsetRight = 14
  138. return segmentedView
  139. }()
  140. //2.初始化dataSource
  141. lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  142. let segmentedDataSource = JXSegmentedTitleDataSource()
  143. segmentedDataSource.isTitleColorGradientEnabled = true
  144. segmentedDataSource.isItemSpacingAverageEnabled = false
  145. segmentedDataSource.isTitleZoomEnabled = true
  146. segmentedDataSource.titleNormalColor = k999999Color
  147. segmentedDataSource.titleSelectedColor = k333333Color
  148. segmentedDataSource.titleNormalFont = kMediumFont18!
  149. segmentedDataSource.titleSelectedFont = kMediumFont18
  150. segmentedDataSource.titleSelectedZoomScale = 1.0
  151. segmentedDataSource.itemSpacing = 30
  152. //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
  153. segmentedDataSource.reloadData(selectedIndex: 0)
  154. return segmentedDataSource
  155. }()
  156. //3.初始化指示器indicator
  157. lazy var indicator: JXSegmentedIndicatorLineView = {
  158. let indicator = JXSegmentedIndicatorLineView()
  159. indicator.indicatorColor = kThemeColor
  160. indicator.indicatorHeight = 3
  161. indicator.indicatorWidth = 14
  162. indicator.verticalOffset = 5
  163. return indicator
  164. }()
  165. //4.pagingView
  166. lazy var pagingView: JXPagingView = {
  167. let pagingView = JXPagingView(delegate: self)
  168. pagingView.frame = self.view.frame
  169. return pagingView
  170. }()
  171. // 5.头部headerView
  172. lazy var circleContainerView: UIView = {
  173. let circleContainerView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  174. return circleContainerView
  175. }()
  176. /// 6.包含头部
  177. lazy var circleHeaderView: CircleHeaderView = {
  178. var circleHeaderView = CircleHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  179. return circleHeaderView
  180. }()
  181. override func viewDidLayoutSubviews() {
  182. super.viewDidLayoutSubviews()
  183. pagingView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight)
  184. }
  185. }
  186. extension CircleViewController : JXSegmentedViewDelegate {
  187. //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
  188. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  189. // self.otherPersonalCenterVCType = index
  190. }
  191. // 点击选中的情况才会调用该方法
  192. func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
  193. }
  194. // 滚动选中的情况才会调用该方法
  195. func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
  196. }
  197. // 正在滚动中的回调
  198. func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
  199. }
  200. /// 是否允许点击选中目标index的item
  201. func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
  202. return true
  203. }
  204. }
  205. extension CircleViewController : JXPagingViewDelegate {
  206. func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
  207. return JXTableHeaderViewHeight
  208. }
  209. func tableHeaderView(in pagingView: JXPagingView) -> UIView {
  210. return circleContainerView
  211. }
  212. func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
  213. return JXHeightForHeaderInSection
  214. }
  215. func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView {
  216. pagingView.pinSectionHeaderVerticalOffset = Int(kNavBarTotalHeight)
  217. return segmentedView
  218. }
  219. func numberOfLists(in pagingView: JXPagingView) -> Int {
  220. return cmsTemplateTitles.count
  221. }
  222. func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
  223. switch index {
  224. case 0:
  225. let view = CircleEssenceView()
  226. view.circleId = circleId
  227. return view
  228. default:
  229. let view = CircleLeavingMessageView()
  230. view.circleId = circleId
  231. return view
  232. }
  233. }
  234. func mainTableViewDidScroll(_ scrollView: UIScrollView) {
  235. circleHeaderView.scrollViewDidScroll(contentOffsetY: scrollView.contentOffset.y)
  236. let offsetY = scrollView.contentOffset.y
  237. if (offsetY > kSafeStatusBarHeight) {
  238. let alpha = (offsetY - kSafeStatusBarHeight) / CGFloat(kNavBarTotalHeight)
  239. navigationBar.wr_setBackgroundAlpha(alpha: alpha)
  240. avatarButton.alpha = alpha
  241. nameButton.alpha = alpha
  242. navigationBgView.alpha = alpha
  243. circleHeaderView.bgView.alpha = 1 - alpha
  244. circleHeaderView.bgImageView.alpha = 1 - alpha
  245. } else {
  246. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  247. avatarButton.alpha = 0
  248. nameButton.alpha = 0
  249. navigationBgView.alpha = 0
  250. circleHeaderView.bgView.alpha = 1
  251. circleHeaderView.bgImageView.alpha = 1
  252. }
  253. }
  254. }