1. 程式人生 > >ios開發 UI高階 自定義表情鍵盤

ios開發 UI高階 自定義表情鍵盤

#import "FaceView.h" @implementation FaceView // 複寫初始化方法 -(instancetype)initWithFrame:(CGRect)frame{ if ([super initWithFrame:frame]) { [self loadPlist]; } return self; } //整理表情 - (void)loadPlist{ //獲取plist NSString *filePath = [[NSBundle mainBundle]pathForResource:@"emoticons.plist" ofType:nil]; //所有表情的陣列 NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; //裝小陣列 _items = [NSMutableArray array]; NSMutableArray *item2D = nil; for (int i= 0; i<array.count; i++) { //建立小陣列 if (item2D == nil|| item2D.count==28) { item2D = [NSMutableArray array]; [_items addObject:item2D]; } NSDictionary *faceDic = [array objectAtIndex:i]; [item2D addObject:faceDic]; } //內部寫死寬高 self.width = kScreenWidth *_items.count; self.height = 4*itemSize; } // 畫表情 - (void)drawRect:(CGRect)rect { //確定行和列 CGFloat row = 0; CGFloat culom = 0; //那表情 for (int i=0; i<_items.count; i++) { NSMutableArray *item2D = _items[i]; for (int j = 0; j<item2D.count; j++) { NSDictionary *dic = item2D[j]; //圖片的名字 NSString *imgName = [dic objectForKey:@"png"]; UIImage *img = [UIImage imageNamed:imgName]; CGFloat x = culom *itemSize + (itemSize-imgSize)/2 + kScreenWidth*i; CGFloat y = row *itemSize +(itemSize-imgSize)/2; //繪製 [img drawInRect:CGRectMake(x, y, imgSize, imgSize)]; //更新行和列 culom++;//0-6 if (culom==7) { culom = 0; row++; } if (row==4) {//0-3 row=0; } } } } #pragma mark - 觸控事件 // 開始觸控 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.selectImgView.hidden = NO; // 避免滑動衝突 if ([self.superview isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView *) self.superview; scroll.scrollEnabled = NO; } // 獲取觸控點位置 UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self]; [self touchFace:point]; } // 移動觸控 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //獲取觸控點的位置 UITouch *touch = [touches anyObject]; CGPoint point = [touch locationInView:self]; [self touchFace:point]; } // 觸控結束 -(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // 隱藏選中圖片 self.selectImgView.hidden = YES; if ([self.superview isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView *) self.superview; scroll.scrollEnabled = YES; } // 顯示錶情名 self.selectImgName = self.text; } //尋找點選的表情 - (void)touchFace:(CGPoint)point{ //1.當前頁 NSInteger page = point.x/kScreenWidth; //容錯處理(手指點出表情外) if (page>=_items.count || page < 0) { return; } //確定小陣列的索引 /** CGFloat x = culom *itemSize + (itemSize-imgSize)/2 + kScreenWidth*i; CGFloat y = row *itemSize +(itemSize-imgSize)/2; */ NSInteger culom = (point.x - ((itemSize-imgSize)/2 + kScreenWidth*page))/itemSize; NSInteger row = (point.y - (itemSize-imgSize)/2)/itemSize; //容錯處理 if (culom >6) culom =6; if (culom <0) culom =0; if (row >3) row =3; if (row <0) row =0; NSInteger index = row*7+culom; //處理最後一頁陣列越界 if (page == _items.count-1) { NSArray *item2D = _items[page]; if (index>item2D.count-1) { return; } } NSArray *item2D = _items[page]; NSDictionary *faceDic = item2D[index]; NSString *imgName = faceDic[@"png"]; NSString *faceName = faceDic[@"chs"]; if (![self.selectImgName isEqualToString:faceName]) { //確定放大鏡的位置 CGFloat bottom = row *itemSize +itemSize/2; CGFloat x = culom *itemSize + itemSize/2 + page *kScreenWidth; self.selectImgView.center = CGPointMake(x, 0); self.selectImgView.bottom = bottom; //賦值 UIImageView *imgView =[self.selectImgView viewWithTag:1100]; imgView.image = [UIImage imageNamed:imgName]; self.text = faceName; } } - (UIImageView *)selectImgView{ if (_selectImgView == nil) { _selectImgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"emoticon_keyboard_magnifier.png"]]; [_selectImgView sizeToFit]; [self addSubview:_selectImgView]; UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake((_selectImgView.width-imgSize)/2, 15, imgSize, imgSize)]; imgView.tag = 1100; [_selectImgView addSubview:imgView]; } return _selectImgView; }