RDSHomeVC.m 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. //
  2. // RDSHomeVC.m
  3. // Temperature
  4. //
  5. // Created by RD on 2022/10/24.
  6. //
  7. #import "RDSHomeVC.h"
  8. #import "RDSHomeTopView.h"
  9. #import "RDSHomeSceneView.h"
  10. #import "RDSHomeRoomView.h"
  11. #import "RDSRoomCell.h"
  12. #import "RDSAddRoomView.h"
  13. #import "RDSSelectDeviceMainVC.h"
  14. #import "RDSAirControlVC.h"
  15. #import "RDSSubControlVC.h"
  16. #import <MJRefresh/MJRefresh.h>
  17. #import "RDSMyInfoVC.h"
  18. #import "RDSSetPwdVC.h"
  19. #import "RDSMapHelper.h"
  20. #import "UIImageView+webImage.h"
  21. #import "GCDTimer.h"// 轮询定时器
  22. #import "YXMenuItemView.h"
  23. #import <YBPopupMenu/YBPopupMenu.h>
  24. #import "YXDeviceViewController.h"
  25. #import "YXDeviceManagerViewController.h"
  26. #import "YXRoomManagerViewController.h"
  27. #import "YXInviteViewController.h"
  28. #import "OPQRCodeViewController.h"
  29. #import "YXMessageListViewController.h"
  30. #import "RDSControlWebVC.h"
  31. #import "YXAddressViewController.h"
  32. #import "RDSRootControl.h"
  33. #import "YXTopImageModel.h"
  34. #import "WeatherModel.h"
  35. #import "RDSRoomModel.h"
  36. #import "YXHomeSceneModel.h"
  37. static NSString * const RDSRoomCellID = @"RDSRoomCellID";
  38. @interface RDSHomeVC ()<UICollectionViewDelegateFlowLayout,UICollectionViewDelegate, UICollectionViewDataSource,YBPopupMenuDelegate>
  39. @property (nonatomic, weak) UICollectionView *collectionView;
  40. @property (nonatomic, strong) UICollectionReusableView *footerView;
  41. @property (nonatomic, strong) UICollectionReusableView *headerView;
  42. @property (nonatomic, weak) RDSHomeTopView *topView;
  43. @property (nonatomic, strong) UIView *menuView;
  44. @property (nonatomic, strong) UIScrollView *menuScrollView;
  45. @property (nonatomic, strong) RDSHomeSceneView *sceneView;
  46. @property (nonatomic, strong) RDSAddRoomView *addView;
  47. @property (nonatomic, strong) GCDTimer *gcdTimer;// 定时轮询
  48. @property (nonatomic, strong) NSMutableArray *dataArray;
  49. @property (nonatomic, assign) NSInteger selectedIndex;
  50. @property (nonatomic, copy) NSArray *sceneArray;
  51. @property (nonatomic, assign) RoomCellStyle cellStyle;
  52. @end
  53. @implementation RDSHomeVC
  54. - (UIStatusBarStyle)preferredStatusBarStyle {
  55. return UIStatusBarStyleLightContent;
  56. }
  57. - (void)viewDidLoad {
  58. [super viewDidLoad];
  59. self.view.backgroundColor = [UIColor colorWithHexString:@"#F2F5FA"];
  60. // 隐藏导航栏
  61. self.fd_prefersNavigationBarHidden = YES;
  62. // [self setNeedsStatusBarAppearanceUpdate];
  63. self.selectedIndex = 0;
  64. self.dataArray = [[NSMutableArray alloc]initWithCapacity:5];
  65. [self p_setupCollectionView];
  66. [kNotificationCenter addObserver:self selector:@selector(p_refreshUserInfo)name:RDSUpdateUserInfoNotice object:nil];
  67. [kNotificationCenter addObserver:self selector:@selector(applicationDidEnterBackground)name:@"kApplicationDidEnterBackground" object:nil];
  68. [kNotificationCenter addObserver:self selector:@selector(applicationWillEnterForeground)name:@"kApplicationWillEnterForeground" object:nil];
  69. if(TheDataManager.isFirstLogin){
  70. RDSSetPwdVC *vc = [[RDSSetPwdVC alloc] init];
  71. // vc.hidesBottomBarWhenPushed = YES;
  72. vc.modalPresentationStyle = UIModalPresentationFullScreen;
  73. [self presentViewController:vc animated:YES completion:nil];
  74. }
  75. // [self showReason];
  76. }
  77. -(void)showReason
  78. {
  79. NSString *reason = [[NSUserDefaults standardUserDefaults] objectForKey:@"exceptionReason"];
  80. NSString *trace = [[NSUserDefaults standardUserDefaults] objectForKey:@"exceptionStackTrace"];
  81. if (reason.length == 0 && trace.length == 0) {
  82. return;
  83. }
  84. NSString *msgText = [NSString stringWithFormat:@"%@---%@",reason,trace];
  85. UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"崩溃原因" message:msgText preferredStyle:UIAlertControllerStyleAlert];
  86. UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
  87. [alert addAction:okAction];
  88. [self presentViewController:alert animated:YES completion:nil];
  89. }
  90. -(void)viewWillAppear:(BOOL)animated{
  91. [super viewWillAppear:animated];
  92. [self p_setUpTimer];// 初始化轮询
  93. [self p_getBgImage];
  94. [self p_getCurrentUserInfo];
  95. }
  96. - (void)viewDidAppear:(BOOL)animated{
  97. [super viewDidAppear:animated];
  98. [_gcdTimer resumeTimer];// 开始轮询
  99. }
  100. -(void)viewWillDisappear:(BOOL)animated
  101. {
  102. [super viewWillDisappear:animated];
  103. }
  104. - (void)viewDidDisappear:(BOOL)animated{
  105. [super viewDidDisappear:animated];
  106. [_gcdTimer pauseTimer];// 暂停轮询
  107. [_gcdTimer stopTimer];// 取消轮询
  108. }
  109. -(void)applicationDidEnterBackground
  110. {
  111. [_gcdTimer pauseTimer];// 暂停轮询
  112. }
  113. -(void)applicationWillEnterForeground
  114. {
  115. [_gcdTimer resumeTimer];// 开始轮询
  116. }
  117. - (void)p_getCurrentUserInfo{
  118. RDS_WEAKSELF(weakSelf)
  119. [RDSUserInfoModel rds_getCurrentUserInfoFinished:^(NSError *error) {
  120. if (!error) {
  121. [weakSelf p_refreshUserInfo];
  122. [weakSelf p_getHomeList];
  123. [weakSelf p_getHomeDetail];
  124. [weakSelf p_getWeather];
  125. [weakSelf p_getScene];
  126. [weakSelf p_getUnreadList];
  127. }else{
  128. [RDSRootControl shareControl].isLoginSuccess = NO;
  129. TheDataManager.token = @"";
  130. }
  131. }];
  132. }
  133. -(void)p_getUnreadList
  134. {
  135. RDS_WEAKSELF(weakSelf)
  136. [RDSDemoApiHelper rds_getUnreadMessageSuccess:^(id responseObject) {
  137. if ([responseObject[@"code"] intValue] == 0) {
  138. NSDictionary *dataDic = responseObject[@"data"];
  139. NSDictionary *listDic = dataDic[@"list"];
  140. if ([listDic isKindOfClass:[NSDictionary class]]) {
  141. NSNumber *num = listDic[@"unread_total"];
  142. if ([num integerValue] > 0) {
  143. weakSelf.topView.redView.hidden = NO;
  144. }else{
  145. weakSelf.topView.redView.hidden = YES;
  146. }
  147. }
  148. } else{
  149. [RDSHudShower showBottomToast:responseObject[@"message"]];
  150. }
  151. } failure:^(NSError *error) {
  152. }];
  153. }
  154. - (void)p_changeSelectWithHomeID:(NSString *)homeId
  155. {
  156. [RDSHudShower showWithStatus:@"切换中..."];
  157. RDS_WEAKSELF(weakSelf)
  158. [RDSDemoApiHelper rds_setDefaultHome:homeId success:^(id responseObject) {
  159. if ([responseObject[@"code"] intValue] == 0) {
  160. [RDSHudShower dismissHUD];
  161. for (int i = 0; i < TheDataManager.homes.count; i++) {
  162. RDSHomeModel *model = TheDataManager.homes[i];
  163. if ([model.record_id isEqualToString:homeId]) {
  164. TheDataManager.current_home_name = model.name;
  165. TheDataManager.current_home_index = i;
  166. TheDataManager.current_home_id = model.record_id;
  167. weakSelf.topView.title = model.name;
  168. [weakSelf p_getHomeDetail];
  169. [weakSelf p_getWeather];
  170. [weakSelf p_getScene];
  171. }
  172. }
  173. } else{
  174. [RDSHudShower showErrorWithStatus:responseObject[@"message"]];
  175. }
  176. } failure:^(NSError *error) {
  177. [RDSHudShower showBottomToast:@"连接服务器失败"];
  178. }];
  179. }
  180. - (void)p_getHomeList
  181. {
  182. [RDSHomeModel rds_getHomeListIsAdmin:NO finished:nil];
  183. }
  184. - (void)p_getWeather{
  185. RDS_WEAKSELF(weakSelf)
  186. [WeatherModel rds_getWeatherFinished:^(WeatherModel * _Nonnull weather, NSError * _Nonnull error) {
  187. weakSelf.topView.model = weather;
  188. }];
  189. }
  190. - (void)p_getBgImage{
  191. RDS_WEAKSELF(weakSelf)
  192. [YXTopImageModel rds_getImageWithFinished:^(YXTopImageModel * _Nonnull model, NSError * _Nonnull error) {
  193. [weakSelf.topView sendSubviewToBack:weakSelf.topView.topImageView];
  194. [weakSelf.topView.topImageView sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", TheApiHelper.baseUrlHeadImg, model.url]]];
  195. }];
  196. }
  197. - (void)p_getScene{
  198. RDS_WEAKSELF(weakSelf)
  199. [YXHomeSceneModel rds_getHomeScenesWithHomeId:TheDataManager.current_home_id homepage:@1 type:@"" finished:^(NSArray * _Nonnull scenes, NSError * _Nonnull error) {
  200. weakSelf.topView.scenesArray = scenes;
  201. weakSelf.sceneArray = scenes;
  202. [weakSelf.collectionView reloadData];
  203. }];
  204. }
  205. //- (void)p_getWelcomeMessage {
  206. // RDS_WEAKSELF(weakSelf)
  207. // [RDSSystemParameterModel rds_getWelcomeMessageFinished:^(RDSSystemParameterModel * _Nullable systemParameter, NSError * _Nullable error) {
  208. // weakSelf.topView.systemParameter = systemParameter;
  209. // }];
  210. //}
  211. //// 弃用
  212. //- (void)p_getRoomList{
  213. // RDS_WEAKSELF(weakSelf)
  214. // [RDSRoomModel rds_getRoomListFinished:^(NSError * _Nonnull error) {
  215. //
  216. // weakSelf.addView.hidden = (BOOL)TheDataManager.rooms.count;
  217. //
  218. // [weakSelf.collectionView.mj_header endRefreshing];
  219. // [weakSelf.collectionView reloadData];
  220. // }];
  221. //}
  222. //获取设备
  223. - (void)p_getHomeDetail{
  224. RDS_WEAKSELF(weakSelf)
  225. [RDSHomeModel rds_getHomeDetailWithFinished:^(RDSHomeModel *home, NSError *error) {
  226. if(kNULLString(home.city)){
  227. [weakSelf p_userLocation];
  228. }
  229. //数据处理
  230. [weakSelf.dataArray removeAllObjects];
  231. for (YXHomeRoomModel *room in home.room) {
  232. NSArray *devicesArray = [[NSArray alloc]init];
  233. if (room.devices != nil) {
  234. devicesArray = room.devices;
  235. }
  236. NSDictionary *roomDic = @{
  237. @"title":room.name,
  238. @"devices":devicesArray
  239. };
  240. [weakSelf.dataArray addObject:roomDic];
  241. }
  242. if (weakSelf.dataArray.count > weakSelf.selectedIndex) {
  243. NSDictionary *dic = weakSelf.dataArray[weakSelf.selectedIndex];
  244. NSArray *devicesArray = dic[@"devices"];
  245. weakSelf.addView.hidden = devicesArray.count == 0 ? NO : YES;
  246. }
  247. [weakSelf setRoomItemView];
  248. [weakSelf.collectionView.mj_header endRefreshing];
  249. [weakSelf.collectionView reloadData];
  250. }];
  251. }
  252. - (void)p_userLocation{
  253. RDS_WEAKSELF(weakSelf)
  254. [TheMapHelper rds_startLocationSevice:^(RDSUserLocation *userLocation){
  255. // [weakSelf p_updateLocation];
  256. }];
  257. }
  258. //- (void)p_updateLocation{
  259. // RDS_WEAKSELF(weakSelf)
  260. // if(kNULLString(TheMapHelper.userLocation.cityString)){
  261. // return;
  262. // }
  263. //
  264. // [RDSDemoApiHelper rds_updateHomeInfoWithHomeId:TheDataManager.current_home_id name:TheDataManager.current_home_name city:TheMapHelper.userLocation.cityString success:^(id responseObject) {
  265. // if ([responseObject[@"code"] intValue] == 0) {
  266. // DDLog(@"更新城市成功");
  267. //
  268. // [weakSelf p_getWeather];
  269. // } else{
  270. // DDLog(@"更新城市失败:%@",responseObject[@"message"]);
  271. // }
  272. // } failure:^(NSError *error) {
  273. //
  274. // }];
  275. //}
  276. -(void)p_changeScene:(NSString *)sceneId {
  277. [RDSDemoApiHelper rds_putScenes:sceneId success:^(id responseObject) {
  278. if ([responseObject[@"code"] intValue] == 0) {
  279. [RDSHudShower showBottomToast:@"设置成功"];
  280. } else {
  281. [RDSHudShower showBottomToast:responseObject[@"message"]];
  282. }
  283. } failure:^(NSError *error) {
  284. }];
  285. }
  286. - (void)p_refreshUserInfo{
  287. RDS_WEAKSELF(weakSelf)
  288. weakSelf.topView.title = TheDataManager.current_home_name;
  289. }
  290. // 定时轮询
  291. - (void)p_setUpTimer{
  292. if (self.gcdTimer == nil) {
  293. self.gcdTimer = [[GCDTimer alloc] init];
  294. }
  295. RDS_WEAKSELF(weakSelf)
  296. [_gcdTimer scheduledTimerWithTimeInterval:3 afterTime:3 repeats:YES block:^{
  297. [weakSelf p_getCurrentUserInfo];
  298. }];
  299. }
  300. #pragma mark - 右上角按钮
  301. - (void)topRightAction:(UIButton *)button {
  302. [YBPopupMenu showRelyOnView:button titles:@[@"添加设备", @"创建场景",@"邀请家人"] icons:@[@"home_pop_add", @"home_pop_scene",@"home_pop_invitation"] menuWidth:130 otherSettings:^(YBPopupMenu *popupMenu) {
  303. popupMenu.delegate = self;
  304. popupMenu.animationManager.duration = 0.25;
  305. popupMenu.textColor = [UIColor colorWithHexString:@"#1F1F1F"];
  306. popupMenu.tag = 1;
  307. }];
  308. }
  309. #pragma mark - YPPopupMenuDelegate
  310. - (void)ybPopupMenu:(YBPopupMenu *)ybPopupMenu didSelectedAtIndex:(NSInteger)index {
  311. NSInteger tag = ybPopupMenu.tag;
  312. if (tag == 1) {
  313. if (index == 0) {
  314. YXDeviceViewController *deviceVc = [[YXDeviceViewController alloc]init];
  315. deviceVc.hidesBottomBarWhenPushed = YES;
  316. [self pushViewController:deviceVc animated:YES];
  317. }else if(index == 1){
  318. RDSControlWebVC *webVc = [[RDSControlWebVC alloc]init];
  319. webVc.requestURL = [NSString stringWithFormat:@"%@scene/%@",kBaseUrlH5,TheDataManager.current_home_id];
  320. webVc.hidesBottomBarWhenPushed = YES;
  321. [self.navigationController pushViewController:webVc animated:YES];
  322. }
  323. // else if(index == 2){
  324. // OPQRCodeViewController *vc = [[OPQRCodeViewController alloc] init];
  325. // vc.delegate = self;
  326. // vc.topOffset = -kNavHeight;
  327. // vc.hidesBottomBarWhenPushed = YES;
  328. // [self pushViewController:vc animated:YES];
  329. // }
  330. else if(index == 2){
  331. YXInviteViewController *inviteVc = [[YXInviteViewController alloc]init];
  332. inviteVc.homeName = TheDataManager.current_home_name;
  333. inviteVc.homeId = TheDataManager.current_home_id;
  334. inviteVc.hidesBottomBarWhenPushed = YES;
  335. [self.navigationController pushViewController:inviteVc animated:YES];
  336. }else{
  337. }
  338. }
  339. if (tag == 2) {
  340. if (index == 0) {
  341. if (self.cellStyle == RoomCellStyleDefault) {
  342. self.cellStyle = RoomCellStyleList;
  343. }else{
  344. self.cellStyle = RoomCellStyleDefault;
  345. }
  346. NSNumber *style = @(self.cellStyle);
  347. [[NSUserDefaults standardUserDefaults] setObject:style forKey:@"kHomeCellStyle"];
  348. [self.collectionView reloadData];
  349. }else if(index == 1){
  350. YXDeviceManagerViewController *deviceVc = [[YXDeviceManagerViewController alloc]init];
  351. deviceVc.hidesBottomBarWhenPushed = YES;
  352. [self pushViewController:deviceVc animated:YES];
  353. }else if(index == 2){
  354. YXRoomManagerViewController *roomVc = [[YXRoomManagerViewController alloc]init];
  355. roomVc.hidesBottomBarWhenPushed = YES;
  356. [self pushViewController:roomVc animated:YES];
  357. }else{
  358. }
  359. }
  360. if (tag == 3) {
  361. if (index < TheDataManager.homes.count) {
  362. RDSHomeModel *home = TheDataManager.homes[index];
  363. NSString *homeId = home.record_id;
  364. [self p_changeSelectWithHomeID:homeId];
  365. }
  366. }
  367. }
  368. #pragma mark - 房间名称
  369. -(void)setRoomItemView
  370. {
  371. [self.menuScrollView removeAllSubviews];
  372. NSMutableArray *titleArray = [[NSMutableArray alloc]initWithCapacity:5];
  373. for (int i = 0; i < self.dataArray.count; i++) {
  374. NSDictionary *dic = self.dataArray[i];
  375. NSString *title = dic[@"title"];
  376. [titleArray addObject:title];
  377. }
  378. CGFloat itemSpace = 20;
  379. CGFloat allWidth = 0;
  380. for (int i = 0; i < titleArray.count; i++) {
  381. NSString *text = titleArray[i];
  382. YXMenuItemView *menuItemView = [[YXMenuItemView alloc]init];
  383. NSDictionary *dict = @{NSFontAttributeName: menuItemView.textLabel.font};
  384. CGSize textSize = [text boundingRectWithSize:CGSizeMake(200, 30) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
  385. CGFloat width = textSize.width+2;
  386. [menuItemView.colorView mas_updateConstraints:^(MASConstraintMaker *make) {
  387. make.width.equalTo(@(width));
  388. }];
  389. menuItemView.frame = CGRectMake(i*itemSpace + allWidth, 0, width, 30);
  390. allWidth = allWidth + width;
  391. menuItemView.textLabel.text = text;
  392. if (i == self.selectedIndex) {
  393. menuItemView.colorView.hidden = NO;
  394. menuItemView.textLabel.textColor = [UIColor colorWithHexString:@"#333333"];
  395. }else{
  396. menuItemView.colorView.hidden = YES;
  397. menuItemView.textLabel.textColor = [UIColor colorWithHexString:@"#999999"];
  398. }
  399. [self.menuScrollView addSubview:menuItemView];
  400. menuItemView.tag = i;
  401. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(menuItemTapAction:)];
  402. [menuItemView addGestureRecognizer:tap];
  403. }
  404. self.menuScrollView.contentSize = CGSizeMake(titleArray.count * itemSpace + allWidth, 30);
  405. }
  406. -(void)menuItemTapAction:(UITapGestureRecognizer *)tap{
  407. NSInteger tag = tap.view.tag;
  408. self.selectedIndex = tag;
  409. for (int i = 0; i < self.menuView.subviews.count; i++) {
  410. UIView *view = self.menuView.subviews[i];
  411. if ([view isKindOfClass:[UIScrollView class]]) {
  412. UIScrollView *menuScrollView = (UIScrollView *)view;
  413. NSArray *views = menuScrollView.subviews;
  414. for (int i = 0; i < views.count; i++) {
  415. YXMenuItemView *menuItemView = views[i];
  416. if (i == tag) {
  417. menuItemView.colorView.hidden = NO;
  418. menuItemView.textLabel.textColor = [UIColor colorWithHexString:@"#333333"];
  419. }else{
  420. menuItemView.colorView.hidden = YES;
  421. menuItemView.textLabel.textColor = [UIColor colorWithHexString:@"#999999"];
  422. }
  423. }
  424. }
  425. }
  426. if (self.selectedIndex < self.dataArray.count) {
  427. NSDictionary *roomDic = self.dataArray[self.selectedIndex];
  428. NSArray *devicesArray = roomDic[@"devices"];
  429. self.addView.hidden = devicesArray.count == 0 ? NO : YES;
  430. }
  431. [self.collectionView reloadData];
  432. }
  433. #pragma mark - UI
  434. // 顶部视图
  435. - (void)p_setupTopView{
  436. if(self.topView == nil){
  437. RDSHomeTopView *view = [RDSHomeTopView rds_loadViewFromNib];
  438. // view.frame = CGRectMake(0, 0, SCREEN_WIDTH, viewH);
  439. [self.footerView addSubview:view];
  440. [view mas_makeConstraints:^(MASConstraintMaker *make) {
  441. make.top.equalTo(self.footerView);
  442. make.bottom.equalTo(self.footerView);
  443. make.left.equalTo(self.footerView);
  444. make.right.equalTo(self.footerView);
  445. }];
  446. self.topView = view;
  447. RDS_WEAKSELF(weakSelf)
  448. view.headTitleClick = ^(UILabel * _Nonnull label) {
  449. NSMutableArray *nameArray = [[NSMutableArray alloc]initWithCapacity:5];
  450. for (int i = 0; i < TheDataManager.homes.count; i++) {
  451. RDSHomeModel *model = TheDataManager.homes[i];
  452. [nameArray addObject:model.name];
  453. }
  454. if (nameArray.count == 0) {
  455. return;
  456. }
  457. [YBPopupMenu showRelyOnView:label titles:nameArray icons:nil menuWidth:130 otherSettings:^(YBPopupMenu *popupMenu) {
  458. popupMenu.delegate = self;
  459. popupMenu.animationManager.duration = 0.25;
  460. popupMenu.textColor = [UIColor colorWithHexString:@"#1F1F1F"];
  461. popupMenu.tag = 3;
  462. }];
  463. };
  464. view.locationClick = ^{
  465. YXAddressViewController *addressVc = [[YXAddressViewController alloc]init];
  466. addressVc.hidesBottomBarWhenPushed = YES;
  467. [weakSelf.navigationController pushViewController:addressVc animated:YES];
  468. addressVc.sureBtnClick = ^(NSString * _Nonnull province, NSString * _Nonnull city, NSString * _Nonnull area, NSString * _Nonnull address) {
  469. [weakSelf p_updateHomeInfoWithProvince:province city:city area:area address:address];
  470. };
  471. };
  472. view.addBtnClick = ^(UIButton *btn) {
  473. [weakSelf topRightAction:btn];
  474. };
  475. view.messageClick = ^(UIButton *btn) {
  476. YXMessageListViewController *msgVc = [[YXMessageListViewController alloc]init];
  477. msgVc.hidesBottomBarWhenPushed = YES;
  478. [weakSelf.navigationController pushViewController:msgVc animated:YES];
  479. };
  480. view.itemClick = ^(NSInteger tag) {
  481. if (tag < weakSelf.sceneArray.count) {
  482. YXHomeSceneModel *model = weakSelf.sceneArray[tag];
  483. [weakSelf p_changeScene:model.record_id];
  484. }
  485. };
  486. }
  487. }
  488. -(void)p_updateHomeInfoWithProvince:(NSString *)province city:(NSString *)city area:(NSString *)area address:(NSString *)address
  489. {
  490. RDS_WEAKSELF(weakSelf)
  491. [RDSDemoApiHelper rds_updateHomeInfoWithHomeId:TheDataManager.current_home_id name:TheDataManager.current_home_name province:province city:city district:area address:address rooms:nil success:^(id responseObject) {
  492. if ([responseObject[@"code"] intValue] == 0) {
  493. [weakSelf.collectionView reloadData];
  494. } else{
  495. [RDSHudShower showBottomToast:responseObject[@"message"]];
  496. }
  497. } failure:^(NSError *error) {
  498. }];
  499. }
  500. - (void)p_setupMenuView{
  501. if (self.menuView == nil) {
  502. self.menuView = [[UIView alloc]init];
  503. self.menuView.frame = CGRectMake(20, 0, SCREEN_WIDTH-40, 30);
  504. [self.headerView addSubview:self.menuView];
  505. UIButton *menuBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  506. menuBtn.frame = CGRectMake(self.menuView.frame.size.width - 25, 2.5, 25, 25);
  507. [menuBtn setImage:[UIImage imageNamed:@"home_menu"] forState:UIControlStateNormal];
  508. [menuBtn addTarget:self action:@selector(menuBtnAction:) forControlEvents:UIControlEventTouchUpInside];
  509. [self.menuView addSubview:menuBtn];
  510. UIScrollView *menuScrollView = [[UIScrollView alloc]init];
  511. menuScrollView.frame = CGRectMake(0, 0, self.menuView.frame.size.width - 40, self.menuView.frame.size.height);
  512. menuScrollView.showsVerticalScrollIndicator = NO;
  513. menuScrollView.showsHorizontalScrollIndicator = NO;
  514. [self.menuView addSubview:menuScrollView];
  515. self.menuScrollView = menuScrollView;
  516. }
  517. }
  518. -(void)menuBtnAction:(UIButton *)btn
  519. {
  520. NSArray *titleArray;
  521. if (self.cellStyle == RoomCellStyleDefault) {
  522. titleArray =
  523. @[@"列表显示", @"设备管理",@"房间管理"];
  524. }else{
  525. titleArray =
  526. @[@"宫格显示", @"设备管理",@"房间管理"];
  527. }
  528. [YBPopupMenu showRelyOnView:btn titles:titleArray icons:@[@"home_pop_list", @"home_pop_device",@"home_pop_room"] menuWidth:130 otherSettings:^(YBPopupMenu *popupMenu) {
  529. popupMenu.delegate = self;
  530. popupMenu.animationManager.duration = 0.25;
  531. popupMenu.textColor = [UIColor colorWithHexString:@"#1F1F1F"];
  532. popupMenu.tag = 2;
  533. }];
  534. }
  535. - (RDSAddRoomView *)addView{
  536. if(_addView == nil){
  537. _addView = [RDSAddRoomView rds_loadViewFromNib];
  538. _addView.hidden = YES;
  539. [self.collectionView addSubview:_addView];
  540. [_addView mas_makeConstraints:^(MASConstraintMaker *make) {
  541. make.left.equalTo(self.view);
  542. make.right.equalTo(self.view);
  543. make.height.equalTo(@380);
  544. make.top.equalTo(self.topView.mas_bottom).offset(40);
  545. }];
  546. RDS_WEAKSELF(weakSelf)
  547. _addView.onAddClick = ^{
  548. YXDeviceViewController *deviceVc = [[YXDeviceViewController alloc]init];
  549. deviceVc.hidesBottomBarWhenPushed = YES;
  550. [weakSelf pushViewController:deviceVc animated:YES];
  551. };
  552. }
  553. return _addView;
  554. }
  555. - (void)p_setupCollectionView {
  556. NSNumber *style = [[NSUserDefaults standardUserDefaults] objectForKey:@"kHomeCellStyle"];
  557. if (style) {
  558. self.cellStyle = [style intValue];
  559. }else{
  560. self.cellStyle = RoomCellStyleList;
  561. }
  562. if (self.collectionView == nil) {
  563. UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
  564. layout.minimumLineSpacing = 10;
  565. layout.sectionInset = UIEdgeInsetsMake(0, 15, 0, 15);
  566. layout.scrollDirection = UICollectionViewScrollDirectionVertical;
  567. layout.sectionHeadersPinToVisibleBounds = YES;
  568. UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
  569. collectionView.showsHorizontalScrollIndicator = NO;
  570. collectionView.showsVerticalScrollIndicator = NO;
  571. collectionView.backgroundColor = [UIColor colorWithHexString:@"#F2F5FA"];
  572. [collectionView registerClass:[RDSRoomCell class] forCellWithReuseIdentifier:RDSRoomCellID];
  573. collectionView.delegate = self;
  574. collectionView.dataSource = self;
  575. collectionView.pagingEnabled = NO;
  576. [self.view addSubview:collectionView];
  577. self.collectionView = collectionView;
  578. [collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
  579. make.left.equalTo(@0);
  580. make.right.equalTo(@0);
  581. make.bottom.equalTo(@0);
  582. make.top.equalTo(@0);
  583. }];
  584. collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  585. //注册行头
  586. [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header"];
  587. [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"Footer"];
  588. MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(p_getCurrentUserInfo)];
  589. header.automaticallyChangeAlpha = YES;
  590. header.lastUpdatedTimeLabel.hidden = YES;
  591. self.collectionView.mj_header = header;
  592. }
  593. }
  594. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
  595. {
  596. CGSize size = CGSizeZero;
  597. if (self.cellStyle == RoomCellStyleDefault) {
  598. CGFloat width = SCREEN_WIDTH / 2 - 20;
  599. size = CGSizeMake(width, 125);
  600. }else{
  601. size = CGSizeMake(self.view.bounds.size.width-30, 75);
  602. }
  603. return size;
  604. }
  605. #pragma mark - UICollectionViewDelegate
  606. - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
  607. NSDictionary *dic = self.dataArray[self.selectedIndex];
  608. NSArray *devicesArray = dic[@"devices"];
  609. YXHomeDeviceModel *model;
  610. if(devicesArray.count > indexPath.row){
  611. model = devicesArray[indexPath.row];
  612. RDSControlWebVC *webVc = [[RDSControlWebVC alloc]init];
  613. webVc.requestURL = model.detail_url;
  614. webVc.hidesBottomBarWhenPushed = YES;
  615. [self.navigationController pushViewController:webVc animated:YES];
  616. }
  617. }
  618. #pragma mark - UICollectionViewDataSource
  619. - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
  620. return 2;
  621. }
  622. - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
  623. if(section == 0){// 第一组用来做悬停顶部视图
  624. return 0;
  625. }
  626. if (self.dataArray.count > self.selectedIndex) {
  627. NSDictionary *dic = self.dataArray[self.selectedIndex];
  628. NSArray *devicesArray = dic[@"devices"];
  629. return devicesArray.count;
  630. }
  631. return 0;
  632. }
  633. - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
  634. {
  635. RDSRoomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:RDSRoomCellID forIndexPath:indexPath];
  636. cell.style = self.cellStyle;
  637. NSDictionary *dic = self.dataArray[self.selectedIndex];
  638. NSArray *devicesArray = dic[@"devices"];
  639. YXHomeDeviceModel *model;
  640. if(devicesArray.count > indexPath.row){
  641. model = devicesArray[indexPath.row];
  642. }
  643. cell.model = model;
  644. cell.onPowerClick = ^(BOOL onOff) {
  645. int state = 0;
  646. if ([model.power intValue] == 0) {
  647. state = 1;
  648. }
  649. // 开关
  650. if([model.is_master boolValue]){
  651. [RDSDemoApiHelper rds_setPower:state control_number:model.device_code sub_code:@"" success:^(id responseObject) {
  652. if ([responseObject[@"code"] intValue] == 0) {
  653. [RDSHudShower showBottomToast:@"操作成功"];
  654. [self p_getHomeDetail];
  655. }else{
  656. [RDSHudShower showBottomToast:responseObject[@"message"]];
  657. }
  658. } failure:^(NSError *error) {
  659. [RDSHudShower showBottomToast:@"连接服务器失败"];
  660. }];
  661. } else {
  662. [RDSDemoApiHelper rds_setPower:state control_number:model.device_code sub_code:model.sub_code success:^(id responseObject) {
  663. if ([responseObject[@"code"] intValue] == 0) {
  664. [RDSHudShower showBottomToast:@"操作成功"];
  665. }else{
  666. [RDSHudShower showBottomToast:responseObject[@"message"]];
  667. }
  668. } failure:^(NSError *error) {
  669. [RDSHudShower showBottomToast:@"连接服务器失败"];
  670. }];
  671. }
  672. };
  673. return cell;
  674. }
  675. // 不允许高亮
  676. - (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath{
  677. RDSRoomCell *cell = (RDSRoomCell*)[self.collectionView cellForItemAtIndexPath:indexPath];
  678. cell.highlighted = NO;
  679. }
  680. // 设置header尺寸
  681. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {
  682. if(section == 0){
  683. return CGSizeZero;
  684. }
  685. return CGSizeMake(SCREEN_WIDTH, 50);
  686. }
  687. // 设置footer尺寸
  688. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{
  689. if(section == 0){
  690. if (self.sceneArray.count == 0) {
  691. return CGSizeMake(SCREEN_WIDTH, 215);
  692. }
  693. return CGSizeMake(SCREEN_WIDTH, 260);
  694. }
  695. return CGSizeZero;
  696. }
  697. //sectionheader
  698. - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
  699. if (kind == UICollectionElementKindSectionFooter) {
  700. UICollectionReusableView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"Footer" forIndexPath:indexPath];
  701. footerView.backgroundColor = UIColor.clearColor;
  702. self.footerView = footerView;
  703. [self p_setupTopView];
  704. return footerView;
  705. }
  706. if (kind == UICollectionElementKindSectionHeader) {
  707. UICollectionReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header" forIndexPath:indexPath];
  708. self.headerView = headView;
  709. [self p_setupMenuView];
  710. return headView;
  711. }
  712. return nil;
  713. }
  714. #pragma mark - OPQRCodeViewControllerDelegate
  715. // 扫码返回字符串
  716. - (void)rdy_didFinishPickingMediaWithInfo:(NSString *)stringValue{
  717. DDLog(@"二维码:%@",stringValue);
  718. if(!kNULLString(stringValue)){
  719. }
  720. }
  721. - (void)dealloc{
  722. DDLog(@"dealloc~~");
  723. [kNotificationCenter removeObserver:self];
  724. }
  725. @end