IOS实现聊天界面底部菜单栏效果

-本安全出自个人小项目仿boss直聘当中的聊天信息界面:

实现的思路主要是:约束动画。

实现较简单,这里直接上代码:

。h文件:

#import <UIKit/UIKit.h>
@protocol ShowMoreOptionListener <NSObject>
@optional
-(void) onChangListener;
@end
@class ScrollView;
/**
 底部菜单视图
 */
@interface BottomMenuView : UIView
@property(nonatomic,strong) UIView* showPartView;    //总是可见部分
@property(nonatomic,strong) UIView* hiddenPartView;   //底部隐藏部分,需要点击显示部分才能显示出来
@property(nonatomic,weak) id<ShowMoreOptionListener> delegate; //下面更多操作菜单的的状态代理器
@property(nonatomic,strong) ScrollView* emojiPanel;
-(void) buildOptionMenu;
@end 

.m文件:

#import "BottomMenuView.h"
#import "Masonry.h"
#import "QuickWordsView.h"
#import "ScrollView.h"
#import "Constants.h"
static const int QuickChat = 31;
static const int Emoji = 32;
static const int AddType = 33;
static const int EmojiPanel = 34;
static const int QuickChatPanel = 34;
@implementation BottomMenuView
-(instancetype) initWithFrame:(CGRect)frame{
  if(self = [super initWithFrame:frame]){}
  return self;
}
-(void) buildOptionMenu{
  self.showPartView = [[UIView alloc] init];
  //self.showPartView.backgroundColor = [UIColor greenColor];
  [self addSubview:self.showPartView];
  //添加showPartView约束
  [self.showPartView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self).offset(0);
    make.top.equalTo(self);
    make.left.equalTo(self);
    make.height.mas_equalTo(40);
  }];
  UIButton* showQuickWordsBtn = [[UIButton alloc] init];
  [showQuickWordsBtn setImage:[UIImage imageNamed:@"ic_chat_input_method"] forState:UIControlStateNormal];
  showQuickWordsBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
  showQuickWordsBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
  showQuickWordsBtn.imageEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
  showQuickWordsBtn.tag = QuickChat;
  [showQuickWordsBtn addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
  [self.showPartView addSubview:showQuickWordsBtn];
  [showQuickWordsBtn mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(self.showPartView).offset(0);
    make.top.equalTo(self.showPartView);
    make.size.mas_equalTo(CGSizeMake(90, 40));
  }];
  //中间编辑框
  UITextView* editText = [[UITextView alloc] init];
  [self.showPartView addSubview:editText];
  [editText mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(showQuickWordsBtn.mas_trailing).offset(-10);
    make.centerY.equalTo(showQuickWordsBtn.mas_centerY);
    make.height.mas_equalTo(37);
    make.trailing.equalTo(self.showPartView).offset(-100);
  }];
  //设置编辑框底部线
  UIView* editTextbottomLine = [[UIView alloc] init];
  editTextbottomLine.backgroundColor = [UIColor blackColor];
  [self.showPartView addSubview:editTextbottomLine];
  [editTextbottomLine mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(showQuickWordsBtn.mas_trailing).offset(-10);
    make.top.equalTo(showQuickWordsBtn.mas_bottom);
    make.height.mas_equalTo(1.0);
    make.trailing.equalTo(self.showPartView).offset(-100);
  }];
  //创建表情
  UIButton* emojiBtn = [[UIButton alloc] init];
  [emojiBtn setImage:[UIImage imageNamed:@"ic_emoji.png"] forState:UIControlStateNormal];
  emojiBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
  emojiBtn.tag = Emoji;
  [emojiBtn addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
  [self addSubview:emojiBtn];
  [emojiBtn mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(editText.mas_trailing).offset(5);
    make.centerY.equalTo(self.showPartView.mas_centerY);
    make.size.mas_equalTo(CGSizeMake(38, 38));
  }];
  //创建+btn
  UIButton* addBtn = [[UIButton alloc] init];
  [addBtn setImage:[UIImage imageNamed:@"ic_gallery_add.png"] forState:UIControlStateNormal];
  addBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
  addBtn.tag = AddType;
  [addBtn addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
  [self addSubview:addBtn];
  [addBtn mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(self.showPartView).offset(-10);
    make.centerY.equalTo(self.showPartView.mas_centerY);
    make.size.mas_equalTo(CGSizeMake(38, 38));
  }];
  //设置永久显示底部线
  UIView* bottomLine = [[UIView alloc] init];
  bottomLine.backgroundColor = [UIColor blackColor];
  [self.showPartView addSubview:bottomLine];
  [bottomLine mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(showQuickWordsBtn);
    make.top.equalTo(self.showPartView.mas_bottom).offset(5);
    make.height.mas_equalTo(1.0);
    make.trailing.equalTo(self.showPartView.mas_trailing);
  }];
