单军华
2018-07-19 83b9d5c682b21d88133f24da0f94dd56bd79e687
screendisplay/Pods/HMEmoticon/????/Emoticon/HMEmoticonCell.m
New file
@@ -0,0 +1,169 @@
//
//  HMEmoticonCell.m
//  表情键盘
//
//  Created by 刘凡 on 16/3/3.
//  Copyright © 2016年 itcast. All rights reserved.
//
#import "HMEmoticonCell.h"
#import "HMEmoticon.h"
#import "UIImage+HMEmoticon.h"
#import "HMEmoticonTipView.h"
#import "HMEmoticonButton.h"
@implementation HMEmoticonCell {
    HMEmoticonTipView *_tipView;
    UILabel *_recentLabel;
    HMEmoticonButton *_deleteButton;
}
#pragma mark - 设置数据
- (void)setEmoticons:(NSArray<HMEmoticon *> *)emoticons {
    _emoticons = emoticons;
    for (UIView *v in self.contentView.subviews) {
        v.hidden = YES;
    }
    _deleteButton.hidden = NO;
    NSInteger index = 0;
    for (HMEmoticon *e in _emoticons) {
        HMEmoticonButton *btn = self.contentView.subviews[index++];
        btn.emoticon = e;
    }
}
- (void)setIndexPath:(NSIndexPath *)indexPath {
    _indexPath = indexPath;
    _recentLabel.hidden = indexPath.section != 0;
}
#pragma mark - 构造函数
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self prepareUI];
        // 添加手势监听
        UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]
                                                          initWithTarget:self
                                                          action:@selector(longPressed:)];
        longPressGesture.minimumPressDuration = 0.1;
        [self addGestureRecognizer:longPressGesture];
    }
    return self;
}
- (void)didMoveToWindow {
    [super didMoveToWindow];
    [self.window addSubview:_tipView];
    _tipView.hidden = YES;
}
#pragma mark - 监听方法
- (void)longPressed:(UILongPressGestureRecognizer *)recognizer {
    CGPoint location = [recognizer locationInView:self];
    // 查找选中按钮
    HMEmoticonButton *button = nil;
    for (HMEmoticonButton *btn in self.contentView.subviews) {
        if (CGRectContainsPoint(btn.frame, location) && !btn.hidden) {
            button = btn;
            break;
        }
    }
    if (button == nil) {
        _tipView.hidden = YES;
        return;
    }
    switch (recognizer.state) {
        case UIGestureRecognizerStateBegan:
        case UIGestureRecognizerStateChanged: {
            CGPoint buttonCenter = [self.contentView convertPoint:button.center toView:self.window];
            _tipView.center = buttonCenter;
            _tipView.emoticon = button.emoticon;
            _tipView.hidden = (button == _deleteButton);
        }
            break;
        case UIGestureRecognizerStateEnded:
            [self clickEmoticonButton:button];
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:
            _tipView.hidden = YES;
            break;
        default:
            break;
    }
}
- (void)clickEmoticonButton:(HMEmoticonButton *)button {
    [self.delegate emoticonCellDidSelectedEmoticon:button.emoticon isRemoved:button.isDeleteButton];
}
#pragma mark - 设置界面
- (void)prepareUI {
    NSInteger rowCount = 3;
    NSInteger colCount = 7;
    CGFloat leftMargin = 8;
    CGFloat bottomMargin = 20;
    CGFloat w = ceil((self.bounds.size.width - 2 * leftMargin) / colCount);
    CGFloat h = ceil((self.bounds.size.height - bottomMargin) / rowCount);
    for (NSInteger i = 0; i < 21; i++) {
        NSInteger col = i % colCount;
        NSInteger row = i / colCount;
        CGRect rect = CGRectMake(col * w + leftMargin, row * h, w, h);
        UIButton *button = [HMEmoticonButton emoticonButtonWithFrame:rect tag:i];
        [self.contentView addSubview:button];
        [button addTarget:self
                   action:@selector(clickEmoticonButton:)
         forControlEvents:UIControlEventTouchUpInside];
    }
    // 删除按钮
    _deleteButton = ((HMEmoticonButton *)self.contentView.subviews.lastObject);
    _deleteButton.deleteButton = YES;
    // 提示视图
    _tipView = [[HMEmoticonTipView alloc] init];
    _recentLabel = [[UILabel alloc] init];
    _recentLabel.text = @"最近使用的表情";
    _recentLabel.textColor = [UIColor lightGrayColor];
    _recentLabel.font = [UIFont systemFontOfSize:12];
    [self.contentView addSubview:_recentLabel];
    _recentLabel.translatesAutoresizingMaskIntoConstraints = false;
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:_recentLabel
                                                             attribute:NSLayoutAttributeCenterX
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:self.contentView
                                                             attribute:NSLayoutAttributeCenterX
                                                            multiplier:1
                                                              constant:0]];
    [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:_recentLabel
                                                             attribute:NSLayoutAttributeBottom
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:self.contentView
                                                             attribute:NSLayoutAttributeBottom
                                                            multiplier:1
                                                              constant:-5]];
}
@end