// // YMHomeSloganViewController.m // YUMI // // Created by XY on 2023/2/17. // #import "XPHomeSloganViewController.h" #import "XPHomeUserView.h" #import "YUMIMacroUitls.h" #import "DJDKMIMOMColor.h" #import "NetImageView.h" #import #import "XPWeakTimer.h" #import "AccountInfoStorage.h" #import "Api+Home.h" ///M #import "HomeRecommendRoomModel.h" ///VC #import "XPRoomViewController.h" #import "XPMineSimpleUserInfoViewController.h" @interface XPHomeSloganViewController () { NSTimer * timer; } /// 用户视图数组 @property (nonatomic, strong) NSMutableArray *userViewArr; /// 背景图 @property (nonatomic, strong) NetImageView *bgImageView; /// MoliStar圈 @property (nonatomic, strong) UIImageView *nameImageView; @property (nonatomic, strong) UIButton *enterRoomBtn; ///个人房列表数据 @property (nonatomic,strong) NSMutableArray *hotRoomList; @end @implementation XPHomeSloganViewController //- (XPHomeRecommendPresenter *)createPresenter { // return [[XPHomeRecommendPresenter alloc] init]; //} - (BOOL)isHiddenNavBar { return YES; } - (void)viewDidLoad { [super viewDidLoad]; [self createUI]; [self addTimer]; [self loadRecommend]; } - (void)loadRecommend { NSString * uid = [AccountInfoStorage instance].getUid; NSString * pageStr = [NSString stringWithFormat:@"%d", 1]; NSString * pageSizeStr = [NSString stringWithFormat:@"%d", 10]; [Api getRecommendListComplection:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if (code == 200) { NSArray * array = [HomeRecommendRoomModel modelsWithArray:data.data]; [self getHomeRecommendRoomListSuccess:array]; } else { } } uid:uid tabId:@"" pageNum:pageStr pageSize:pageSizeStr]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (timer) { [timer setFireDate:[NSDate distantPast]]; //很远的过去 } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (timer) { //关闭定时器 [timer setFireDate:[NSDate distantFuture]]; //很远的将来 } } - (void)createUI { [self.view addSubview:self.bgImageView]; [self.view addSubview:self.nameImageView]; [self.view addSubview:self.enterRoomBtn]; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; [self.nameImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(kStatusBarHeight+20); make.leading.mas_equalTo(23); make.width.mas_equalTo(100); make.height.mas_equalTo(45); }]; [self.enterRoomBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(30); make.height.mas_equalTo(40); make.centerY.mas_equalTo(self.nameImageView); make.trailing.mas_equalTo(self.view).offset(-15); }]; } - (void)addTimer { timer = [XPWeakTimer scheduledTimerWithTimeInterval:15 block:^(id userInfo) { [self loadRecommend]; } userInfo:nil repeats:YES]; } #pragma mark - XPHomeUserViewDelegate - (void)userViewClickAction:(HomeRecommendRoomModel *)model { if (model.roomUid.length > 0) { // [XPRoomViewController openRoom:model.uid fromNick:nil fromType:UserEnterRoomFromType_Home_Recommend fromUid:nil viewController:self]; XPMineSimpleUserInfoViewController *infoVC = [[XPMineSimpleUserInfoViewController alloc] init]; infoVC.uid = [model.roomUid integerValue]; [self.navigationController pushViewController:infoVC animated:YES]; } } #pragma mark - XPHomeRecommendProtocol - (void)getHomeRecommendRoomListSuccess:(NSArray *)list { if (list.count > 10) { list = [list subarrayWithRange:NSMakeRange(0, 9)]; } [self.hotRoomList removeAllObjects]; [self.hotRoomList addObjectsFromArray:list]; // 二次添加 if (self.userViewArr.count > 0) { [self removeUserViews]; return; } // 首次添加 for (HomeRecommendRoomModel *model in self.hotRoomList) { XPHomeUserView *userView = [self showUserView:model]; if(userView != nil) { [self.userViewArr addObject:userView]; } } } - (void)getHomeRecommendDataFail { } /// 添加用户视图 - (XPHomeUserView *)showUserView:(HomeRecommendRoomModel *)model { // 随机坐标 CGFloat scale = (arc4random_uniform(50)+1)*0.01 + 0.5; CGRect rect = [self getRandomRect]; CGRect scaleRect = rect; scaleRect.size.width = rect.size.width * scale; scaleRect.size.height = rect.size.height * scale; // 确保不重叠 NSInteger count = 0; //循环超过1000次强制退出 BOOL contain = [self intersectsRect:scaleRect]; while (contain || count < 1000) { scale = (arc4random_uniform(50)+1)*0.01 + 0.5; rect = [self getRandomRect]; scaleRect = rect; scaleRect.size.width = rect.size.width * scale; scaleRect.size.height = rect.size.height * scale; contain = [self intersectsRect:scaleRect]; count++; } //循环1000次还重叠,就放弃添加,防止死循环 if (contain == YES) { return nil; } // 添加 XPHomeUserView *userView = [[XPHomeUserView alloc] init]; userView.frame = rect; userView.transform = CGAffineTransformMakeScale(scale, scale); userView.frame = scaleRect; userView.delegate = self; [self.view addSubview:userView]; userView.roomModel = model; // 动画出现 userView.alpha = 0; [UIView animateWithDuration:0.5 animations:^{ userView.alpha = 1; } completion:^(BOOL finished) { }]; return userView; } - (void)removeUserViews { dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_main_queue(); NSUInteger viewCount = self.userViewArr.count; for (int i = 0; i< viewCount; i++) { dispatch_group_enter(group); XPHomeUserView *userView = self.userViewArr[i]; [UIView animateWithDuration:0.5 animations:^{ userView.alpha = 0; userView.transform = CGAffineTransformMakeScale(0.01, 0.01); } completion:^(BOOL finished) { [userView removeFromSuperview]; [self.userViewArr removeObject:userView]; dispatch_group_leave(group); }]; } dispatch_group_notify(group, queue, ^{ for (HomeRecommendRoomModel *model in self.hotRoomList) { XPHomeUserView *userView = [self showUserView:model]; if (userView !=nil) { [self.userViewArr addObject:userView]; } } }); } /// 获取随机坐标 - (CGRect)getRandomRect { @autoreleasepool { // 用户视图原始大小 CGFloat userViewWidth = 120; CGFloat userViewHeight = 120; CGFloat statusBarHeight = kStatusBarHeight; // 限定随机区域 CGFloat areaWidth = self.view.bounds.size.width - userViewWidth - 5*2; CGFloat areaHeight = self.view.bounds.size.height - statusBarHeight - 70 - 90- userViewHeight; CGFloat x = arc4random_uniform(areaWidth)+5; CGFloat y = arc4random_uniform(areaHeight)+statusBarHeight+ 70; CGRect rect = CGRectMake(x, y, userViewWidth, userViewHeight); return rect; } } /// 判断新生成的坐标是否和已添加的用户视图坐标重叠 /// - Parameter targetRect: 目标坐标 - (BOOL)intersectsRect:(CGRect)targetRect { @autoreleasepool { for (XPHomeUserView *userView in self.userViewArr) { CGRect frame = userView.frame; BOOL b = CGRectIntersectsRect(targetRect, frame); if (b) { return YES; } } return NO; } } - (void)likeButtonAction:(UIButton *)sender { NSString* roomUid = [AccountInfoStorage instance].getUid; [XPRoomViewController openRoom:roomUid viewController:self]; } #pragma mark - 懒加载 - (NSMutableArray *)userViewArr { if (!_userViewArr) { _userViewArr = [NSMutableArray array]; } return _userViewArr; } - (NSMutableArray *)hotRoomList { if (!_hotRoomList) { _hotRoomList = [NSMutableArray array]; } return _hotRoomList; } - (NetImageView *)bgImageView { if (!_bgImageView) { _bgImageView = [[NetImageView alloc] init]; _bgImageView.contentMode = UIViewContentModeScaleAspectFill; _bgImageView.image = [UIImage imageNamed:@"home_bg"]; } return _bgImageView; } - (UIImageView *)nameImageView { if (!_nameImageView) { _nameImageView = [[UIImageView alloc] init]; _nameImageView.contentMode = UIViewContentModeScaleAspectFit; _nameImageView.image = [UIImage imageNamed:@"home_name"]; } return _nameImageView; } - (UIButton *)enterRoomBtn { if (!_enterRoomBtn) { _enterRoomBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [_enterRoomBtn setImage:[UIImage imageNamed:@"home_nav_open_room"] forState:UIControlStateNormal]; [_enterRoomBtn setImage:[UIImage imageNamed:@"home_nav_open_room"] forState:UIControlStateSelected]; [_enterRoomBtn addTarget:self action:@selector(likeButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _enterRoomBtn; } @end