新浪微博客户端(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
复制代码

最终效果:

 

 

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(343)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示