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

发布时间 - 2026-01-11 03:09:41    点击率:

-本安全出自个人小项目仿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实现聊天界面底部菜单栏效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# ios  # 底部菜单栏  # Android仿IOS底部弹出对话框  # Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)  # iOS实现只有底部边框线的输入框示例代码  # android底部弹出iOS7风格对话选项框(QQ对话框)--第三方开源之IOS_Dialog_Li  # 小编  # 分割线  # 在此  # 给大家  # 所述  # 给我留言  # 感谢大家  # 主要是  # 疑问请  # 有任何  # frame  # super  # initWithFrame  # CGRect  # return  # init  # backgroundColor  # UIColor  # alloc  # instancetype 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器如何保障网站安全无虞?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何快速搭建自助建站会员专属系统?  详解CentOS6.5 安装 MySQL5.1.71的方法  公司门户网站制作流程,华为官网怎么做?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  如何在搬瓦工VPS快速搭建网站?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  教学论文网站制作软件有哪些,写论文用什么软件 ?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  详解阿里云nginx服务器多站点的配置  如何在万网主机上快速搭建网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何在建站之星网店版论坛获取技术支持?  Android okhttputils现在进度显示实例代码  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Windows Hello人脸识别突然无法使用  如何撰写建站申请书?关键要点有哪些?  phpredis提高消息队列的实时性方法(推荐)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  如何在Windows 2008云服务器安全搭建网站?  如何选择PHP开源工具快速搭建网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  香港服务器租用每月最低只需15元?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何用5美元大硬盘VPS安全高效搭建个人网站?  Python进程池调度策略_任务分发说明【指导】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何用wdcp快速搭建高效网站?  Python文件操作最佳实践_稳定性说明【指导】  Python并发异常传播_错误处理解析【教程】  如何快速搭建高效服务器建站系统?  如何快速配置高效服务器建站软件?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  如何注册花生壳免费域名并搭建个人网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何使用Eloquent进行子查询  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程