首页 > 代码库 > 新浪微博客户端(43)-切换表情控件

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

最终效果:

技术分享

 

 

 

新浪微博客户端(43)-切换表情控件