| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- //
- // TUIFaceVerticalView.m
- // TUIChat
- //
- // Created by wyl on 2023/11/16.
- // Copyright © 2023 Tencent. All rights reserved.
- //
- #import "TUIFaceVerticalView.h"
- @interface TUIFaceVerticalView () <UICollectionViewDelegate,
- UICollectionViewDataSource,
- UICollectionViewDelegateFlowLayout,
- UIPopoverPresentationControllerDelegate>
- @property(nonatomic, strong) NSMutableArray *sectionIndexInGroup;
- @property(nonatomic, strong) NSMutableArray *groupIndexInSection;
- @property(nonatomic, strong) NSMutableDictionary *itemIndexs;
- @property(nonatomic, assign) NSInteger sectionCount;
- @property(nonatomic, assign) NSInteger curGroupIndex;
- @property(nonatomic, strong) UIView *floatCtrlView;
- @property(nonatomic, strong) UIButton *sendButton;
- @property(nonatomic, strong) UIButton *deleteButton;
- //preview
- @property (nonatomic, strong) UIImageView *dispalyView;
- @property (nonatomic, strong) UIImageView *dispalyImage;
- @property (nonatomic, assign) BOOL hasPreViewShow;
- @end
- @implementation TUIFaceVerticalView
- - (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");
- _faceFlowLayout = [[TUICollectionRTLFitFlowLayout alloc] init];
- _faceFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
- _faceFlowLayout.minimumLineSpacing = TFaceView_Margin;
- _faceFlowLayout.minimumInteritemSpacing = TFaceView_Margin;
- _faceFlowLayout.sectionInset = UIEdgeInsetsMake(0, TFaceView_Page_Padding, 0, TFaceView_Page_Padding);
- _faceCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:_faceFlowLayout];
- [_faceCollectionView registerClass:[TUIFaceCell class] forCellWithReuseIdentifier:TFaceCell_ReuseId];
- [_faceCollectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerView"];
- _faceCollectionView.collectionViewLayout = _faceFlowLayout;
- _faceCollectionView.pagingEnabled = NO;
- _faceCollectionView.delegate = self;
- _faceCollectionView.dataSource = self;
- _faceCollectionView.showsHorizontalScrollIndicator = NO;
- _faceCollectionView.showsVerticalScrollIndicator = NO;
- _faceCollectionView.backgroundColor = self.backgroundColor;
- _faceCollectionView.alwaysBounceVertical = YES;
- [self addSubview:_faceCollectionView];
- _lineView = [[UIView alloc] init];
- _lineView.backgroundColor = TIMCommonDynamicColor(@"separator_color", @"#DBDBDB");
- [self addSubview:_lineView];
- [self setupfloatCtrlView];
- }
- - (void)setupfloatCtrlView {
- _floatCtrlView = [[UIView alloc] init];
- [self addSubview:_floatCtrlView];
- _sendButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [self.sendButton setTitle:TIMCommonLocalizableString(Send)forState:UIControlStateNormal];
- _sendButton.titleLabel.font = [UIFont systemFontOfSize:16];
- [self.sendButton addTarget:self action:@selector(didSelectSendButton:) forControlEvents:UIControlEventTouchUpInside];
- self.sendButton.backgroundColor = TIMCommonDynamicColor(@"", @"#0069F6");
- self.sendButton.layer.cornerRadius = 2;
- [_floatCtrlView addSubview:self.sendButton];
- _deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [_deleteButton setImage:[UIImage imageWithContentsOfFile:TUIChatFaceImagePath(@"del_normal")] forState:UIControlStateNormal];
- [_deleteButton setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
- _deleteButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
- _deleteButton.layer.cornerRadius = 2;
- [_deleteButton addTarget:self action:@selector(didSelectDeleteButton:) forControlEvents:UIControlEventTouchUpInside];
- _deleteButton.backgroundColor = [UIColor whiteColor];
- [_floatCtrlView addSubview:_deleteButton];
- }
- - (void)layoutSubviews {
- [super layoutSubviews];
- [self defaultLayout];
- }
- - (void)defaultLayout {
- _lineView.frame = CGRectMake(0, 0, self.frame.size.width, TLine_Heigh);
- [_faceCollectionView mas_remakeConstraints:^(MASConstraintMaker *make) {
- make.edges.mas_equalTo(self);
- }];
-
- [_floatCtrlView mas_remakeConstraints:^(MASConstraintMaker *make) {
- make.trailing.mas_equalTo(self.mas_trailing).mas_offset(-16);
- make.bottom.mas_equalTo(self.mas_bottom).mas_offset(20);
- make.height.mas_equalTo(88);
- make.leading.mas_equalTo(self.deleteButton.mas_leading);
- }];
-
- [self.sendButton mas_remakeConstraints:^(MASConstraintMaker *make) {
- make.trailing.mas_equalTo(self.floatCtrlView.mas_trailing);
- make.top.mas_equalTo(self.floatCtrlView);
- make.height.mas_equalTo(30);
- make.width.mas_equalTo(50);
- }];
- [self.deleteButton mas_remakeConstraints:^(MASConstraintMaker *make) {
- make.trailing.mas_equalTo(self.sendButton.mas_leading).mas_offset(-10);
- make.top.mas_equalTo(self.floatCtrlView);
- make.height.mas_equalTo(30);
- make.width.mas_equalTo(50);
- }];
- }
- - (void)setData:(NSMutableArray *)data {
- _faceGroups = data;
- [self defaultLayout];
- _sectionIndexInGroup = [NSMutableArray array];
- _groupIndexInSection = [NSMutableArray array];
- _itemIndexs = [NSMutableDictionary dictionary];
- NSInteger sectionIndex = 0;
- for (NSInteger groupIndex = 0; groupIndex < _faceGroups.count; ++groupIndex) {
- TUIFaceGroup *group = _faceGroups[groupIndex];
- [_sectionIndexInGroup addObject:@(sectionIndex)];
- int itemCount = group.faces.count;
- int sectionCount = ceil(group.faces.count * 1.0 / itemCount);
- for (int sectionIndex = 0; sectionIndex < sectionCount; ++sectionIndex) {
- [_groupIndexInSection addObject:@(groupIndex)];
- }
- sectionIndex += sectionCount;
- }
- _sectionCount = sectionIndex;
- for (NSInteger curSection = 0; curSection < _sectionCount; ++curSection) {
- NSNumber *groupIndex = _groupIndexInSection[curSection];
- NSNumber *groupSectionIndex = _sectionIndexInGroup[groupIndex.integerValue];
- TUIFaceGroup *face = _faceGroups[groupIndex.integerValue];
- NSInteger itemCount = face.faces.count;
- NSInteger groupSection = curSection - groupSectionIndex.integerValue;
- for (NSInteger itemIndex = 0; itemIndex < itemCount; ++itemIndex) {
- // transpose line/row
- NSInteger reIndex = itemIndex;
- [_itemIndexs setObject:@(reIndex) forKey:[NSIndexPath indexPathForRow:itemIndex inSection:curSection]];
- }
- }
- _curGroupIndex = 0;
- [_faceCollectionView reloadData];
-
- TUIFaceGroup *group = _faceGroups[0];
- if (!group.isNeedAddInInputBar) {
- _floatCtrlView.hidden = YES;
- }
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self adjustEmotionsAlpha];
- });
- }
- - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
- return _sectionCount;
- }
- - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
- int groupIndex = [_groupIndexInSection[section] intValue];
- TUIFaceGroup *group = _faceGroups[groupIndex];
- return group.faces.count;
- }
- - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
- TUIFaceCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:TFaceCell_ReuseId forIndexPath:indexPath];
- __weak typeof(self) weakSelf = self;
- __weak typeof(cell) weakCell = cell;
- cell.longPressCallback = ^(UILongPressGestureRecognizer * _Nonnull recognizer) {
- if (weakSelf.hasPreViewShow) {
- return;
- }
- [self showDisplayView:0 display_y:0 targetView:[UIApplication sharedApplication].keyWindow.rootViewController.view faceCell:weakCell];
- };
- int groupIndex = [_groupIndexInSection[indexPath.section] intValue];
- TUIFaceGroup *group = _faceGroups[groupIndex];
- int itemCount = group.faces.count;
- NSNumber *index = [_itemIndexs objectForKey:indexPath];
- if (index.integerValue < group.faces.count) {
- TUIFaceCellData *data = group.faces[index.integerValue];
- [cell setData:data];
- } else {
- [cell setData:nil];
- }
- return cell;
- }
- - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
- int groupIndex = [_groupIndexInSection[indexPath.section] intValue];
- TUIFaceGroup *faces = _faceGroups[groupIndex];
- NSNumber *index = [_itemIndexs objectForKey:indexPath];
- if (index.integerValue < faces.faces.count) {
- if (_delegate && [_delegate respondsToSelector:@selector(faceView:didSelectItemAtIndexPath:)]) {
- NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index.integerValue inSection:groupIndex];
- [_delegate faceView:self didSelectItemAtIndexPath:indexPath];
- }
- } else {
- }
- }
- - (CGSize)collectionView:(UICollectionView *)collectionView
- layout:(UICollectionViewLayout *)collectionViewLayout
- sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
- int groupIndex = [_groupIndexInSection[indexPath.section] intValue];
- TUIFaceGroup *group = _faceGroups[groupIndex];
- CGFloat width = (self.frame.size.width - TFaceView_Page_Padding * 2 - TFaceView_Margin * (group.itemCountPerRow - 1)) / group.itemCountPerRow;
- CGFloat height = width + TFaceView_Margin;
- return CGSizeMake(width, height);
- }
- - (CGSize)collectionView:(UICollectionView *)collectionView
- layout:(UICollectionViewLayout *)collectionViewLayout
- referenceSizeForHeaderInSection:(NSInteger)section {
- TUIFaceGroup *group = _faceGroups[section];
- if (group.groupName.length > 0) {
- return CGSizeMake(self.frame.size.width, 20);
- }
- else {
- return CGSizeMake(self.frame.size.width, 0);
- }
- }
- - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
- viewForSupplementaryElementOfKind:(NSString *)kind
- atIndexPath:(NSIndexPath *)indexPath {
- UICollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
- withReuseIdentifier:@"headerView"
- forIndexPath:indexPath];
-
- for (UIView *view in headerView.subviews) {
- if (view) {
- [view removeFromSuperview];
- }
- }
- UILabel *view = [[UILabel alloc]initWithFrame:CGRectMake(TFaceView_Page_Padding, 0, self.frame.size.width, 17)];
- view.font = [UIFont systemFontOfSize:12];
- view.textColor = TIMCommonDynamicColor(@"", @"#444444");
- [headerView addSubview:view];
- TUIFaceGroup *group = _faceGroups[indexPath.section];
- if (group.groupName.length > 0 ){
- view.text = group.groupName;
- }
- return headerView;
- }
- - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
- NSInteger curSection = round(scrollView.contentOffset.x / scrollView.frame.size.width);
- if (curSection >= _groupIndexInSection.count) {
- return;
- }
- NSNumber *groupIndex = _groupIndexInSection[curSection];
- NSNumber *startSection = _sectionIndexInGroup[groupIndex.integerValue];
- if (_curGroupIndex != groupIndex.integerValue) {
- _curGroupIndex = groupIndex.integerValue;
- if (_delegate && [_delegate respondsToSelector:@selector(faceView:scrollToFaceGroupIndex:)]) {
- [_delegate faceView:self scrollToFaceGroupIndex:_curGroupIndex];
- }
- }
-
- if (scrollView == self.faceCollectionView) {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self adjustEmotionsAlpha];
- });
- }
- }
- - (void)scrollToFaceGroupIndex:(NSInteger)index {
- if (index > _sectionIndexInGroup.count) {
- return;
- }
- NSNumber *start = _sectionIndexInGroup[index];
- NSInteger curSection = ceil(_faceCollectionView.contentOffset.x / _faceCollectionView.frame.size.width);
- if (curSection > start.integerValue && curSection < start.integerValue ) {
- return;
- }
- CGRect rect =
- CGRectMake(start.integerValue * _faceCollectionView.frame.size.width, 0, _faceCollectionView.frame.size.width, _faceCollectionView.frame.size.height);
- [_faceCollectionView scrollRectToVisible:rect animated:NO];
- [self scrollViewDidScroll:_faceCollectionView];
- }
- #pragma mark - floatCtrlView
- - (void)adjustEmotionsAlpha {
- if (self.floatCtrlView.isHidden) {
- return;
- }
- CGRect buttonGruopRect = self.floatCtrlView.frame;
- CGRect floatingRect = [self.faceCollectionView convertRect:buttonGruopRect fromView:self];
- for (UICollectionViewCell *visibleCell in self.faceCollectionView.visibleCells) {
- CGRect cellInCollection = [self.faceCollectionView convertRect:visibleCell.frame toView:self.faceCollectionView];
- BOOL ischongdie = CGRectIntersectsRect(floatingRect,cellInCollection);
- if(ischongdie){
- CGPoint emojiCenterPoint = CGPointMake(CGRectGetMidX(cellInCollection), CGRectGetMidY(cellInCollection));
- BOOL containsHalf = CGRectContainsPoint(floatingRect,emojiCenterPoint);
- if (containsHalf) {
- visibleCell.alpha = 0;
- } else {
- visibleCell.alpha = 0.5;
- }
- }
- else {
- visibleCell.alpha = 1;
- }
- }
- }
- - (void)setFloatCtrlViewAllowSendSwitch:(BOOL)isAllow {
- if (isAllow) {
- self.deleteButton.enabled = YES;
- self.sendButton.enabled = YES;
- self.deleteButton.alpha = 1;
- self.sendButton.alpha = 1;
- }
- else {
- self.deleteButton.enabled = NO;
- self.sendButton.enabled = NO;
- self.deleteButton.alpha = 0.5;
- self.sendButton.alpha = 0.5;
- }
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self adjustEmotionsAlpha];
- });
-
- }
- - (void)didSelectSendButton:(id)btn {
- if (_delegate && [_delegate respondsToSelector:@selector(faceViewClickSendMessageBtn)]) {
- [_delegate faceViewClickSendMessageBtn];
- }
- }
- - (void)didSelectDeleteButton:(id)btn {
- if (_delegate && [_delegate respondsToSelector:@selector(faceViewDidBackDelete:)]) {
- [_delegate faceViewDidBackDelete:(id)self];
- }
- }
- - (void)showDisplayView:(CGFloat)display_x
- display_y:(CGFloat)display_y
- targetView:(UIView *)targetView
- faceCell: (TUIFaceCell *)faceCell{
-
- self.hasPreViewShow = YES;
- UIViewController *contentViewController = [[UIViewController alloc] init];
- [contentViewController.view addSubview:self.dispalyView];
- self.dispalyImage.image = (faceCell.gifImage?:faceCell.face.image);
- CGFloat dispalyImagex = 5;
- CGFloat dispalyImagey = 5;
- CGFloat dispalyImagew = MIN(faceCell.face.image.size.width, 150) ;
- CGFloat dispalyImagewh = MIN(faceCell.face.image.size.height, 150);
- self.dispalyView.frame = CGRectMake(display_x, display_y, dispalyImagew + 10, dispalyImagewh + 10);
- _dispalyImage.frame = CGRectMake(dispalyImagex, dispalyImagey, dispalyImagewh, dispalyImagewh);
- contentViewController.view.backgroundColor = [UIColor clearColor
- ];
- contentViewController.preferredContentSize = CGSizeMake(self.dispalyView.frame.size.width, self.dispalyView.frame.size.height);
- contentViewController.modalPresentationStyle = UIModalPresentationPopover;
- UIPopoverPresentationController *popoverController = contentViewController.popoverPresentationController;
-
- popoverController.sourceView = self;
- popoverController.sourceRect = CGRectMake(0, -10, self.frame.size.width, 0);
- popoverController.permittedArrowDirections = UIPopoverArrowDirectionDown;
- popoverController.delegate = self;
- popoverController.canOverlapSourceViewRect = NO;
- [self.mm_viewController presentViewController:contentViewController animated:YES completion:nil];
- popoverController.backgroundColor = [UIColor whiteColor];
- }
- - (UIImageView *)dispalyView {
- if (!_dispalyView) {
- _dispalyView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
- _dispalyView.contentMode = UIViewContentModeScaleToFill;
- _dispalyView.backgroundColor = [UIColor whiteColor];
- [_dispalyView addSubview:self.dispalyImage];
- }
- return _dispalyView;
-
- }
- - (UIImageView *)dispalyImage {
- if (!_dispalyImage) {
- _dispalyImage = [[UIImageView alloc] init];
- }
- return _dispalyImage;
- }
- #pragma mark - UIPopoverPresentationControllerDelegate
- - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController {
- self.hasPreViewShow = NO;
- }
- - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
- return UIModalPresentationNone;
- }
- @end
|