zoukankan      html  css  js  c++  java
  • 新浪微博客户端(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

    最终效果:

     

  • 相关阅读:
    Ubuntu软件工具推荐
    利用Github Actions自动同步博客园最新内容到GitHub首页
    vscode 使用zsh powerline主题乱码解决方案
    搜索插入位置
    判断二分图
    ~~并发编程(十三):信号量,Event,定时器~~
    ~~并发编程(十二):死锁和递归锁~~
    ~~并发编程(十一):GIL全局解释锁~~
    ~~并发编程(十):线程方法~~
    ~~并发编程(九):多线程与多进程~~
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6111624.html
Copyright © 2011-2022 走看看