HJHomeViewController.m 18 KB

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