// // YMHomePageViewController.m // MSYOUPAI // // Created by YoMi on 2024/2/4. // Copyright © 2024 MS. All rights reserved. // #import "YMHomePageViewController.h" #import "JXCategoryView.h" #import "JXPagerView.h" #import "YMHomePageViewModel.h" #import "YMHomePageBannerView.h" #import "YMHomePageListViewController.h" #import "YMHomePageListViewControllerOnline.h" #import "YOUPAILCBannerModel.h" #import "YOUPAILZHomeBannerCell.h" #define LZCategoryViewHeight 40.0f @interface YMHomePageViewController () { dispatch_source_t _timer; } /// 首页VM @property (nonatomic, strong) YMHomePageViewModel *viewModel; /// 首页Banner视图 @property (nonatomic, strong) YMHomePageBannerView *bannerView; @property (nonatomic, weak) TYCyclePagerView *youpaipbannerView; @property (strong, nonatomic) TYPageControl *youpaippageControl; @property (strong, nonatomic) NSMutableArray *youpaipimageURLStringsGroup; @property (nonatomic, strong) NSArray *youpaipbannerArray; @property (nonatomic, strong) UIView *headerV; /// 分类标题视图 @property (nonatomic, strong) JXCategoryTitleView *categoryView; /// 分类分页视图 @property (nonatomic, strong) JXPagerView *pagerView; /// 搜索按钮 @property (nonatomic, strong) UILabel *searchLabel; /// 搜索按钮 @property (nonatomic, strong) UIButton *searchBtn; @property (nonatomic, strong) UIButton *zhidingBtn; /// banner视图高度 @property (nonatomic, assign) CGFloat bannerViewHeight; @end @implementation YMHomePageViewController @dynamic viewModel; - (void)viewDidLoad { [super viewDidLoad]; [self setNavHidden:YES]; [[YMGlobalUtils shared] getConfig]; [OCNotificationCenter addObserver:self selector:@selector(updateOnline) name:@"youpaifuserOnlineUpdate" object:nil]; // 设置背景图 UIImageView *topBgImgv = [[UIImageView alloc] init]; topBgImgv.image = ImageByName(@"ym_home_page_top_bg"); topBgImgv.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight); [self.view insertSubview:topBgImgv atIndex:0]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0); } - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.viewModel judgementsIsOpenAdolescentModel]; [self youpaifrequestBannerData]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; self.navigationController.interactivePopGestureRecognizer.enabled = YES; } - (void)ym_setupViews{ [self.view addSubview:self.pagerView]; [self.view setNeedsUpdateConstraints]; [self.view updateConstraintsIfNeeded]; } - (void)updateViewConstraints{ [self.pagerView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view).offset(0); make.left.equalTo(self.view); make.right.equalTo(self.view); make.bottom.equalTo(self.view); }]; [super updateViewConstraints]; } - (void)ym_bindViewModel{ [self.bannerView ym_bindViewModel:self.viewModel.bannerVM]; [[YMGlobalUtils shared] getConfig]; if ([self.viewModel isFemaleGender]) { self.zhidingBtn.hidden = false; } else { self.zhidingBtn.hidden = true; } [self headerRefreshing]; } /// 更新在线状态 - (void)updateOnline{ NSLog(@"updateOnline 更新在线状态"); if (self->_timer) { dispatch_source_cancel(self->_timer); } if ([LCSaveData getTokenString] == nil) { return; } [LCHttpHelper requestWithURLString:onlineUpdate parameters:nil needToken:YES type:HttpRequestTypePost success:^(id responseObject) { NSDictionary* dict = (NSDictionary*)responseObject; NSInteger code = [[dict objectForKey:@"code"] integerValue]; if (code==0) {//成功 NSInteger user_online_open = [[[dict objectForKey:@"data"]objectForKey:@"user_online_open"] integerValue]; int user_online_time = [[[dict objectForKey:@"data"]objectForKey:@"user_online_time"] intValue]; if (user_online_open == 1) { __block int timeout= user_online_time; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); self->_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); dispatch_source_set_timer(self->_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 dispatch_source_set_event_handler(self->_timer, ^{ if(timeout<=0){ dispatch_source_cancel(self->_timer); dispatch_async(dispatch_get_main_queue(), ^{ [self updateOnline]; }); }else{ // NSString *strTime = [NSString stringWithFormat:@"%.2dS",timeout]; dispatch_async(dispatch_get_main_queue(), ^{ //设置界面的按钮显示 根据自己需求设置 //NSLog(@"strTime strTime %@",strTime); //NSLog(@"当前时间挫%lld",[[LCTools getCurrentTimestamp] longLongValue]); }); timeout--; }}); dispatch_resume(self->_timer); } } } failure:^(NSError *error) { }]; } - (void)headerRefreshing{ [self.viewModel getAdvertData]; // [self.viewModel getLevelIconData]; [self.viewModel getBadgesAndNobilityIconData]; [self.viewModel.bannerVM getOnTvData]; [OCNotificationCenter postNotificationName:REFRESH_HOME_NOTIFICATION object:nil userInfo:@{}]; } - (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { //return kYMStatusBarHeight + adapt(70); CGFloat bannerViewHeight = kYMStatusBarHeight + 18.0f + ScaleSize(82.0f); self.bannerViewHeight = bannerViewHeight; return bannerViewHeight; //return 0.1; //return self.bannerViewHeight; } - (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView { return self.headerV; //return self.bannerView; //return [[UIView alloc] init]; } - (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { return 20 + LZCategoryViewHeight; } - (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { UIView *sectionView = [[UIView alloc]init]; [sectionView addSubview:self.categoryView]; [sectionView addSubview:self.zhidingBtn]; [sectionView addSubview:self.searchBtn]; [sectionView addSubview:self.searchLabel]; [self.categoryView mas_makeConstraints:^(MASConstraintMaker *make) { //make.top.equalTo(sectionView).offset(kYMStatusBarHeight); make.centerY.equalTo(sectionView); make.left.equalTo(sectionView).offset(10); //make.bottom.equalTo(sectionView).offset(-10); make.height.equalTo(LZCategoryViewHeight); }]; [self.zhidingBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(sectionView); make.left.equalTo(self.categoryView.mas_right).offset(adapt(10)); make.width.equalTo(44); make.height.equalTo(44); }]; [self.searchBtn mas_makeConstraints:^(MASConstraintMaker *make) { //make.top.equalTo(sectionView).offset(adapt(10)); make.left.equalTo(self.zhidingBtn.mas_right).offset(adapt(10)); make.right.equalTo(sectionView).offset(adapt(-10)); //make.bottom.equalTo(sectionView).offset(adapt(-10)); make.centerY.equalTo(sectionView); make.width.equalTo(44); make.height.equalTo(44); }]; [self.searchLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.searchBtn).offset(8); make.centerY.equalTo(self.searchBtn).offset(3); }]; return sectionView; } - (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView { return self.categoryView.titles.count; } - (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index{ // if (index != 0) { // YMHomePageListViewControllerOnline *childVC = [[YMHomePageListViewControllerOnline alloc] initWithViewModel:self.viewModel.homePageVMListDataArray[index]]; // childVC.jxCategoryPageIndex = index; // childVC.jxPageTitle = self.categoryView.titles[index]; // return childVC; // } YMHomePageListViewController *listVC = [[YMHomePageListViewController alloc] initWithViewModel:self.viewModel.homePageVMListDataArray[index]]; listVC.pageIndex = index; listVC.jxPageTitle = self.categoryView.titles[index]; @weakify(self) listVC.refreshBlock = ^{ @strongify(self) [self.pagerView.mainTableView.mj_header endRefreshing]; }; return listVC; } - (void)pagerView:(JXPagerView *)pagerView mainTableViewDidScroll:(UIScrollView *)scrollView { //NSLog(@"%f",scrollView.contentOffset.y); //NSLog(@"%f",self.bannerViewHeight - kYMStatusBarHeight); if ((scrollView.contentOffset.y + 1) >= (self.bannerViewHeight - kYMStatusBarHeight)) { //self.bannerView.hidden = true; self.headerV.hidden = true; } else { //self.bannerView.hidden = false; self.headerV.hidden = false; } } #pragma mark - JXCategoryViewDelegate //滑动table获得的数组 - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0); } #pragma mark - JXPagerMainTableViewGestureDelegate - (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { //禁止categoryView左右滑动的时候,上下和左右都可以滚动 if (otherGestureRecognizer == self.categoryView.collectionView.panGestureRecognizer) { return NO; } return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; } - (YMHomePageBannerView *)bannerView{ if (!_bannerView) { _bannerView = [[YMHomePageBannerView alloc]init]; @weakify(self) _bannerView.bannerViewHeightBlock = ^(CGFloat bannerViewHeight) { @strongify(self) self.bannerViewHeight = bannerViewHeight; [self.pagerView resizeTableHeaderViewHeightWithAnimatable:NO duration:0 curve:0]; }; } return _bannerView; } - (UIView *)headerV{ if (!_headerV) { _headerV = [[UIView alloc]init]; UIView *headerV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 18.0f + ScaleSize(82.0f))]; //headerV.frame = CGRectMake(0, 0, kScreenWidth, 0.1); headerV.hidden = NO; [self.view addSubview:headerV]; _headerV = headerV; TYCyclePagerView *bannerView = [[TYCyclePagerView alloc]initWithFrame:CGRectMake(10, kYMStatusBarHeight + 9.0f, KScreenWidth - 20,ScaleSize(82.0f))]; [headerV addSubview:bannerView]; bannerView.isInfiniteLoop = YES; bannerView.autoScrollInterval = 4.0; bannerView.layer.cornerRadius = ScaleSize(10.0f); bannerView.clipsToBounds = YES; bannerView.dataSource = self; bannerView.delegate = self; [bannerView registerClass:[YOUPAILZHomeBannerCell class] forCellWithReuseIdentifier:@"cellId"]; self.youpaipbannerView = bannerView; bannerView.backgroundColor = [UIColor clearColor]; TYPageControl *pageControl = [[TYPageControl alloc]initWithFrame:CGRectMake(0, CGRectGetHeight(_youpaipbannerView.frame) - 26, CGRectGetWidth(_youpaipbannerView.frame), 26)]; //pageControl.numberOfPages = _datas.count; pageControl.currentPageIndicatorSize = CGSizeMake(6, 6); pageControl.pageIndicatorSize = CGSizeMake(6, 6); //pageControl.currentPageIndicatorTintColor = [UIColor redColor]; //pageControl.pageIndicatorTintColor = [UIColor grayColor]; pageControl.pageIndicatorImage = [UIImage imageNamed:@"vqu_images_H_home_page_n"]; pageControl.currentPageIndicatorImage = [UIImage imageNamed:@"vqu_images_H_home_page_s"]; pageControl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); pageControl.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; pageControl.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; pageControl.pageIndicatorSpaing = 1; [bannerView addSubview:pageControl]; self.youpaippageControl = pageControl; } return _headerV; } - (JXCategoryTitleView *)categoryView{ if (!_categoryView) { _categoryView = [[JXCategoryTitleView alloc]initWithFrame:CGRectMake(0, 0,kFrameWidth, adapt(50))]; _categoryView.delegate = self; if (self.viewModel.isFemaleGender) { _categoryView.titles = @[@"推荐", @"高颜值女神", @"活跃", @"男神"]; } else { _categoryView.titles = @[@"推荐", @"高颜值女神", @"活跃"]; } _categoryView.titleLabelZoomEnabled = NO; _categoryView.titleColorGradientEnabled = YES; _categoryView.titleColor = HexColorFromRGB(0xC6C6C6); _categoryView.titleSelectedColor = HexColorFromRGB(0x0A0A0A); _categoryView.titleFont = LCFont(17); _categoryView.titleSelectedFont = LCBoldFont(18); _categoryView.averageCellSpacingEnabled = NO; _categoryView.contentScrollViewClickTransitionAnimationEnabled = NO; _categoryView.backgroundColor = [UIColor clearColor]; JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc]init]; lineView.indicatorColor = UIColor.clearColor; lineView.verticalMargin = adapt(8); lineView.indicatorWidth = JXCategoryViewAutomaticDimension; lineView.indicatorHeight = adapt(5); lineView.indicatorCornerRadius = 0; _categoryView.indicators = @[lineView]; _categoryView.listContainer = (id)self.pagerView.listContainerView; JXCategoryIndicatorImageView *indicatorImageView = [[JXCategoryIndicatorImageView alloc] init]; indicatorImageView.indicatorImageViewSize = CGSizeMake(adapt(68), 44); UIImageView *indicatorImgv = [[UIImageView alloc] init]; //indicatorImgv.image = [UIImage imageWithColor:HexColorFromRGB(0xFC8997) size:CGSizeMake(adapt(40), adapt(8))]; indicatorImgv.image = ImageByName(@"home_indicator_img"); indicatorImgv.layer.cornerRadius = adapt(4); indicatorImgv.layer.masksToBounds = YES; //indicatorImgv.contentMode = UIViewContentModeScaleAspectFit; [indicatorImageView addSubview:indicatorImgv]; [indicatorImgv mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(indicatorImageView); make.bottom.equalTo(indicatorImageView).offset(adapt(0)); make.width.mas_equalTo(adapt(41)); make.height.mas_equalTo(adapt(9)); }]; _categoryView.indicators = @[indicatorImageView]; } return _categoryView; } - (JXPagerView*)pagerView{ if (!_pagerView) { //需要下拉刷新则要这个代理给设置出来 _pagerView = [[JXPagerView alloc] initWithDelegate:self]; _pagerView.mainTableView.backgroundColor = UIColor.clearColor; _pagerView.mainTableView.gestureDelegate = self; _pagerView.mainTableView.mj_header = self.refreshHeader; _pagerView.mainTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; //当有头部视图的时候设置固定高度 _pagerView.pinSectionHeaderVerticalOffset = kYMStatusBarHeight; //关闭弹簧效果 // _pagerView.mainTableView.bounces = NO; } return _pagerView; } - (UILabel *)searchLabel { if (!_searchLabel) { _searchLabel = [[UILabel alloc] init]; _searchLabel.hidden = YES; _searchLabel.text = @"寻找"; _searchLabel.textColor = UIColor.whiteColor; _searchLabel.font = LCFont(11); } return _searchLabel; } - (UIButton *)searchBtn { if (!_searchBtn) { _searchBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_searchBtn setImage:ImageByName(@"ym_home_page_xunzhao") forState: UIControlStateNormal]; [_searchBtn setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; _searchBtn.titleLabel.font = LCFont(11); WS(weakSelf) [[[_searchBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(__kindof UIButton * _Nullable sender) { [weakSelf.viewModel gotoSearchUser]; }]; } return _searchBtn; } - (UIButton *)zhidingBtn{ if (!_zhidingBtn) { _zhidingBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_zhidingBtn setImage:ImageByName(@"home_msg_zhiding") forState:UIControlStateNormal]; _zhidingBtn.hidden = true; WS(weakSelf) [[[_zhidingBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(__kindof UIButton * _Nullable sender) { [weakSelf.viewModel zhidingData]; }]; } return _zhidingBtn; } #pragma mark - TYCyclePagerViewDataSource - (NSInteger)numberOfItemsInPagerView:(TYCyclePagerView *)pageView { return self.youpaipimageURLStringsGroup.count; } - (UICollectionViewCell *)pagerView:(TYCyclePagerView *)pagerView cellForItemAtIndex:(NSInteger)index { YOUPAILZHomeBannerCell *cell = [pagerView dequeueReusableCellWithReuseIdentifier:@"cellId" forIndex:index]; NSString *url; // absoluteString if (self.youpaipimageURLStringsGroup) { url = [self.youpaipimageURLStringsGroup[index] absoluteString]; [cell.youpaipbgImageView sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"banner_default"]]; } cell.layer.cornerRadius = ScaleSize(10); cell.layer.masksToBounds = YES; cell.backgroundColor = [UIColor clearColor]; // cell.backgroundColor = _datas[index]; // cell.label.text = [NSString stringWithFormat:@"index->%ld",index]; return cell; } - (TYCyclePagerViewLayout *)layoutForPagerView:(TYCyclePagerView *)pageView { TYCyclePagerViewLayout *layout = [[TYCyclePagerViewLayout alloc]init]; layout.itemSize = CGSizeMake(CGRectGetWidth(pageView.frame), CGRectGetHeight(pageView.frame)); layout.itemSpacing = 20; // ScaleSize(10.0f) layout.layoutType = TYCyclePagerTransformLayoutNormal; //layout.minimumAlpha = 0.3; return layout; } - (void)pagerView:(TYCyclePagerView *)pageView didSelectedItemCell:(__kindof UICollectionViewCell *)cell atIndex:(NSInteger)index{ YOUPAILCBannerModel* model = self.youpaipbannerArray[index]; if (model.youpaiplink_type==1) { ZCBaseWebVC* baseWeb = [[ZCBaseWebVC alloc]init]; baseWeb.title = @"详情页"; baseWeb.contentUrl = model.youpaiplink_url; [self.navigationController pushViewController:baseWeb animated:YES]; }else if (model.youpaiplink_type==2||model.youpaiplink_type==3){ [self youpaifpageToStr:model.youpaiplink_url]; } } - (void)pagerView:(TYCyclePagerView *)pageView didScrollFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex { self.youpaippageControl.currentPage = toIndex; } /// 获取banner数据 - (void)youpaifrequestBannerData{ @weakify(self); [LCHttpHelper requestWithURLString:HomeBanner parameters:@{@"cate_id":@"5"} needToken:YES type:(HttpRequestTypePost) success:^(id responseObject) { @strongify(self); NSDictionary* dict = (NSDictionary*)responseObject; NSInteger code = [[dict objectForKey:@"code"] integerValue]; if (code==0) {//成功 self.youpaipbannerArray = [YOUPAILCBannerModel mj_objectArrayWithKeyValuesArray:[[dict objectForKey:@"data"]objectForKey:@"banner"]]; [self youpaifreloadBannerData]; } } failure:^(NSError *error) { }]; } -(void)youpaifreloadBannerData{ NSMutableArray *imgUrlArray = [NSMutableArray array]; for (YOUPAILCBannerModel* model in self.youpaipbannerArray) { [imgUrlArray addObject:[LCTools getImageUrlWithAddress:model.youpaipimage]]; } self.youpaippageControl.numberOfPages = imgUrlArray.count; self.youpaipimageURLStringsGroup = imgUrlArray; [self.youpaipbannerView reloadData]; } @end