项目中用到的UIScrollView与UICollectionView的联动,核心代码会标注出来
头文件
#import "BaseViewController.h"
@interface RoomViewController : UIViewController
@end
实现文件:
#import "RoomViewController.h"
#import "ScanQRCodeViewController.h"
#import "XmyyInterfaceManager.h"
#import "OpenHABWidget.h"
#import "ManageRoomsViewController.h"
#import "VoiceView.h"
#import "HelpViewController.h"
#import "OpenHABVoiceControlManager.h"
#import
#import
#import "Masonry.h"
#import "OpenHABRoomSelectView.h"
#import "OpenHABMainRoomService.h"
#import "RoomAreaCollectionViewCell.h"
#import "OpenHABMainRoomService.h"
@interface RoomViewController ()
{
NSInteger currentIndex;
}
@property (nonatomic,strong) UIView *buttonAnimationView;
@property (nonatomic,strong) NSMutableArray *roomList;
@property (nonatomic,strong) NSMutableArray *floorWidgetList;
// 楼层信息
@property (strong, nonatomic) UIScrollView *floorScrollView;
@property (strong, nonatomic) UICollectionView *collectionView;
@property (weak, nonatomic) IBOutlet UIButton *micBtn;
@property (nonatomic,assign) BOOL isScrollLabel;
#pragma mark - 新增
@property (nonatomic, strong) OpenHABMainRoomService *mainRoomService;
// 楼层数组
@property (nonatomic, strong) NSArray *floorArrs;
@end
@implementation RoomViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpUI];
}
#pragma mark - dataSource
- (NSArray *)floorArrs
{
return _floorArrs = [self.mainRoomService getAllFloorArrs];
}
-(OpenHABMainRoomService *)mainRoomService
{
if (!_mainRoomService)
{
_mainRoomService = [OpenHABMainRoomService sharedOpenHABMainRoomService];
}
return _mainRoomService;
}
#pragma mark UI
- (void)setUpUI
{
[self.view addSubview:self.floorScrollView];
[self.view addSubview:self.collectionView];
[self layOutScrollView];
[self addSelectViews];
}
#pragma mark - 初始化ScrollView
-(UICollectionView *)collectionView
{
if (!_collectionView)
{
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.headerReferenceSize = CGSizeMake(self.view.frame.size.width, 1.0f);
layout.itemSize = CGSizeMake(roomIconSize.width ,roomIconSize.height);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
layout.minimumLineSpacing = 10 * 2;
layout.sectionInset = UIEdgeInsetsMake(10.0f, 10.0f, 10.0f, 10.0f);
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 25.0f, self.view.frame.size.width, self.view.frame.size.height - 64.0f - 44.0f) collectionViewLayout:layout];
_collectionView.delegate = self;
_collectionView.dataSource = self;
_collectionView.backgroundColor = [UIColor clearColor];
[_collectionView registerClass:[RoomAreaCollectionViewCell class]
forCellWithReuseIdentifier:RoomAreaIdentify];
[_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UID"];
}
return _collectionView;
}
- (UIScrollView *)floorScrollView
{
if (!_floorScrollView)
{
_floorScrollView = [[UIScrollView alloc] init];
_floorScrollView.contentSize = CGSizeMake(kScreenWidth * 0.25f * [self.mainRoomService getAllFloorArrs].count, 44.0f);
_floorScrollView.showsHorizontalScrollIndicator = NO;
}
return _floorScrollView;
}
- (void)layOutScrollView
{
[self.floorScrollView makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view.mas_top).offset(64.0f);
make.left.equalTo(self.view.mas_left);
make.size.mas_equalTo(CGSizeMake(kScreenWidth, 44.0f));
}];
[self.collectionView makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.floorScrollView.mas_bottom);
make.left.equalTo(self.view.mas_left);
make.size.mas_equalTo(CGSizeMake(self.view.frame.size.width, self.view.frame.size.height - 64.0f - 44.0f - 40.0f));
}];
}
- (void)addSelectViews
{
// 当前的所在的选项卡
currentIndex = 0;
self.isScrollLabel = YES;
OpenHABMainRoomService *indexRoomService = [OpenHABMainRoomService sharedOpenHABMainRoomService];
NSArray *floorArr = [indexRoomService getAllFloorArrs];
if (floorArr.count != 0)
{
for (int i = 0; i < floorArr.count; i++)
{
OpenHABRoomSelectView *selectTabView = [[OpenHABRoomSelectView alloc] initWithFrame:CGRectMake(kScreenWidth/4.0f * i, 0, kScreenWidth/4.0f, 44.0f)];
if (i == 0)
{
selectTabView.underLineView.backgroundColor = [UIColor colorWithHexString:@"#696BFF"];
}
OpenHABWidget *floorObj = floorArr[i];
[selectTabView.selectBtn setTitle:floorObj.label
forState:UIControlStateNormal];
selectTabView.selectBtn.tag = i;
[selectTabView.selectBtn addTarget:self
action:@selector(floorBtnClick:)
forControlEvents:UIControlEventTouchUpInside];
[self.floorScrollView addSubview:selectTabView];
}
}
}
#pragma mark - CollectionView的代理
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return self.floorArrs.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [self.mainRoomService getRoomsByFloor:section].count;
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
RoomAreaCollectionViewCell *cell = [_collectionView dequeueReusableCellWithReuseIdentifier:RoomAreaIdentify
forIndexPath:indexPath];
OpenHABWidget *detail = [self.mainRoomService getRoomInfoByFloor:indexPath.section roomIndex:indexPath.row];
cell.roomIcon.image = [UIImage imageNamed:@"ic_dining_room"];
cell.roomLable.text = detail.label;
return cell;
}
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
UICollectionReusableView* reusableView;
if (kind == UICollectionElementKindSectionHeader) {
reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UID" forIndexPath:indexPath];
}
UIView *bgView = [[UIView alloc] init];
bgView.backgroundColor = [UIColor colorWithHexString:@"#EEEEEE"];
[reusableView addSubview:bgView];
[bgView makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(reusableView.mas_left).offset(24.0f);
make.right.equalTo(reusableView.mas_right).offset(-24.0f);
make.size.mas_equalTo(CGSizeMake(self.view.frame.size.width - 48.0f, 1.0f));
}];
reusableView.backgroundColor=[UIColor clearColor];
return reusableView;
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
#pragma mark - floorBtnAction 点击标签滑动collectionview和collectionview滑动标签随动
// 正向定位,通过点击的区域确定需要滚动到的位置
- (void)floorBtnClick:(UIButton *)btn
{
// 选中点击的按钮
for (UIView *view in self.floorScrollView.subviews) {
if ([view isKindOfClass:[OpenHABRoomSelectView class]])
{
OpenHABRoomSelectView *selectTabView = (OpenHABRoomSelectView *)view;
if (btn.tag != selectTabView.selectBtn.tag)
{
selectTabView.underLineView.backgroundColor = [UIColor clearColor];
}
else
{
selectTabView.underLineView.backgroundColor = [UIColor colorWithHexString:@"#696BFF"];
}
}
}
NSLog(@"btn.tag===>%ld",(long)btn.tag);
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:btn.tag];
[self.collectionView scrollToItemAtIndexPath:indexPath
atScrollPosition:UICollectionViewScrollPositionTop
animated:YES];
}
// 通过滚动定位滑块的位置(核心代码,反向定位)
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == self.collectionView) {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
if (currentIndex == visibleIndexPath.section ||visibleIndexPath == nil)
{
return;
}
currentIndex = visibleIndexPath.section;
if (self.isScrollLabel)
{
for (id tempView in self.floorScrollView.subviews) {
if ([tempView isKindOfClass:[OpenHABRoomSelectView class]]) {
OpenHABRoomSelectView *tempRoomView = (OpenHABRoomSelectView *)tempView;
if (currentIndex != tempRoomView.selectBtn.tag)
{
tempRoomView.underLineView.backgroundColor = [UIColor clearColor];
}
else
{
tempRoomView.underLineView.backgroundColor = [UIColor colorWithHexString:@"#696BFF"];
}
}
}
}
}
}
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
self.isScrollLabel = YES;
}
#pragma mark - lazy
-(NSMutableArray *)roomList{
if (!_roomList) {
_roomList = [NSMutableArray array];
}
return _roomList;
}
-(UIView *)buttonAnimationView{
if (!_buttonAnimationView) {
_buttonAnimationView = [[UIView alloc]init];
_buttonAnimationView.backgroundColor = [UIColor colorWithWholeRed:54 green:166 blue:255];
_buttonAnimationView.pmHeight = 3;
_buttonAnimationView.layer.masksToBounds = YES;
_buttonAnimationView.layer.cornerRadius = 1.5f;
}
return _buttonAnimationView;
}
#pragma mark -
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end