|
//
// emojiView.m
// ThePaperBase
//
// Created by scar1900 on 15/12/1.
// Copyright © 2015年 scar1900. All rights reserved.
//
#import "emojiView.h"
#import "ATPagingView.h"
#import "StyledPageControl.h"
#import "DXPopover.h"
#define Sad_Expression @"悲伤"
#define Haha_Expression @"哈哈"
#define Candle_Expression @"蜡烛"
#define Angry_Expression @"怒"
#define BadLuck_Expression @"衰"
#define Despising_Expression @"挖鼻"
#define Smile_Expression @"微笑"
#define Surrounding_Expression @"围观"
#define Heart_Expression @"心"
#define Question_Expression @"疑问"
#define Praise_Expression @"赞"
#define emojiHeight 433/2
@interface emojiPopOverView : UIView
@property(nonatomic, strong)UIImageView *imageView;
@property(nonatomic, strong)UILabel *textLabel;
@end
@implementation emojiPopOverView
- (instancetype)initWithFrame:(CGRect)frame withEmojiString:(NSString*)string{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
[self addSubview:self.imageView];
[self addSubview:self.textLabel];
self.imageView.image = Image([NSString stringWithFormat:@"face/%@_50.png",string]);
self.textLabel.text = string;
[self.imageView makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.left);
make.right.equalTo(self.right);
make.top.equalTo(self.top).offset(5);
make.height.equalTo(@45);
}];
[self.textLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.left);
make.right.equalTo(self.right);
make.top.equalTo(self.imageView.bottom).offset(2);
make.height.equalTo(@15);
}];
}
return self;
}
- (UIImageView*)imageView {
if (!_imageView) {
_imageView = [UIImageView new];
}
return _imageView;
}
- (UILabel*)textLabel {
if (!_textLabel) {
_textLabel = [UILabel new];
_textLabel.textAlignment = NSTextAlignmentCenter;
_textLabel.textColor = [UIColor colorWithHexString:TextBlack];
_textLabel.backgroundColor = [UIColor clearColor];
_textLabel.font = appFont(TEXT_SIX_LEVELSIZE, NO);
}
return _textLabel;
}
@end
@protocol emojiImageViewDelegate <NSObject>
- (void)selectEmojiString:(NSString*)emojiString;
@end
@interface emojiImageView : UIView
@property(nonatomic, assign)CGFloat imagePadding;
@property(nonatomic, assign)CGFloat imageWidth;
@property(nonatomic, strong)UIImageView *imageView;
@property(nonatomic, strong)NSString *emojiString;
@property(nonatomic, weak)id<emojiImageViewDelegate> delegate;
@end
@implementation emojiImageView
- (instancetype)initWithFrame:(CGRect)frame
padding:(CGFloat)padding
width:(CGFloat)width
imageString:(NSString*)imageName{
self = [super initWithFrame:frame];
if (self) {
self.imagePadding = padding;
self.imageWidth = width;
self.emojiString = imageName;
self.backgroundColor = [UIColor clearColor];
[self addSubview:self.imageView];
self.imageView.image = Image([NSString stringWithFormat:@"face/%@_50.png",imageName]);
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
[self addGestureRecognizer:tap];
}
return self;
}
- (UIImageView*)imageView {
if (!_imageView) {
_imageView = [[UIImageView alloc]initWithFrame:CGRectZero];
_imageView.userInteractionEnabled = YES;
}
return _imageView;
}
- (void)layoutSubviews {
[self.imageView makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.left).offset(self.imagePadding);
make.right.equalTo(self.right);
make.top.equalTo(self.top).offset(self.imagePadding);
make.bottom.equalTo(self.bottom);
}];
[super layoutSubviews];
}
- (void)tap:(UITapGestureRecognizer*)gesture {
if ([self.delegate respondsToSelector:@selector(selectEmojiString:)]) {
[self.delegate selectEmojiString:self.emojiString];
}
}
- (void)longPress:(UILongPressGestureRecognizer*)gesture {
TPLOG(@"%@",self.emojiString);
}
@end
@protocol emojiSelectViewDelegate <NSObject>
- (void)emojiSelectViewReturnString:(NSString*)emojiString;
@end
@interface emojiSelectView : UIView<emojiImageViewDelegate,UIGestureRecognizerDelegate>
@property(nonatomic, strong)NSArray *sourceArray;
@property(nonatomic, strong)NSMutableArray *imageList;
@property(nonatomic, assign)NSInteger oneRowNum;
@property(nonatomic, assign)CGFloat emojiWidh;
@property(nonatomic, assign)CGFloat emojiPadding;
@property(nonatomic, assign)CGFloat onePageNum;
@property(nonatomic, weak)id<emojiSelectViewDelegate> delegate;
@property(nonatomic, strong)DXPopover *popover;
@end
@implementation emojiSelectView
@synthesize imageList;
- (instancetype)initWithFrame:(CGRect)frame withSouceList:(NSArray *)array{
self = [super initWithFrame:frame];
if (self) {
self.sourceArray = array;
self.imageList = [NSMutableArray array];
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
[self addGestureRecognizer:longPress];
// UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
// pan.maximumNumberOfTouches = 1;
// pan.delegate = self;
// [self addGestureRecognizer:pan];
}
return self;
}
- (void)buildImageList {
[self.sourceArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"delete"]) {
UIButton *deleteBtn = [UIButton buttonWithType:UIButtonTypeCustom];
deleteBtn.backgroundColor = [UIColor clearColor];
[deleteBtn setImage:Image(@"face/emojiDeleteBtn.png") forState:UIControlStateNormal];
[self.imageList addObject:deleteBtn];
[self addSubview:deleteBtn];
[deleteBtn addTarget:self action:@selector(deleteEvent:) forControlEvents:UIControlEventTouchUpInside];
}else {
emojiImageView *imageView = [[emojiImageView alloc]initWithFrame:CGRectZero
padding:self.emojiPadding
width:self.emojiWidh
imageString:obj];
imageView.delegate = self;
[self.imageList addObject:imageView];
[self addSubview:imageView];
}
}];
}
- (void)layoutEmojiSubviews {
[self.imageList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSInteger rowNum = idx/self.oneRowNum;
NSInteger colNum = idx%self.oneRowNum;
emojiImageView *lastImageView = nil;
if (idx != 0) {
lastImageView = self.imageList[idx-1];
}
if ([obj isKindOfClass:[emojiImageView class]]) {
emojiImageView *imageView = (emojiImageView*)obj;
if (colNum != 0) {
[imageView makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(lastImageView.right);
make.top.equalTo(self.top).offset((self.emojiPadding+self.emojiWidh)*rowNum);
make.size.mas_equalTo(CGSizeMake(self.emojiPadding+self.emojiWidh, self.emojiPadding+self.emojiWidh));
}];
}else {
[imageView makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.left);
make.top.equalTo(self.top).offset((self.emojiPadding+self.emojiWidh)*rowNum);
make.size.mas_equalTo(CGSizeMake(self.emojiPadding+self.emojiWidh, self.emojiPadding+self.emojiWidh));
}];
}
}else {
UIButton* deleteBtn = (UIButton*)obj;
if (lastImageView) {
[deleteBtn makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.right);
make.top.equalTo(self.top).offset((self.emojiPadding+self.emojiWidh)*rowNum);
make.size.mas_equalTo(CGSizeMake(self.emojiPadding+self.emojiWidh, self.emojiPadding+self.emojiWidh));
}];
[deleteBtn setImageEdgeInsets:UIEdgeInsetsMake((self.emojiPadding+self.emojiWidh)/2-25/2+10,
(self.emojiPadding+self.emojiWidh)/2-21-self.emojiPadding/2,
(self.emojiPadding+self.emojiWidh)/2-25/2-10,
(self.emojiPadding+self.emojiWidh)/2-21+self.emojiPadding/2)];
}else {
deleteBtn.hidden = YES;
}
}
}];
}
- (void)selectEmojiString:(NSString *)emojiString {
if ([self.delegate respondsToSelector:@selector(emojiSelectViewReturnString:)]) {
[self.delegate emojiSelectViewReturnString:emojiString];
}
}
- (void)deleteEvent:(UIButton*)btn {
if ([self.delegate respondsToSelector:@selector(emojiSelectViewReturnString:)]) {
[self.delegate emojiSelectViewReturnString:@"delete"];
}
}
- (void)longPress:(UILongPressGestureRecognizer*)gesture {
// CGPoint absolutePoint = [gesture locationInView:self];
CGFloat imageWidth = self.emojiPadding+self.emojiWidh;
__block CGPoint touchPoint;
__block emojiImageView *imageView = nil;
[self.imageList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
touchPoint = [gesture locationInView:obj];
if ([obj isKindOfClass:[emojiImageView class]]) {
if (touchPoint.x >= 0 && touchPoint.y <= imageWidth && touchPoint.x <= imageWidth && touchPoint.y >=0 ) {
imageView = obj;
*stop = YES;
}
}else {
*stop = YES;
}
}];
CGPoint popOverPoint;
CGFloat offset = rect_screen.size.height - emojiHeight;
popOverPoint.y = imageView.frame.origin.y + offset + imageView.frame.size.height/2-10;
popOverPoint.x = imageView.frame.origin.x + imageView.frame.size.width - self.emojiWidh/2;
emojiImageView *tempView = nil;
// if (imageView) {
// TPLOG(@"%@ %f %f",imageView.emojiString,popOverPoint.x, popOverPoint.y);
// }
if (!self.popover) {
self.popover = [DXPopover popover];
self.popover.maskType = DXPopoverMaskTypeNone;
self.popover.animationSpring = NO;
self.popover.animationOut = 0;
self.popover.animationIn = 0;
self.popover.cornerRadius = 0.0f;
self.popover.applyShadow = YES;
}
if (gesture.state == UIGestureRecognizerStateBegan) {
if (!imageView) {
return;
}
emojiPopOverView *popOverView = [[emojiPopOverView alloc]initWithFrame:CGRectMake(0, 0, 45, 70) withEmojiString:imageView.emojiString];
[self.popover showAtPoint:popOverPoint popoverPostion:DXPopoverPositionUp withContentView:popOverView inView:KEY_WINDOW];
}else if (gesture.state == UIGestureRecognizerStateChanged) {
if (!imageView) {
[self.popover dismiss];
return;
}
if (!tempView) {
tempView = imageView;
}else {
if ([tempView.emojiString isEqualToString:imageView.emojiString]) {
[self.popover dismiss];
return;
}else {
tempView = imageView;
}
}
emojiPopOverView *popOverView = [[emojiPopOverView alloc]initWithFrame:CGRectMake(0, 0, 45, 70) withEmojiString:imageView.emojiString];
[self.popover showAtPoint:popOverPoint popoverPostion:DXPopoverPositionUp withContentView:popOverView inView:KEY_WINDOW];
}else if (gesture.state == UIGestureRecognizerStateEnded) {
[self.popover dismiss];
self.popover = nil;
if (!imageView) {
[self.popover dismiss];
return;
}
if ([self.delegate respondsToSelector:@selector(emojiSelectViewReturnString:)]) {
[self.delegate emojiSelectViewReturnString:imageView.emojiString];
}
}
}
@end
@interface emojiView()<ATPagingViewDelegate,emojiSelectViewDelegate>{
NSInteger oneRowNum;
CGFloat emojiWidth;
CGFloat emojiPadding;
CGFloat onePageNum;
}
@property(nonatomic, strong)NSArray *sourceDataList;
@property(nonatomic, strong)NSMutableArray *pagingViewDataList;
@property(nonatomic, strong)ATPagingView *pagingView;
@property(nonatomic, strong)NSMutableArray *emojiViewList;
@property(nonatomic, strong)StyledPageControl *pageControl; //页码指示器
@end
@implementation emojiView
@synthesize delgate;
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor colorWithHexString:BackGroundColor];
self.sourceDataList = @[Sad_Expression,Haha_Expression,Candle_Expression,Angry_Expression,BadLuck_Expression,Despising_Expression,Smile_Expression,Surrounding_Expression,Heart_Expression,Question_Expression,Praise_Expression];
if (IS_IPHONE_6P) {
oneRowNum = 8;
}else if (IS_IPHONE_6) {
oneRowNum = 7;
}else {
oneRowNum = 6;
}
onePageNum = oneRowNum*4-1;
emojiPadding = 20;
emojiWidth = (rect_screen.size.width-emojiPadding*(oneRowNum+1))/oneRowNum;
self.pagingViewDataList = [NSMutableArray array];
__block NSMutableArray *tempArray = [NSMutableArray array];
[self.sourceDataList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ((idx+1)/onePageNum != 1) {
[tempArray addObject:obj];
if (idx == self.sourceDataList.count-1) {
[tempArray addObject:@"delete"];
NSMutableArray *emojiAddArray = [NSMutableArray arrayWithArray:tempArray];
[self.pagingViewDataList addObject:emojiAddArray];
tempArray = [NSMutableArray array];
}
}else {
[tempArray addObject:obj];
[tempArray addObject:@"delete"];
NSMutableArray *emojiAddArray = [NSMutableArray arrayWithArray:tempArray];
[self.pagingViewDataList addObject:emojiAddArray];
tempArray = [NSMutableArray array];
}
}];
[self addSubview:self.pagingView];
self.emojiViewList = [NSMutableArray array];
[self.pagingViewDataList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
emojiSelectView *selectView = [[emojiSelectView alloc]initWithFrame:CGRectZero withSouceList:obj];
selectView.oneRowNum = oneRowNum;
selectView.onePageNum = onePageNum;
selectView.emojiWidh = emojiWidth;
selectView.emojiPadding = emojiPadding;
selectView.delegate = self;
[self.emojiViewList addObject:selectView];
}];
[self addSubview:self.pageControl];
self.pageControl.numberOfPages = self.pagingViewDataList.count;
[self.pagingView reloadData];
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
self.pagingView.frame = self.bounds;
self.pageControl.frame = (CGRect){CGRectGetWidth(self.bounds)/2-50, CGRectGetHeight(self.bounds)-15, 100, 10};
[self.emojiViewList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
emojiSelectView *selectView = (emojiSelectView*)obj;
selectView.frame = self.bounds;
}];
[self.pagingView reloadData];
[self.emojiViewList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
emojiSelectView *selectView = (emojiSelectView*)obj;
if (selectView.imageList.count == 0) {
[selectView buildImageList];
[selectView layoutEmojiSubviews];
}
}];
}
- (ATPagingView*)pagingView {
if (!_pagingView) {
_pagingView = [[ATPagingView alloc]initWithFrame:CGRectZero];
_pagingView.gapBetweenPages = 0;
_pagingView.recyclingEnabled = NO;
_pagingView.backgroundColor = [UIColor clearColor];
_pagingView.delegate = self;
_pagingView.scrollView.scrollEnabled = YES;
_pagingView.scrollView.bounces = YES;
}
return _pagingView;
}
- (StyledPageControl *)pageControl {
if (!_pageControl) {
_pageControl = [[StyledPageControl alloc] initWithFrame:CGRectZero];
_pageControl.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
_pageControl.pageControlStyle = PageControlStyleDefault;
_pageControl.userInteractionEnabled = NO;
_pageControl.hidesForSinglePage = YES;
_pageControl.currentPage = 0;
_pageControl.coreSelectedColor = [UIColor colorWithHexString:@"0x1b84cf"];
_pageControl.coreNormalColor = [UIColor colorWithHexString:@"0xc5c5c5"];
_pageControl.strokeWidth = 5;
_pageControl.gapWidth = 4;
_pageControl.diameter = 13;
}
return _pageControl;
}
#pragma mark - pagingView delegate
- (NSInteger)numberOfPagesInPagingView:(ATPagingView *)pagingView {
return self.emojiViewList.count;
}
- (UIView*)viewForPageInPagingView:(ATPagingView *)pagingView atIndex:(NSInteger)index {
return self.emojiViewList[index];
}
- (void)pagesDidChangeInPagingView:(ATPagingView *)view {
self.pageControl.currentPage = view.currentPageIndex;
}
- (void)emojiSelectViewReturnString:(NSString *)emojiString {
if ([self.delgate respondsToSelector:@selector(selectEmoji:)]) {
[self.delgate selectEmoji:emojiString];
}
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end
|