热更新demo

emojiView.m 18KB

    // // 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