HJHomeViewController.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. //
  2. // HJHomeViewController.m
  3. // HappyJob
  4. //
  5. // Created by Bob on 2019/3/13.
  6. // Copyright © 2019 Bob. All rights reserved.
  7. //
  8. #import "HJHomeViewController.h"
  9. #import "HJNavBarView.h"
  10. #import "HJHomeHeaderView.h"
  11. #import "HJStartAgreementView.h"//协议view
  12. #import "HJSearchViewController.h"//搜索
  13. #import "HJCityPickerViewController.h"//定位
  14. #import "HJFullTimeViewController.h"//全职
  15. #import "HJPartTimeViewController.h"//兼职
  16. #import "HJRewardViewController.h"//入职奖励
  17. #import "HJFatSalaryViewController.h"//高薪急聘
  18. #import "HJBenefitViewController.h"//福利岗位
  19. #import "HJAgentViewController.h"//全民经纪人
  20. #import <AMapLocationKit/AMapLocationKit.h>
  21. #import "HJLoginUserAgreementViewController.h"
  22. #import "HJCityPickerCity.h"
  23. #import "HJUpdateViewController.h"//更新
  24. #import "HJWebViewController.h"
  25. #import "HJHomeDataBox.h"
  26. #import "HJPositionDataBox.h"
  27. #import "HJCheckVersionAPIManager.h"
  28. #import "HJGetHotPositionAPIManager.h"
  29. #import "HJGetDynamicBannerAPIManager.h"
  30. @interface HJHomeViewController ()
  31. <
  32. UITableViewDelegate,
  33. HJNavBarViewDelegate,
  34. HJJobSortViewDelegate,
  35. HJBannerScrollViewDelegate,
  36. FBAPIManagerDelegate,
  37. FBAPIManagerInterceptor,
  38. HJPageListViewDelegate
  39. >
  40. @property (nonatomic, strong) HJNavBarView *navBarView;//导航栏
  41. @property (nonatomic, strong) HJPageListView *pageListView;//tableview
  42. @property (nonatomic, strong) HJHomeHeaderView *headerView;//(轮播,六个模块)头部视图
  43. @property (nonatomic, strong) HJGetHotPositionAPIManager *getHotPositionAPIManager;
  44. @property (nonatomic, strong) HJGetDynamicBannerAPIManager *getBannerAPIManager;
  45. @property (nonatomic, strong) HJPositionDataBox *positionDataBox;
  46. @property (nonatomic, strong) HJHomeDataBox *homeDataBox;
  47. @property (nonatomic, strong) AMapLocationManager *locationManager;//高德定位
  48. @property (nonatomic, strong) HJCheckVersionAPIManager *checkAPIManager;//版本更新
  49. @property (nonatomic, strong) UIButton *customerServiceBtn;//客服按钮,
  50. @end
  51. @implementation HJHomeViewController
  52. #pragma mark - life cycle
  53. - (void)dealloc {
  54. [[NSNotificationCenter defaultCenter] removeObserver:self name:HJCityPickerCitySelectedNotification object:nil];
  55. }
  56. - (void)viewWillAppear:(BOOL)animated {
  57. [super viewWillAppear:animated];
  58. [self.navigationController setNavigationBarHidden:YES animated:animated];
  59. }
  60. - (void)viewDidLoad {
  61. NSLog(@"ceshi");
  62. [super viewDidLoad];
  63. NAVI_BACK_TITLE;
  64. [self hj_setupNavBar];
  65. [self makeConstraints];
  66. //检查更新,
  67. self.checkAPIManager.version = APP_VERSION;
  68. [self.checkAPIManager start];
  69. // 调用banner图片URL,
  70. [self.getBannerAPIManager start];
  71. //定位,
  72. [self positioningCity];
  73. //添加城市选择通知,
  74. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cityPickerViewSelectCity:) name:HJCityPickerCitySelectedNotification object:nil];
  75. //协议政策,
  76. if (![[HJAppUserType sharedInstance].firstStart boolValue])
  77. {
  78. [self showAgreement];
  79. }
  80. }
  81. - (void)makeConstraints {
  82. // 添加列表视图
  83. [self.view addSubview:self.navBarView];
  84. [self.view insertSubview:self.pageListView belowSubview:self.navBarView];
  85. [self.view addSubview:self.customerServiceBtn];
  86. [self.navBarView mas_makeConstraints:^(MASConstraintMaker *make) {
  87. make.left.right.equalTo(self.view);
  88. make.top.equalTo(self.view.mas_top).offset(0);
  89. make.height.mas_equalTo(STATUS_BAR_H + 44);
  90. }];
  91. [self.pageListView mas_makeConstraints:^(MASConstraintMaker *make) {
  92. make.top.equalTo(self.navBarView.mas_bottom).offset(0);
  93. make.left.right.bottom.equalTo(self.view).offset(0);
  94. }];
  95. [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
  96. // 注意要加top
  97. make.top.width.equalTo(self.pageListView.tableView);
  98. }];
  99. [self.customerServiceBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  100. make.right.equalTo(self.view.mas_right).offset(-10);
  101. make.bottom.equalTo(self.view.mas_bottom).offset(-15);
  102. }];
  103. }
  104. /* 设置状态栏为白色 */
  105. - (UIStatusBarStyle)preferredStatusBarStyle{
  106. return UIStatusBarStyleLightContent;//白色
  107. }
  108. /* 第一次启动显示协议 */
  109. - (void)showAgreement {
  110. HJStartAgreementView *agreementView = [[HJStartAgreementView alloc] init];
  111. [self.view addSubview:agreementView];
  112. agreementView.readAgreementBlock = ^(NSInteger flag) {
  113. HJLoginUserAgreementViewController *userAgreementViewController = [[HJLoginUserAgreementViewController alloc]init];
  114. userAgreementViewController.type = flag;
  115. userAgreementViewController.hidesBottomBarWhenPushed = YES;
  116. [self.navigationController pushViewController:userAgreementViewController animated:YES];
  117. };
  118. }
  119. /* 定位 */
  120. - (void)positioningCity {
  121. HJCityPickerCity *locCity = [HJCityPickerCity locationCity];
  122. if (locCity == nil)
  123. {
  124. [self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
  125. if (error == nil && regeocode)
  126. {
  127. HJCityPickerCity *city = [HJCityPickerCity modelFromAdcode:regeocode.adcode];
  128. [HJCityPickerCity setLocationCity:city];
  129. }
  130. else
  131. {
  132. self.navBarView.city = @"全国";
  133. // 调用热门岗位API
  134. [self.getHotPositionAPIManager start];
  135. }
  136. }];
  137. }
  138. else
  139. {
  140. self.navBarView.city = locCity.name;
  141. self.getHotPositionAPIManager.cityCode = locCity.adcode;
  142. // 调用热门岗位API
  143. [self.getHotPositionAPIManager start];
  144. }
  145. }
  146. #pragma mark - UITableViewDelegate
  147. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  148. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  149. UIViewController *vc = [self.positionDataBox positionDetailViewControllerAtIndexPath:indexPath];
  150. vc.hidesBottomBarWhenPushed = YES;
  151. [self.navigationController pushViewController:vc animated:YES];
  152. }
  153. #pragma mark - HJNavBarViewDelegate
  154. /* 城市选择 */
  155. - (void)navBarViewCityButtonClicked:(HJNavBarView *)navBarView {
  156. HJCityPickerViewController *cityViewController = [[HJCityPickerViewController alloc] init];
  157. cityViewController.modalPresentationStyle = UIModalPresentationFullScreen;
  158. [self presentViewController:cityViewController animated:YES completion:nil];
  159. }
  160. /* 搜索 */
  161. - (void)navBarViewSearchButtonClicked:(HJNavBarView *)navBarView {
  162. // 先用导航控制器包一层,不然在搜索页面push视图的时候会失效
  163. HJSearchViewController *searchViewController = [[HJSearchViewController alloc] init];
  164. UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:searchViewController];
  165. nav.modalPresentationStyle = UIModalPresentationFullScreen;
  166. [self presentViewController:nav animated:YES completion:nil];
  167. }
  168. #pragma mark - HJJobSortViewDelegate
  169. /* 全职 */
  170. - (void)jobSortViewFullTimeButtonClicked:(HJJobSortView *)jobSortView {
  171. HJFullTimeViewController *vc = [[HJFullTimeViewController alloc] init];
  172. vc.hidesBottomBarWhenPushed = YES;
  173. [self.navigationController pushViewController:vc animated:YES];
  174. }
  175. /* 兼职 */
  176. - (void)jobSortViewPartTimeButtonClicked:(HJJobSortView *)jobSortView {
  177. HJPartTimeViewController *vc = [[HJPartTimeViewController alloc] init];
  178. vc.hidesBottomBarWhenPushed = YES;
  179. [self.navigationController pushViewController:vc animated:YES];
  180. }
  181. /* 入职奖励 */
  182. - (void)jobSortViewRewardButtonClicked:(HJJobSortView *)jobSortView {
  183. HJRewardViewController *vc = [[HJRewardViewController alloc] init];
  184. vc.hidesBottomBarWhenPushed = YES;
  185. [self.navigationController pushViewController:vc animated:YES];
  186. }
  187. /* 高薪急聘 */
  188. - (void)jobSortViewFatSalaryButtonClicked:(HJJobSortView *)jobSortView {
  189. HJFatSalaryViewController *vc = [[HJFatSalaryViewController alloc] init];
  190. vc.hidesBottomBarWhenPushed = YES;
  191. [self.navigationController pushViewController:vc animated:YES];
  192. }
  193. /* 福利岗位 */
  194. - (void)jobSortViewBenefitButtonClicked:(HJJobSortView *)jobSortView {
  195. HJBenefitViewController *vc = [[HJBenefitViewController alloc] init];
  196. vc.hidesBottomBarWhenPushed = YES;
  197. [self.navigationController pushViewController:vc animated:YES];
  198. }
  199. /* 全民经纪人 */
  200. - (void)jobSortViewAgentButtonClicked:(HJJobSortView *)jobSortView {
  201. HJAgentViewController *vc = [[HJAgentViewController alloc] init];
  202. vc.hidesBottomBarWhenPushed = YES;
  203. [self.navigationController pushViewController:vc animated:YES];
  204. }
  205. /* 客服 */
  206. - (void)customerServiceClick:(UIButton *)btn {
  207. HJWebViewController *webView = [[HJWebViewController alloc] init];
  208. webView.titleStr = @"客服";
  209. webView.webUrl = kCustomerServiceURL;
  210. webView.hidesBottomBarWhenPushed = YES;
  211. [self.navigationController pushViewController:webView animated:YES];
  212. }
  213. /* 平移手势 */
  214. - (void)pan:(UIPanGestureRecognizer *)pan{
  215. UIButton * imageV = (UIButton *)pan.view ;
  216. CGPoint point = [pan translationInView:imageV] ;
  217. pan.view.transform = CGAffineTransformTranslate(pan.view.transform, point.x, point.y);
  218. [pan setTranslation:CGPointZero inView:pan.view];
  219. }
  220. #pragma mark - HJBannerScrollViewDelegate
  221. - (void)bannerScrollView:(HJBannerScrollView *)banner gotoPositionDetailWithID:(NSUInteger)pId type:(NSUInteger)pType {
  222. UIViewController *detailVC = [self.positionDataBox positionDetailViewControllerWithPositionID:pId positionType:pType];
  223. detailVC.hidesBottomBarWhenPushed = YES;
  224. [self.navigationController pushViewController:detailVC animated:YES];
  225. }
  226. - (void)bannerScrollView:(HJBannerScrollView *)banner gotoDetailWithURLString:(NSString *)URLString linkFlag:(NSInteger)linkFlag title:(nonnull NSString *)title {
  227. if (linkFlag == 1)
  228. {//外链
  229. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:URLString]];
  230. }
  231. if (linkFlag == 0)
  232. {//内链
  233. HJWebViewController *webView = [[HJWebViewController alloc]init];
  234. webView.hidesBottomBarWhenPushed = YES;
  235. webView.titleStr = title;
  236. webView.webUrl = URLString;
  237. [self.navigationController pushViewController:webView animated:YES];
  238. }
  239. }
  240. #pragma mark - FBAPIManagerInterceptor
  241. - (BOOL)manager:(FBBaseAPIManager *)manager shouldStartCallAPIWithParams:(NSDictionary *)params {
  242. if (manager == self.getHotPositionAPIManager)
  243. {
  244. return [self.pageListView manager:manager shouldStartCallAPIWithParams:params];
  245. }
  246. return YES;
  247. }
  248. - (void)managerShouldFinishCallAPI:(FBBaseAPIManager *)manager {
  249. if (manager == self.getHotPositionAPIManager)
  250. {
  251. [self.pageListView managerShouldFinishCallAPI:manager];
  252. }
  253. }
  254. #pragma mark - FBAPIManagerDelegate
  255. - (void)managerCallAPIDidSuccess:(FBBaseAPIManager *)manager {
  256. if (manager == self.getHotPositionAPIManager)
  257. {
  258. // if (self.pageListView.isFirstLoading)
  259. // {
  260. // [self.navBarView shadeBackgroundColorWithAlpha:0];
  261. // }
  262. [self.pageListView managerCallAPIDidSuccess:manager];
  263. }
  264. if (manager == self.getBannerAPIManager)
  265. {//轮播
  266. id fetchData = [manager fetchDataWithBox:self.homeDataBox];
  267. id bannerList = [fetchData valueForKeyPath:@"data.bannerList"];
  268. if ([bannerList isKindOfClass:[NSArray class]] && [bannerList count] > 0)
  269. {
  270. self.headerView.adScrollView.bannerList = bannerList;
  271. }
  272. //跑马灯
  273. id broadcastList = [fetchData valueForKeyPath:@"data.broadcastList"];
  274. if ([broadcastList isKindOfClass:[NSArray class]] && [broadcastList count] > 0)
  275. {
  276. self.headerView.adScrollView.scrollTextView.scrollText = [broadcastList componentsJoinedByString:@" "];;
  277. }
  278. }
  279. if (manager == self.checkAPIManager)
  280. {
  281. id fetchData = [manager fetchDataWithBox:nil];
  282. //判断是否是最新版本
  283. id isLatest = [fetchData valueForKeyPath:@"data.isLatest"];
  284. if ([isLatest isKindOfClass:[NSNumber class]] && ![isLatest boolValue])
  285. {
  286. id isForceUpdate = [fetchData valueForKeyPath:@"data.hpVersion.isForceUpdate"];
  287. id description = [fetchData valueForKeyPath:@"data.hpVersion.description"];
  288. if ([isForceUpdate isKindOfClass:[NSNumber class]] && [description isKindOfClass:[NSString class]])
  289. {
  290. HJUpdateViewController *vc = [[HJUpdateViewController alloc] init];
  291. vc.cancelHidden = [isForceUpdate boolValue];
  292. vc.updateText = description;
  293. vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
  294. vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
  295. self.navigationController.definesPresentationContext = NO;
  296. [self presentViewController:vc animated:YES completion:nil];
  297. }
  298. }
  299. }
  300. }
  301. - (void)managerCallAPIDidFailed:(FBBaseAPIManager *)manager {
  302. if (manager == self.getHotPositionAPIManager)
  303. {
  304. [self.pageListView managerCallAPIDidFailed:manager];
  305. }
  306. }
  307. #pragma mark - HJPageListViewDelegate
  308. - (void)refreshPageListView:(HJPageListView *)pageListView {
  309. // 调用banner图片URL
  310. [self.getBannerAPIManager start];
  311. }
  312. #pragma mark - event response 通知
  313. /* 城市通知 */
  314. - (void)cityPickerViewSelectCity:(NSNotification *)notification {
  315. //只有是第一次的时候
  316. HJCityPickerCity *city = (HJCityPickerCity *)notification.object;
  317. self.navBarView.city = city.name;
  318. // 调用热门岗位API
  319. self.getHotPositionAPIManager.cityCode = city.adcode;
  320. [self.getHotPositionAPIManager start];
  321. }
  322. #pragma mark - private methods
  323. #pragma mark - lazy
  324. - (HJCheckVersionAPIManager *)checkAPIManager {
  325. if (_checkAPIManager == nil)
  326. {
  327. _checkAPIManager = [[HJCheckVersionAPIManager alloc] init];
  328. _checkAPIManager.APIManagerDelegate = self;
  329. }
  330. return _checkAPIManager;
  331. }
  332. - (AMapLocationManager *)locationManager {
  333. if (_locationManager == nil)
  334. {
  335. _locationManager = [[AMapLocationManager alloc] init];
  336. // 带逆地理信息的一次定位(返回坐标和地址信息)
  337. [_locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
  338. // [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
  339. // 定位超时时间,最低2s,此处设置为2s
  340. _locationManager.locationTimeout = 2;
  341. // 逆地理请求超时时间,最低2s,此处设置为2s
  342. _locationManager.reGeocodeTimeout = 2;
  343. }
  344. return _locationManager;
  345. }
  346. - (HJHomeDataBox *)homeDataBox {
  347. if (_homeDataBox == nil)
  348. {
  349. _homeDataBox = [[HJHomeDataBox alloc] init];
  350. }
  351. return _homeDataBox;
  352. }
  353. - (HJPositionDataBox *)positionDataBox {
  354. if (_positionDataBox == nil)
  355. {
  356. _positionDataBox = [[HJPositionDataBox alloc] init];
  357. }
  358. return _positionDataBox;
  359. }
  360. - (HJGetHotPositionAPIManager *)getHotPositionAPIManager {
  361. if (_getHotPositionAPIManager == nil)
  362. {
  363. _getHotPositionAPIManager = [[HJGetHotPositionAPIManager alloc] init];
  364. _getHotPositionAPIManager.APIManagerDelegate = self;
  365. _getHotPositionAPIManager.APIManagerInterceptor = self;
  366. }
  367. return _getHotPositionAPIManager;
  368. }
  369. - (HJGetDynamicBannerAPIManager *)getBannerAPIManager {
  370. if (_getBannerAPIManager == nil)
  371. {
  372. _getBannerAPIManager = [[HJGetDynamicBannerAPIManager alloc] init];
  373. _getBannerAPIManager.APIManagerDelegate = self;
  374. }
  375. return _getBannerAPIManager;
  376. }
  377. - (HJPageListView *)pageListView {
  378. if (_pageListView == nil)
  379. {
  380. _pageListView = [[HJPageListView alloc] init];
  381. _pageListView.tableView.delegate = self;
  382. _pageListView.tableView.dataSource = self.positionDataBox;
  383. _pageListView.tableView.tableHeaderView = self.headerView;
  384. _pageListView.APIManager = self.getHotPositionAPIManager;
  385. _pageListView.dataBox = self.positionDataBox;
  386. _pageListView.delegate = self;
  387. _pageListView.tableView.backgroundColor = COLOR_F5F5F5;
  388. // 去除顶部空白
  389. if (@available(iOS 11.0, *))
  390. {
  391. _pageListView.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  392. }
  393. else
  394. {
  395. self.automaticallyAdjustsScrollViewInsets = NO;
  396. }
  397. // 解决底部被UITabBar遮挡的问题
  398. self.edgesForExtendedLayout = UIRectEdgeNone;
  399. _pageListView.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
  400. //解决tabBar变灰问题,在退出登录然后重新登录进首页的时候
  401. self.tabBarController.tabBar.backgroundColor = [UIColor whiteColor];
  402. }
  403. return _pageListView;
  404. }
  405. - (HJHomeHeaderView *)headerView {
  406. if (_headerView == nil)
  407. {
  408. _headerView = [[HJHomeHeaderView alloc] init];
  409. _headerView.jobSortView.delegate = self;
  410. _headerView.adScrollView.delegate = self;
  411. }
  412. return _headerView;
  413. }
  414. - (HJNavBarView *)navBarView {
  415. if (_navBarView == nil)
  416. {
  417. _navBarView = [[HJNavBarView alloc] init];
  418. _navBarView.delegate = self;
  419. }
  420. return _navBarView;
  421. }
  422. - (UIButton *)customerServiceBtn {
  423. if (_customerServiceBtn == nil)
  424. {
  425. _customerServiceBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  426. [_customerServiceBtn setImage:[UIImage imageNamed:@"customerService_icon"] forState:UIControlStateNormal];
  427. [_customerServiceBtn addTarget:self action:@selector(customerServiceClick:) forControlEvents:UIControlEventTouchUpInside];
  428. UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)] ;
  429. [_customerServiceBtn addGestureRecognizer:pan] ;
  430. }
  431. return _customerServiceBtn;
  432. }
  433. @end