新浪微博客户端(43)-切换表情控件
DJEmotionKeyboard.m
#import "DJEmotionKeyboard.h" #import "DJEmotionListView.h" #import "DJEmotionTabBar.h" #import "DJEmotion.h" #import "MJExtension.h" @interface DJEmotionKeyboard() <DJEmotionTabBarDelegate> // 底部工具条 @property (nonatomic,weak) DJEmotionTabBar *emotionTabBar; // 分隔线 @property (nonatomic,weak) UIView *dividerView; /* ================= 表情切换容器 ============== */ @property (nonatomic,weak) UIView *placeView; // 最近 @property (nonatomic,strong) DJEmotionListView *recentEmotionView; // 默认 @property (nonatomic,strong) DJEmotionListView *defaultEmotionView; // Emoji @property (nonatomic,strong) DJEmotionListView *emojiEmotionView; // 浪小花 @property (nonatomic,strong) DJEmotionListView *lxhEmotionView; /* ================= 表情切换容器 ============== */ @end @implementation DJEmotionKeyboard - (DJEmotionListView *)recentEmotionView { if (!_recentEmotionView) { DJEmotionListView *recentEmotionView = [[DJEmotionListView alloc] init]; _recentEmotionView = recentEmotionView; recentEmotionView.backgroundColor = DJRandomColor; } return _recentEmotionView; } - (DJEmotionListView *)defaultEmotionView { if (!_defaultEmotionView) { DJEmotionListView *defaultEmotionView = [[DJEmotionListView alloc] init]; _defaultEmotionView = defaultEmotionView; defaultEmotionView.backgroundColor = DJRandomColor; NSString *path = [[NSBundle mainBundle] pathForResource:@"EmotionIcons/default/info.plist" ofType:nil]; NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; // 将字典数组转换成模型数组 NSArray *emotionArray = [DJEmotion mj_objectArrayWithKeyValuesArray:dictArray]; defaultEmotionView.emotions = emotionArray; } return _defaultEmotionView; } - (DJEmotionListView *)emojiEmotionView { if (!_emojiEmotionView) { DJEmotionListView *emojiEmotionView = [[DJEmotionListView alloc] init]; _emojiEmotionView = emojiEmotionView; emojiEmotionView.backgroundColor = DJRandomColor; NSString *path = [[NSBundle mainBundle] pathForResource:@"EmotionIcons/emoji/info.plist" ofType:nil]; NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; // 将字典数组转换成模型数组 NSArray *emotionArray = [DJEmotion mj_objectArrayWithKeyValuesArray:dictArray]; emojiEmotionView.emotions = emotionArray; } return _emojiEmotionView; } - (DJEmotionListView *)lxhEmotionView { if (!_lxhEmotionView) { DJEmotionListView *lxhEmotionView = [[DJEmotionListView alloc] init]; _lxhEmotionView = lxhEmotionView; lxhEmotionView.backgroundColor = DJRandomColor; NSString *path = [[NSBundle mainBundle] pathForResource:@"EmotionIcons/lxh/info.plist" ofType:nil]; NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; // 将字典数组转换成模型数组 NSArray *emotionArray = [DJEmotion mj_objectArrayWithKeyValuesArray:dictArray]; lxhEmotionView.emotions = emotionArray; } return _lxhEmotionView; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"emoticon_keyboard_background"]]; UIView *placeView = [[UIView alloc] init]; [self addSubview:placeView]; self.placeView = placeView; // emotionListView.backgroundColor = DJRandomColor; UIView *dividerView = [[UIView alloc] init]; [self addSubview:dividerView]; self.dividerView = dividerView; self.dividerView.backgroundColor = DJColor(187, 187, 187); DJEmotionTabBar *emotionTabBar = [[DJEmotionTabBar alloc] init]; [self addSubview:emotionTabBar]; self.emotionTabBar = emotionTabBar; self.emotionTabBar.delegate = self; // emotionTabBar.backgroundColor = DJRandomColor; } return self; } - (void)layoutSubviews { [super layoutSubviews]; // emotionTabBar CGFloat tabBarW = self.width; CGFloat tabBarH = 44; CGFloat tabBarX = 0; CGFloat tabBarY = self.height - tabBarH; self.emotionTabBar.frame = CGRectMake(tabBarX, tabBarY, tabBarW, tabBarH); // dividerView; CGFloat dividerW = self.width; CGFloat dividerH = 0.5; CGFloat dividerX = 0; CGFloat dividerY = tabBarY - 0.5; self.dividerView.frame = CGRectMake(dividerX, dividerY, dividerW, dividerH); // placeView CGFloat placeViewX = 0; CGFloat placeViewY = 0; CGFloat placeViewW = self.width; CGFloat placeViewH = tabBarY; self.placeView.frame = CGRectMake(placeViewX, placeViewY, placeViewW, placeViewH); // placeView 子元素 UIView *childView = [self.placeView.subviews lastObject]; childView.frame = self.placeView.bounds; } #pragma mark - DJEmotionTabBar 的代理方法 - (void)emotionTabBar:(DJEmotionTabBar *)tabBar didSelectedButtonType:(DJEmotionTabBarButtonType)buttonType { // 1. 清空placeView中之前存在的其它View(类似于android中的ViewGroup.removeAllViews) [self.placeView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // 2. 切换contentView switch (buttonType) { case DJEmotionTabBarButtonTypeRecent: // 最近 [self.placeView addSubview:self.recentEmotionView]; break; case DJEmotionTabBarButtonTypeDefault: // 默认 [self.placeView addSubview:self.defaultEmotionView]; break; case DJEmotionTabBarButtonTypeEmoji: // Emoji [self.placeView addSubview:self.emojiEmotionView]; break; case DJEmotionTabBarButtonTypeLxh: // 浪小花 [self.placeView addSubview:self.lxhEmotionView]; break; default: break; } // 3.切换完毕后通知系统重新布局,相当于再次调用layoutSubViews [self setNeedsLayout]; } @end
最终效果:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库