IOS第九天(1:QQ聊天界面frame模型)
/// 控制层
#import "HMViewController.h"
#import "HMMessageModel.h"
#import "HMMessageCell.h"
#import "HMMessageFrameModel.h"
@interface HMViewController ()<UITableViewDataSource,UITableViewDelegate> @property (nonatomic, strong)NSMutableArray *messages; @end @implementation HMViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. } - (NSMutableArray *)messages
{
if (_messages == nil) { NSArray * array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"messages.plist" ofType:nil]]; NSMutableArray *messageArr = [NSMutableArray array];
for (NSDictionary *dict in array) {
HMMessageModel *messga = [HMMessageModel messageWithDict:dict]; HMMessageFrameModel *fm = [[HMMessageFrameModel alloc]init];
fm.message = messga; [messageArr addObject:fm];
} _messages = messageArr;
} return _messages;
}
//隐藏状态栏
- (BOOL)prefersStatusBarHidden
{
return YES;
} #pragma mark tableview数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.messages.count;
} - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
HMMessageFrameModel *model = self.messages[indexPath.row];
return model.cellH;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
HMMessageCell *cell = [HMMessageCell messageCellWithTableView:tableView];
HMMessageFrameModel *model = self.messages[indexPath.row]; cell.frameMessage = model; return cell;
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
#import <UIKit/UIKit.h> @interface HMViewController : UIViewController @end
/// model.h
#import <Foundation/Foundation.h>
typedef enum {
HMMessageModelGatsby = ,//Gatsby
HMMessageModelJobs//Jobs
}HMMessageModelType;
@interface HMMessageModel : NSObject //正文
@property (nonatomic, copy)NSString *text; //时间
@property (nonatomic, copy)NSString *time; //发送类型
@property (nonatomic, assign)HMMessageModelType type; - (instancetype)initWithDict:(NSDictionary *)dict; + (instancetype)messageWithDict:(NSDictionary *)dict; @end
*****model.m
#import "HMMessageModel.h" @implementation HMMessageModel - (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
} return self;
} + (instancetype)messageWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
} @end
******modelframe.h
#import <Foundation/Foundation.h>
@class HMMessageModel;
@interface HMMessageFrameModel : NSObject //时间的frame
@property (nonatomic, assign,readonly)CGRect timeF; //正文的frame
@property (nonatomic, assign,readonly)CGRect textViewF; //图片
@property (nonatomic, assign,readonly)CGRect iconF; //cell
@property (nonatomic, assign,readonly)CGFloat cellH; //数据模型
@property (nonatomic, strong)HMMessageModel *message;
@end
******modelframe.m
#import "HMMessageFrameModel.h"
#import "Constant.h"
#import "HMMessageModel.h"
@implementation HMMessageFrameModel - (void)setMessage:(HMMessageModel *)message
{
_message = message; CGFloat padding = ;
//1. 时间
CGFloat timeX = ;
CGFloat timeY = ;
CGFloat timeW = bScreenWidth;
CGFloat timeH = bNormalH; _timeF = CGRectMake(timeX, timeY, timeW, timeH); //2.头像
CGFloat iconX;
CGFloat iconY = CGRectGetMaxY(_timeF);
CGFloat iconW = bIconW;
CGFloat iconH = bIconH; if (message.type == HMMessageModelGatsby) {//自己发的 iconX = bScreenWidth - iconW - padding; }else{//别人发的
iconX = padding;
} _iconF = CGRectMake(iconX, iconY, iconW, iconH);
//3.正文 CGFloat textX;
CGFloat textY = iconY; CGSize textMaxSize = CGSizeMake(, MAXFLOAT);
CGSize textRealSize = [message.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:bBtnFont} context:nil].size; if (message.type == HMMessageModelGatsby) {
textX = bScreenWidth - iconW - padding - textMaxSize.width;
}else{
textX = padding + iconW;
} // _textViewF = CGRectMake(textX, textY, <#CGFloat width#>, <#CGFloat height#>)
_textViewF = (CGRect){{textX,textY},textRealSize}; //4.cell高度 CGFloat iconMaxY = CGRectGetMaxY(_iconF);
CGFloat textMaxY = CGRectGetMaxY(_textViewF); _cellH = MAX(iconMaxY, textMaxY); } @end
////****cell.h
#import <UIKit/UIKit.h>
@class HMMessageFrameModel;
@interface HMMessageCell : UITableViewCell + (instancetype)messageCellWithTableView:(UITableView *)tableview; //frame 的模型
@property (nonatomic, strong)HMMessageFrameModel *frameMessage; @end
////****cell.m
#import "HMMessageCell.h"
#import "HMMessageFrameModel.h"
#import "HMMessageModel.h"
#import "Constant.h"
@interface HMMessageCell()
//时间
@property (nonatomic, weak)UILabel *time;
//正文
@property (nonatomic, weak)UIButton *textView;
//用户头像
@property (nonatomic, weak)UIImageView *icon; @end @implementation HMMessageCell
+ (instancetype)messageCellWithTableView:(UITableView *)tableview
{
static NSString *ID = @"messageCell";
HMMessageCell *cell = [tableview dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[self alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
} return cell;
}
// 初始化控件
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//1.时间
UILabel *time = [[UILabel alloc]init];
time.textAlignment = NSTextAlignmentCenter;
time.font = [UIFont systemFontOfSize:13.0f];
[self.contentView addSubview:time];
self.time = time; //1.正文
UIButton *textView = [[UIButton alloc]init];
textView.backgroundColor = [UIColor grayColor];
textView.titleLabel.font = bBtnFont;
textView.titleLabel.numberOfLines = ;//自动换行
[self.contentView addSubview:textView];
self.textView = textView; //1.头像
UIImageView *icon = [[UIImageView alloc]init];
[self.contentView addSubview:icon];
self.icon = icon; }
return self;
}
// 设置位置和值
- (void)setFrameMessage:(HMMessageFrameModel *)frameMessage
{
_frameMessage = frameMessage; HMMessageModel *model = frameMessage.message; //1.时间
self.time.frame = frameMessage.timeF;
self.time.text = model.time; //2.头像
self.icon.frame = frameMessage.iconF;
if (model.type == HMMessageModelGatsby) {
self.icon.image = [UIImage imageNamed:@"Gatsby"];
}else{
self.icon.image = [UIImage imageNamed:@"Jobs"];
} //3.正文
self.textView.frame = frameMessage.textViewF;
[self.textView setTitle:model.text forState:UIControlStateNormal]; }
@end
IOS第九天(1:QQ聊天界面frame模型)的更多相关文章
- IOS第九天(2:QQ聊天界面键盘优化 和自动回复)
***********controller.m #import "HMViewController.h" #import "HMMessageModel.h" ...
- IOS第九天(3:QQ聊天界面通知的使用)
#import <Foundation/Foundation.h> #import "Person.h" #import "XQCompany.h" ...
- QQ聊天界面的布局和设计(IOS篇)-第二季
QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...
- QQ聊天界面的布局和设计(IOS篇)-第一季
我写的源文件整个工程会再第二季中发上来~,存在百度网盘, 感兴趣的童鞋, 可以关注我的博客更新,到时自己去下载~.喵~~~ QQChat Layout - 第一季 一.准备工作 1.将假数据messa ...
- Objective-c——UI基础开发第八天(QQ聊天界面)
一.知识点: QQ聊天界面 双模型的使用(dataModel和frameModel) UITextField的使用 通知的使用 拉伸图片的两种方法(slicing/image对象的resizeable ...
- IOS开发学习笔记043-QQ聊天界面实现
QQ聊天界面实现 效果如下: 实现过程: 1.首先实现基本界面 头像使用 UIImageView : 文字消息使用 UIButton 标签使用 UILable :水平居中 所有元素在一个cell中,在 ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
- 在WEB项目中调用QQ通讯组件打开QQ聊天界面
在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...
- Android 内部启动其他应用,以及打开指定qq聊天界面
在自己应用中打开第三方应用,有好多种方法,这里举例一种: //以打开微信为例,前提需要知道打开应用的包名,一般一个发布版本的应用,包名不会轻易改变的,但是,打开QQ就要注意了,毕竟QQ的发布版本有不下 ...
随机推荐
- 【面试题】HWL
1.编程题 设计数据结构,模拟浏览器功能: BACK FORWARD VISIT QUIT Visit 未指定具体网址时,返回主页 http://www.xueersi.com 2.指出下列程序的错误 ...
- Wiki上的Ue4文件结构以及命名规范
https://wiki.unrealengine.com/Assets_Naming_Convention
- POJ3680 Intervals(最小费用最大流)
选择若干条线段使权值最大,并且点覆盖次数不超过k. 建图如下:vs到0建立容量为k费用为0的边:坐标终点到vt连接一条容量为k费用为0的边:对于每两个相邻坐标连接一条容量为INF费用为0的边:对于线段 ...
- 【Linux程序设计】之进程间的通信
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程间通信 实验目的:熟悉进程通信中信号概念及信号处理:掌握进程间的管道通信编程 ...
- BZOJ4537 : [Hnoi2016]最小公倍数
将边按$a$从小到大排序,每$\sqrt{m}$个取一个关键点. 对于每个关键点,将这个点之前的边以及要在这个关键点回答的询问按$b$排序. 依次加入这个关键点之前的每条边,用并查集维护每个连通块$a ...
- BZOJ3566 : [SHOI2014]概率充电器
选个根把无根树转化成有根树, 设f[i]表示i不通电的概率 则 答案为对于枚举树根root进行DP后1-f[root]的和 直接算是O(n^2)的,但是n有500000,所以不能过. 对于这样一棵以1 ...
- Leetcode Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- ACM 6174问题
6174问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替 ...
- 【BZOJ】1856: [Scoi2010]字符串
http://www.lydsy.com/JudgeOnline/problem.php?id=1856 题意:把n个1和m个0组成字符串,要求在组成的字符串中,任意的前k个字符1的个数不能少于0的个 ...
- 【noiOJ】p1794
t1794:集合加法 查看 提交 统计 提问 总时间限制: 3000ms 内存限制: 65536kB 描述 给出2个正整数集合A = {pi | 1 <= i <= a},B = {q ...