ios開發 UI高階 自定義表情鍵盤
阿新 • • 發佈:2019-01-02
#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;
}