| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- //
- // TUIMoreView.m
- // UIKit
- //
- // Created by kennethmiao on 2018/9/21.
- // Copyright © 2018 Tencent. All rights reserved.
- //
- #import "TUIMoreView.h"
- #import <TIMCommon/TIMDefine.h>
- #import <TUICore/TUIThemeManager.h>
- #import "TUIInputMoreCell.h"
- @interface TUIMoreView () <UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
- @property(nonatomic, strong) NSArray *data;
- @property(nonatomic, strong) NSMutableDictionary *itemIndexs;
- @property(nonatomic, assign) NSInteger sectionCount;
- @property(nonatomic, assign) NSInteger itemsInSection;
- @property(nonatomic, assign) NSInteger rowCount;
- @end
- @implementation TUIMoreView
- - (id)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- [self setupViews];
- [self defaultLayout];
- }
- return self;
- }
- - (void)setupViews {
- self.backgroundColor = TUIChatDynamicColor(@"chat_input_controller_bg_color", @"#EBF0F6");
- _moreFlowLayout = [[TUICollectionRTLFitFlowLayout alloc] init];
- _moreFlowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
- _moreFlowLayout.minimumLineSpacing = 0;
- _moreFlowLayout.minimumInteritemSpacing = 0;
- _moreFlowLayout.sectionInset = UIEdgeInsetsMake(0, TMoreView_Section_Padding, 0, TMoreView_Section_Padding);
- _moreCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:_moreFlowLayout];
- [_moreCollectionView registerClass:[TUIInputMoreCell class] forCellWithReuseIdentifier:TMoreCell_ReuseId];
- _moreCollectionView.collectionViewLayout = _moreFlowLayout;
- _moreCollectionView.pagingEnabled = YES;
- _moreCollectionView.delegate = self;
- _moreCollectionView.dataSource = self;
- _moreCollectionView.showsHorizontalScrollIndicator = NO;
- _moreCollectionView.showsVerticalScrollIndicator = NO;
- _moreCollectionView.backgroundColor = self.backgroundColor;
- _moreCollectionView.alwaysBounceHorizontal = YES;
- [self addSubview:_moreCollectionView];
- _lineView = [[UIView alloc] init];
- _lineView.backgroundColor = TIMCommonDynamicColor(@"separator_color", @"#DBDBDB");
- [self addSubview:_lineView];
- _pageControl = [[UIPageControl alloc] init];
- _pageControl.currentPageIndicatorTintColor = TUIChatDynamicColor(@"chat_face_page_control_current_color", @"#7D7D7D");
- _pageControl.pageIndicatorTintColor = TUIChatDynamicColor(@"chat_face_page_control_color", @"#DEDEDE");
- [self addSubview:_pageControl];
- }
- - (void)defaultLayout {
- CGSize cellSize = [TUIInputMoreCell getSize];
- CGFloat collectionHeight = cellSize.height * _rowCount + TMoreView_Margin * (_rowCount - 1);
- _lineView.frame = CGRectMake(0, 0, self.frame.size.width, TLine_Heigh);
- _moreCollectionView.frame =
- CGRectMake(0, _lineView.frame.origin.y + _lineView.frame.size.height + TMoreView_Margin, self.frame.size.width, collectionHeight);
- if (_sectionCount > 1) {
- _pageControl.frame =
- CGRectMake(0, _moreCollectionView.frame.origin.y + _moreCollectionView.frame.size.height, self.frame.size.width, TMoreView_Page_Height);
- _pageControl.hidden = NO;
- } else {
- _pageControl.hidden = YES;
- }
- if (_rowCount > 1) {
- _moreFlowLayout.minimumInteritemSpacing = (_moreCollectionView.frame.size.height - cellSize.height * _rowCount) / (_rowCount - 1);
- }
- CGFloat margin = TMoreView_Section_Padding;
- CGFloat spacing = (_moreCollectionView.frame.size.width - cellSize.width * TMoreView_Column_Count - 2 * margin) / (TMoreView_Column_Count - 1);
- _moreFlowLayout.minimumLineSpacing = spacing;
- _moreFlowLayout.sectionInset = UIEdgeInsetsMake(0, margin, 0, margin);
- CGFloat height = _moreCollectionView.frame.origin.y + _moreCollectionView.frame.size.height + TMoreView_Margin;
- if (_sectionCount > 1) {
- height = _pageControl.frame.origin.y + _pageControl.frame.size.height;
- }
- CGRect frame = self.frame;
- frame.size.height = height;
- self.frame = frame;
- }
- - (void)setData:(NSArray *)data {
- _data = data;
- if (_data.count > TMoreView_Column_Count) {
- _rowCount = 2;
- } else {
- _rowCount = 1;
- }
- _itemsInSection = TMoreView_Column_Count * _rowCount;
- _sectionCount = ceil(_data.count * 1.0 / _itemsInSection);
- _pageControl.numberOfPages = _sectionCount;
- _itemIndexs = [NSMutableDictionary dictionary];
- for (NSInteger curSection = 0; curSection < _sectionCount; ++curSection) {
- for (NSInteger itemIndex = 0; itemIndex < _itemsInSection; ++itemIndex) {
- // transpose line/row
- NSInteger row = itemIndex % _rowCount;
- NSInteger column = itemIndex / _rowCount;
- NSInteger reIndex = TMoreView_Column_Count * row + column + curSection * _itemsInSection;
- [_itemIndexs setObject:@(reIndex) forKey:[NSIndexPath indexPathForRow:itemIndex inSection:curSection]];
- }
- }
- [_moreCollectionView reloadData];
- [self defaultLayout];
- }
- - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
- return _sectionCount;
- }
- - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
- return _itemsInSection;
- }
- - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
- TUIInputMoreCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:TMoreCell_ReuseId forIndexPath:indexPath];
- TUIInputMoreCellData *data;
- NSNumber *index = _itemIndexs[indexPath];
- if (index.integerValue >= _data.count) {
- data = nil;
- } else {
- data = _data[index.integerValue];
- }
- [cell fillWithData:data];
- return cell;
- }
- - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
- UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
- if (_delegate && [_delegate respondsToSelector:@selector(moreView:didSelectMoreCell:)]) {
- if ([cell isKindOfClass:[TUIInputMoreCell class]]) {
- [_delegate moreView:self didSelectMoreCell:(TUIInputMoreCell *)cell];
- ;
- }
- }
- }
- - (CGSize)collectionView:(UICollectionView *)collectionView
- layout:(UICollectionViewLayout *)collectionViewLayout
- sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
- return [TUIInputMoreCell getSize];
- }
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
- CGFloat contentOffset = scrollView.contentOffset.x;
- float page = contentOffset / scrollView.frame.size.width;
- if ((int)(page * 10) % 10 == 0) {
- _pageControl.currentPage = page;
- }
- }
- @end
|