//  //下面开始处理隐藏部分,默认显示快捷消息
//  QuickWordsView* quickWordsView = [[QuickWordsView alloc] init];
//  quickWordsView.separatorInset = UIEdgeInsetsMake(0,10,0,10); //top left right down
//  quickWordsView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; //删除底部多余行,及分割线
//  quickWordsView.tag = 100;
//  [self addSubview:quickWordsView];
//  [quickWordsView mas_makeConstraints:^(MASConstraintMaker *make) {
//    make.leading.equalTo(self);
//    make.trailing.equalTo(self.mas_trailing);
//    make.top.equalTo(self.mas_top).offset(47);
//    make.height.mas_equalTo(210);
//
//  }];
  [self buildQuickChat];
}
-(void)onClick:(UIButton*) button{
  switch(button.tag){
    case QuickChat:{
      if(self.delegate){
        [self.delegate onChangListener];
      }
    }break;
    case Emoji:{
    }break;
    case AddType:{
    }break;
  }
}
-(void) buildQuickChat{
  //下面开始处理隐藏部分,默认显示快捷消息
  QuickWordsView* quickWordsView = [[QuickWordsView alloc] init];
  quickWordsView.separatorInset = UIEdgeInsetsMake(0,10,0,10); //top left right down
  quickWordsView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; //删除底部多余行,及分割线
  quickWordsView.tag = QuickChatPanel;
  [self addSubview:quickWordsView];
  [quickWordsView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.equalTo(self);
    make.trailing.equalTo(self.mas_trailing);
    make.top.equalTo(self.mas_top).offset(47);
    make.height.mas_equalTo(210);
  }];
}
//-------------------kvo 实现观察主题 end----------------
@end 

测试代码:

-(void) testBottomMenu{
   self.menu = [[BottomMenuView alloc] init];
  self.menu.translatesAutoresizingMaskIntoConstraints = NO;
  //self.menu.backgroundColor = [UIColor redColor];
  [self.menu buildOptionMenu];
  self.menu.delegate = self;
  [self.view addSubview:self.menu];
  //使用约束来达到效果,下面开始添加约束 靠着底部
  NSLayoutConstraint* alginBottom = [NSLayoutConstraint constraintWithItem:self.menu
                                  attribute:NSLayoutAttributeBottom
                                  relatedBy:NSLayoutRelationEqual
                                   toItem:self.view
                                  attribute:NSLayoutAttributeBottom
                                 multiplier:1
                                  constant:0.0];
  [self.view addConstraint:alginBottom];
  //添加高度
  self.bottomHeightCons = [NSLayoutConstraint
               constraintWithItem:self.menu
               attribute:NSLayoutAttributeHeight
               relatedBy:NSLayoutRelationEqual
               toItem:nil
               attribute:0
               multiplier:1
               constant:260];
  [self.menu addConstraint:self.bottomHeightCons];
  //添加右边约束
  NSLayoutConstraint* rightMargin = [NSLayoutConstraint constraintWithItem:self.menu
                                  attribute:NSLayoutAttributeRight
                                  relatedBy:NSLayoutRelationEqual
                                   toItem:self.view
                                  attribute:NSLayoutAttributeRight
                                 multiplier:1
                                  constant:0.0];
  [self.view addConstraint:rightMargin];
  //添加左边约束
  NSLayoutConstraint* leftMargin = [NSLayoutConstraint constraintWithItem:self.menu
                                  attribute:NSLayoutAttributeLeft
                                  relatedBy:NSLayoutRelationEqual
                                   toItem:self.view
                                  attribute:NSLayoutAttributeLeft
                                 multiplier:1
                                  constant:0.0];
  [self.view addConstraint:leftMargin];
}
//更多操作按钮的协议监听接口
-(void)onChangListener{
  //[self.view layoutIfNeeded];
  if(self.bottomHeightCons.constant == 40){
    self.bottomHeightCons.constant = 260;
  }else{
    self.bottomHeightCons.constant = 40;
  }
  [UIView animateWithDuration:0.5 animations:^{
    [self.view layoutIfNeeded];
  }];
} 

总结

