UserPersonalCenterViewController.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. //
  2. // UserPersonalCenterViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/6/17.
  6. // Copyright © 2019 RainbowPlanet. All rights reserved.
  7. //
  8. import UIKit
  9. import JXSegmentedView
  10. import RxSwift
  11. import SwiftyMediator
  12. import ESTabBarController_swift
  13. import Kingfisher
  14. class UserPersonalCenterViewController: BaseViewController {
  15. deinit {
  16. NXLLog("deinit")
  17. if observe != nil {
  18. NotificationCenter.default.removeObserver(observe!)
  19. }
  20. }
  21. override func didReceiveMemoryWarning() {
  22. super.didReceiveMemoryWarning()
  23. }
  24. weak var observe : NSObjectProtocol?
  25. let JXTableHeaderViewHeight: Int = Int(140 + kNavBarTotalHeight + 109)
  26. let JXheightForHeaderInSection: Int = 44
  27. var cmsTemplateTitles = ["发布 0", "收藏 0", "分享 0"]
  28. var userPersonalCenterVCType : Int = 0
  29. var jumpModeType : JumpModeType? = JumpModeType.none
  30. var userDetailModel : UserDetailModel?
  31. override func viewDidLoad() {
  32. super.viewDidLoad()
  33. setupViews()
  34. setupLayouts()
  35. setupData()
  36. }
  37. override func setupViews() {
  38. userHeaderContainerView.addSubview(userHeaderView)
  39. view.addSubview(segmentedView)
  40. view.addSubview(pagingView)
  41. view.insertSubview(navigationBar, aboveSubview: pagingView)
  42. setnavigationBar()
  43. view.addSubview(iconImageView)
  44. }
  45. /// 设置navigationBar
  46. func setnavigationBar() {
  47. navigationBar.addSubview(navigationBgView)
  48. navigationBar.addSubview(avatarButton)
  49. navigationBar.addSubview(nameButton)
  50. navigationBar.addSubview(setButton)
  51. navigationBar.insertSubview(navigationBgView, aboveSubview: navigationBar.backgroundImageView)
  52. navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
  53. navigationBar.backgroundImageView.contentMode = .scaleAspectFill
  54. navigationBar.clipsToBounds = true
  55. if jumpModeType == JumpModeType.push {
  56. navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
  57. }
  58. navigationBar.wr_setRightButton(image: kImage(name: "center_share")!)
  59. // 设置导航栏显示图片
  60. navigationBar.barBackgroundImage = UIImage(named: "default_pic")
  61. // 设置初始导航栏透明度
  62. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  63. // 设置状态栏style
  64. statusBarStyle = .lightContent
  65. }
  66. override func setupLayouts() {
  67. navigationBgView.snp.makeConstraints { (make) in
  68. make.edges.equalToSuperview()
  69. }
  70. avatarButton.snp.makeConstraints { (make) in
  71. if jumpModeType == JumpModeType.none {
  72. make.left.equalTo(14)
  73. }else {
  74. make.left.equalTo(navigationBar.leftButton.snp_right)
  75. }
  76. make.size.equalTo(20)
  77. make.centerY.equalTo(navigationBar.rightButton)
  78. }
  79. nameButton.snp.makeConstraints { (make) in
  80. make.centerY.equalTo(avatarButton)
  81. make.left.equalTo(avatarButton.snp_right).offset(4)
  82. }
  83. setButton.snp_makeConstraints { (make) in
  84. make.centerY.equalTo(navigationBar.rightButton)
  85. make.right.equalTo(navigationBar.rightButton.snp_left)
  86. make.size.equalTo(34)
  87. }
  88. iconImageView.snp.makeConstraints { (make) in
  89. make.bottom.equalToSuperview()
  90. make.centerX.equalToSuperview()
  91. }
  92. }
  93. override func setupData() {
  94. navigationBar.onClickRightButton = {
  95. ShareCommunityView.inviteGoodFriends()
  96. }
  97. //设置
  98. setButton.rx.tap.subscribe(onNext: {
  99. [weak self] (data) in
  100. let vc = SetViewController()
  101. self?.navigationController?.pushViewController(vc, animated: true)
  102. }).disposed(by: disposeBag)
  103. pagingView.mainTableView.addHeader(withBeginRefresh: true, animation: false, refreshBlock: { [weak self] (page) in
  104. self?.userMemberDetailApi()
  105. })
  106. // 更新用户信息
  107. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("UserMemberDetail"), object: nil, queue: OperationQueue.main) {
  108. [weak self] (notification) in
  109. self?.userMemberDetailApi()
  110. }
  111. setBadge()
  112. //将要进入前台的时候
  113. observe = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main, using: {
  114. [weak self] (notification) in
  115. self?.setBadge()
  116. })
  117. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("MineModuleTop"), object: nil, queue: OperationQueue.main, using: {
  118. [weak self] (notification) in
  119. if self?.pagingView.mainTableView.contentOffset == CGPoint(x: 0, y: 0) {
  120. self?.userMemberDetailApi()
  121. }else {
  122. self?.pagingView.mainTableView.scrollToTop()
  123. }
  124. })
  125. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("communityDeletePostApi"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
  126. self?.userDetailModel?.postCount = "\((Int(self?.userDetailModel?.postCount ?? "0") ?? 1) - 1)"
  127. self?.cmsTemplateTitles = ["发布 \(self?.userDetailModel?.postCount ?? "0")","收藏 \(self?.userDetailModel?.collectCount ?? "0")","分享 \(self?.userDetailModel?.shareCount ?? "0")"]
  128. self?.reloadData()
  129. }
  130. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("userMemberGetTotalBean"), object: nil, queue: OperationQueue.main, using: {
  131. [weak self] (notification) in
  132. // self?.userMemberDetailApi()
  133. self?.userMemberDetailOnlyApi()
  134. })
  135. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("PublishPostSuccess"), object: nil, queue: OperationQueue.main, using: {
  136. [weak self] (notification) in
  137. self?.userMemberDetailApi()
  138. })
  139. }
  140. // 设置Badge
  141. func setBadge() {
  142. if UpdateVersionModel.shared.object()?.upGradeModelType == .update || UpdateVersionModel.shared.object()?.upGradeModelType == .strongUpdate {
  143. self.setButton.pp.moveBadge(x: -8, y: 8)
  144. self.setButton.pp.addDot(color: kFE352BColor)
  145. }else {
  146. self.setButton.pp.hiddenBadge()
  147. }
  148. }
  149. /// 刷新页面
  150. func reloadData() {
  151. segmentedDataSource.titles = cmsTemplateTitles
  152. segmentedView.indicators = [indicator]
  153. self.segmentedDataSource.reloadData(selectedIndex: userPersonalCenterVCType)
  154. self.segmentedView.defaultSelectedIndex = userPersonalCenterVCType
  155. self.segmentedView.reloadData()
  156. self.pagingView.reloadData()
  157. if userPersonalCenterVCType == 0 && self.userDetailModel?.postCount == "0" {
  158. iconImageViewAlpha(alpha: 1)
  159. }else {
  160. iconImageViewAlpha(alpha: 0)
  161. }
  162. }
  163. /// 编辑
  164. func pushModifyData() {
  165. let vc = ModifyDataViewController()
  166. vc.userDetailModel = self.userDetailModel
  167. self.navigationController?.pushViewController(vc, animated: true)
  168. }
  169. lazy var avatarButton: UIButton = {
  170. let avatarButton = UIButton(type: UIButton.ButtonType.custom)
  171. avatarButton.setImage(kImage(name: "default_avatar"), for: UIControl.State.normal)
  172. avatarButton.alpha = 0
  173. avatarButton.cornerRadius = 10
  174. avatarButton.masksToBounds = true
  175. avatarButton.rx.tap.subscribe(onNext: {[weak self] (data) in
  176. self?.pushModifyData()
  177. }).disposed(by: disposeBag)
  178. return avatarButton
  179. }()
  180. lazy var nameButton: UIButton = {
  181. let nameButton = UIButton(type: UIButton.ButtonType.custom)
  182. nameButton.setTitle("昵称", for: UIControl.State.normal)
  183. nameButton.setTitleColor(kffffffColor, for: UIControl.State.normal)
  184. nameButton.titleLabel?.font = kBoldFont18
  185. nameButton.alpha = 0
  186. nameButton.rx.tap.subscribe(onNext: {[weak self] (data) in
  187. self?.pushModifyData()
  188. }).disposed(by: disposeBag)
  189. return nameButton
  190. }()
  191. lazy var setButton: UIButton = {
  192. let setButton = UIButton(type: UIButton.ButtonType.custom)
  193. setButton.setImage(kImage(name: "nav_precenter_set"), for: UIControl.State.normal)
  194. return setButton
  195. }()
  196. private lazy var navigationBgView: UIView = {
  197. let navigationBgView = UIView()
  198. navigationBgView.backgroundColor = UIColor(hexString: "000000", alpha: 0.5)
  199. navigationBgView.alpha = 0
  200. return navigationBgView
  201. }()
  202. lazy var iconImageView: UIImageView = {
  203. let iconImageView = UIImageView()
  204. iconImageView.image = kImage(name: "def_page_pic_pecenter")
  205. iconImageView.alpha = 0
  206. return iconImageView
  207. }()
  208. func iconImageViewAlpha(alpha:CGFloat) {
  209. UIView.animate(withDuration: 1) {
  210. [weak self] in
  211. self?.iconImageView.alpha = alpha
  212. }
  213. }
  214. //1.初始化JXSegmentedView
  215. lazy var segmentedView: JXSegmentedView = {
  216. let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(JXheightForHeaderInSection)))
  217. segmentedView.delegate = self
  218. segmentedView.dataSource = segmentedDataSource
  219. segmentedView.contentScrollView = pagingView.listContainerView.collectionView
  220. return segmentedView
  221. }()
  222. //2.初始化dataSource
  223. lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  224. let segmentedDataSource = JXSegmentedTitleDataSource()
  225. segmentedDataSource.isTitleColorGradientEnabled = true
  226. segmentedDataSource.isItemSpacingAverageEnabled = true
  227. segmentedDataSource.isTitleZoomEnabled = true
  228. segmentedDataSource.titleNormalColor = k999999Color
  229. segmentedDataSource.titleSelectedColor = k333333Color
  230. segmentedDataSource.titleNormalFont = kRegularFont14!
  231. segmentedDataSource.titleSelectedFont = kBoldFont16
  232. //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
  233. segmentedDataSource.reloadData(selectedIndex: 0)
  234. return segmentedDataSource
  235. }()
  236. //3.初始化指示器indicator
  237. lazy var indicator: JXSegmentedIndicatorLineView = {
  238. let indicator = JXSegmentedIndicatorLineView()
  239. indicator.indicatorColor = k333333Color
  240. indicator.indicatorHeight = 4
  241. indicator.indicatorWidth = 22
  242. return indicator
  243. }()
  244. //4.pagingView
  245. lazy var pagingView: JXPagingView = {
  246. let pagingView = JXPagingView(delegate: self)
  247. return pagingView
  248. }()
  249. // 5.头部headerView
  250. lazy var userHeaderContainerView: UIView = {
  251. let userHeaderContainerView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  252. return userHeaderContainerView
  253. }()
  254. /// 6.包含头部
  255. lazy var userHeaderView: UserPersonalCenterHeaderView = {
  256. var userHeaderView = UserPersonalCenterHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: CGFloat(JXTableHeaderViewHeight)))
  257. return userHeaderView
  258. }()
  259. override func viewDidLayoutSubviews() {
  260. super.viewDidLayoutSubviews()
  261. pagingView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight - kTabBarTotalHeight)
  262. }
  263. }
  264. extension UserPersonalCenterViewController {
  265. /// 获取用户详情
  266. func userMemberDetailApi() {
  267. let userModel = UserModel.shared().getModel()
  268. SwiftMoyaNetWorkServiceUser.shared().userMemberDetailApi(uid: userModel?.uid ?? 0) {
  269. [weak self] (userDetailModel) -> (Void) in
  270. self?.userDetailModel = userDetailModel as? UserDetailModel
  271. self?.userHeaderView.userDetailModel = self?.userDetailModel
  272. self?.navigationBar.backgroundImageView.kf.setImage(with: kURLThumbnailsImage(name: self?.userDetailModel?.backgroundImg ?? "default_pic", size: (self?.navigationBar.backgroundImageView.size)!), placeholder: kImage(name: "default_pic"))
  273. self?.avatarButton.kf.setImage(with: kURLThumbnailsImage(name: self?.userDetailModel?.avatar ?? "", size: kSize60x60Image), for: UIControl.State.normal, placeholder: kImage(name: "default_avatar"))
  274. KingfisherManager.shared.cache.clearMemoryCache()
  275. self?.nameButton.setTitle(self?.userDetailModel?.username, for: UIControl.State.normal)
  276. self?.cmsTemplateTitles = ["发布 \(self?.userDetailModel?.postCount ?? "0")","收藏 \(self?.userDetailModel?.collectCount ?? "0")","分享 \(self?.userDetailModel?.shareCount ?? "0")"]
  277. self?.reloadData()
  278. }
  279. }
  280. func userMemberDetailOnlyApi() {
  281. let userModel = UserModel.shared().getModel()
  282. SwiftMoyaNetWorkServiceUser.shared().userMemberDetailApi(uid: userModel?.uid ?? 0) {
  283. [weak self] (userDetailModel) -> (Void) in
  284. self?.userDetailModel = userDetailModel as? UserDetailModel
  285. self?.userHeaderView.userDetailModel = self?.userDetailModel
  286. self?.navigationBar.backgroundImageView.kf.setImage(with: kURLThumbnailsImage(name: self?.userDetailModel?.backgroundImg ?? "default_pic", size: (self?.navigationBar.backgroundImageView.size)!), placeholder: kImage(name: "default_pic"))
  287. self?.avatarButton.kf.setImage(with: kURLThumbnailsImage(name: self?.userDetailModel?.avatar ?? "", size: kSize60x60Image), for: UIControl.State.normal, placeholder: kImage(name: "default_avatar"))
  288. KingfisherManager.shared.cache.clearMemoryCache()
  289. }
  290. }
  291. }
  292. extension UserPersonalCenterViewController : JXSegmentedViewDelegate {
  293. //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
  294. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  295. self.userPersonalCenterVCType = index
  296. if index == 0 && self.userDetailModel?.postCount == "0" {
  297. iconImageViewAlpha(alpha: 1)
  298. }else {
  299. iconImageViewAlpha(alpha: 0)
  300. }
  301. }
  302. // 点击选中的情况才会调用该方法
  303. func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
  304. }
  305. // 滚动选中的情况才会调用该方法
  306. func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
  307. }
  308. // 正在滚动中的回调
  309. func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
  310. }
  311. /// 是否允许点击选中目标index的item
  312. func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
  313. return true
  314. }
  315. }
  316. extension UserPersonalCenterViewController: JXPagingViewDelegate {
  317. func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
  318. return JXTableHeaderViewHeight
  319. }
  320. func tableHeaderView(in pagingView: JXPagingView) -> UIView {
  321. return userHeaderContainerView
  322. }
  323. func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
  324. return JXheightForHeaderInSection
  325. }
  326. func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView {
  327. pagingView.pinSectionHeaderVerticalOffset = kNavBarTotalHeight
  328. return segmentedView
  329. }
  330. func numberOfLists(in pagingView: JXPagingView) -> Int {
  331. return cmsTemplateTitles.count
  332. }
  333. func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
  334. let list = PersonViewUserAndOtherListView()
  335. list.jumpModeType = jumpModeType
  336. let uid = UserModel.shared().getModel()?.uid
  337. list.uid = uid
  338. list.personalCenterVCType = index
  339. userPersonalCenterVCType = index
  340. return list
  341. }
  342. func mainTableViewDidScroll(_ scrollView: UIScrollView) {
  343. userHeaderView.personViewUserAndOtherHeaderView.scrollViewDidScroll(contentOffsetY: scrollView.contentOffset.y)
  344. let offsetY = scrollView.contentOffset.y
  345. if (offsetY > kSafeStatusBarHeight) {
  346. let alpha = (offsetY - kSafeStatusBarHeight) / CGFloat(kNavBarTotalHeight)
  347. navigationBar.wr_setBackgroundAlpha(alpha: alpha)
  348. avatarButton.alpha = alpha
  349. nameButton.alpha = alpha
  350. navigationBgView.alpha = alpha
  351. } else {
  352. navigationBar.wr_setBackgroundAlpha(alpha: 0)
  353. avatarButton.alpha = 0
  354. nameButton.alpha = 0
  355. navigationBgView.alpha = 0
  356. }
  357. }
  358. }