以上所述是小编给大家介绍的IOS实现聊天界面底部菜单栏效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • android底部弹出iOS7风格对话选项框(QQ对话框)--第三方开源之IOS_Dialog_Library

    先给大家展示下效果图,喜欢的朋友可以下载源码哦. 完成这个效果的是使用了 IOS_Dialog_Library 下载地址:http://xiazai.jb51.net/201509/yuanma/IOS_Dialog_Library(jb51.net) 下载后导入到Eclipse中,然后作为Library引入到自己的工程中,直接作为第三方控件使用. 测试代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

  • Android仿IOS底部弹出对话框

    在Android开发过程中,常常会因为感觉Android自带的Dialog的样式很丑,项目开发过程中会影响整体效果,会使得开发过程很是忧伤....(话唠时间结束!) 本文我将介绍一款开源的Dialog仿IOS底部弹窗效果IOS_Dialog_Library的使用.我将通过几个简单的示例介绍IOS_Dialog_Library.zip的使用方法. 1.IOS_Dialog_Library是开源的Dialog框架,所以首先你得下载IOS_Dialog_Library.zip包,并作为Library引

  • iOS实现只有底部边框线的输入框示例代码

    实现效果图: 实现过程 输入框一般有无边框(空白输入框),全边框(矩形输入框),加边框很简单,只需要设置UITextField的layer.borderColor属性和layer.borderWidth属性就可以了,如果要实现只带底部框线的输入框就不太好弄了,百度了一下找到了一个最笨也是挺不错的一个方法,那就是在下面直接给它加一条线就可以了. 示例代码: UITextField *passwordTextField = [[UITextField alloc] initWithFrame:CGR

  • Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

    本文Github代码链接 https://github.com/AndroidMsky/AndoirdIOSPicker 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDialog(List<Integer> date) { DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this); bui

  • IOS实现聊天界面底部菜单栏效果

    -本安全出自个人小项目仿boss直聘当中的聊天信息界面: 实现的思路主要是:约束动画. 实现较简单,这里直接上代码: .h文件: #import <UIKit/UIKit.h> @protocol ShowMoreOptionListener <NSObject> @optional -(void) onChangListener; @end @class ScrollView; /** 底部菜单视图 */ @interface BottomMenuView : UIView @p

  • Android仿微信底部菜单栏效果

    前言 在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP.实现底部菜单栏的方法也有很多种. 1.仿微信底部菜单栏(ViewPager+ImagerView+TextView) ......(其他方式后续会补充) 效果预览 首先来个开胃菜,看看实现效果: 先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字 colors.xml <color name="bg_line_light_gray&quo

  • Android仿微信顶/底部菜单栏效果

    本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单按钮,左右滑动page(其实就是xml)并且改变相应按钮的亮度. 一.布局 1.顶部菜单布局,命名为top_layout.xml <?xml version="1.0" encoding="utf-8"?> <R

  • Swift 3.1聊天界面键盘效果的实现详解

    前言 最近写的 Swift 项目里要实现一个聊天界面,在处理键盘弹出的时候遇到了一点麻烦. 麻烦就在于键盘弹出后如何处理屏幕和键盘的关系 经过一番死磕,终于做出了想要的效果,效果如下: 注:原本项目是 Swift 2.3 写的,为了写这篇博客,用 Swift 3.1 重新实现了一遍. 感受:方法名真的缩短了不少,

  • IOS 聊天界面(自适应文字)的实现

    该篇文章主要介绍一个实现聊天界面的思路过程,源码可以在 源码链接获得,该工程实现聊天的基本功能,功能还不够完善,欢迎大家提PR,效果图如下所示 我希望通过相对简单的方式实现界面的布局,没有复杂的计算达到自适应的效果. iOS8新功能介绍 虽然self size cell最终没有在我的工程中用到,但是这是我曾经挖过的坑,所以在此做了简单的介绍. 在iOS 8 中,UITableView新增一项功能 self size cells,这是一项通过 UITableViewCell 的约束自动自动计算UI

  • Android仿微信底部菜单栏功能显示未读消息数量

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下做出来之后的效果: 以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈, 首先是要布局layout下xml文件 main.xml: <?xml version="1.0" encoding=&qu

  • android底部菜单栏实现原理与代码

    上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家. 底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做.我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下

  • jquery仿微信聊天界面

    首先看一下我们的效果图. 这个颜色可能搭配的有些不合适,但基本功能大都实现了.就是你和你同桌对话,你发的消息在你的左侧,而在他设备的右侧. 首先先写好整体的框架,在一个大容器中放两个盒子,分别是左侧和右侧的界面.然后每个盒子里面包含了三大部分:头部.内容区.和底部.只要写好一侧,另一侧进行粘贴复制就可以了. 首先定义一个大的 来盛放左右两个盒子. <div id = "main"> //左侧聊天界面 <div id = "box"> <

  • iOS实现聊天输入框功能

    经常使用微信聊天,没事儿就会想输入框的实现过程,所以抽空,也实现了一个输入框的功能: 经过封装,使用就非常的简单了,在需要的VC中,实现方法如下: - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:1.00]; self.keyView = [[DKSKeyboardView alloc] init

  • android实现上滑屏幕隐藏底部菜单栏的示例

    本篇文章引用github上一个仿今日头条项目,项目地址: https://github.com/iMeiji/Toutiao ,主要实现的功能是底部菜单栏随用户手势滑动而变化可见状态 布局代码 这个功能实现起来比较简单,主要利用了CoordinatorLayout的 layout_behavior 的属性.具体代码如下: <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent&q

随机推荐