细节归纳
一、控制器里的细节
1)是否允许cell被选中
self.tableView.allowSelection = NO;
2) 设置分割线的样式
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
3) 设置自定义的颜色
self.tableView.backgroundColor = [UIColor colorWithRed:235.0/255.0 green:235.0/255.0 blue:235.0/255.0 alpha:0.6];
4) 被重用的cell是存放在tableView管理的缓冲池里 通过出列获得
5)创建一个cell 用的是对象方法
6)创建frame模型 返回cell的高度 是 CGFloat类型的
7)设置是否隐藏状态栏 要在tableView里 实现 -(BOOL)prefersStatusBarHidden 方法
二、Frame模型里的细节
1. 在.h文件中定义一个数据模型的强引用,各子控件的frame,cell的高度
2.在.m文件中实现处理文本真实size的方法
-(CGSize)textWithString :(NSString *)text andFont:(UIFont *)font maxSize:(CGSize)maxSize
{
NSDictionary *nameDict = @{NSFontAttributeName:font};
return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil].size;
}
3.设置文本范围参考值
CGSize chatViewSize = CGSizeMake(160,MAXFLOAT);
三、cell类的细节
1.在.h里定义一个frame模型属性 强引用
2.在.m里定义一个类延展 里面定义各个子控件的View 弱引用
3.实现 initWithStyle方法
4.在设置数据的时候,要考虑没有数据的字段
5.设置文本字体大小
charView.titleLabel.numberOfLines = 0
charView.titleLabel.font = [UIFont systemFontOfSize:14];
’四、数据模型类的细节
1.在.h里需要枚举类型就定义一个 注意:命名:元素:前缀+类名+作用+意义;类型名:前缀+类名+作用
QQ聊天界面问题解决方法
1、为解决相同时间的聊天只出现一次时间显示
1)在数据模型定义一个相同时间标识A
2)在控制器的模型数组getter方法里,利用在添加下一个数据记录的之前的时机获得数组最后一个元素,和将要加入的记录
比较,同时设置要加入记录的A标识是否时间相同
2、为解决数据不同导致的frame大小不一样(frame类)
1)在计算各控件frame大小时,要判断每个字段数据是否存在不同的可能
a:时间标识影响时间控件是否有frame b:消息发送者类型影响头像控件和信息控件 C:头像的Y和消息的Y影响cell高度
3、为解决发送消息在信息按钮内,同时按钮背景能局部拉伸适应发送文本的大小,完全容纳文本(cell类)
1)首先要知道消息文本实际上是按钮的标题内容,还有就是按钮的标题实际上显示在按钮的一个titleLabel子控件上的
2)设置文本字体大小,换行,按钮填充
chatView.tilteLabel.font = [UIFont systemFontOfSize:14];
charView.titleLabel.numberOfLines = 0;
charView.contentEdgeInsets = UIEdgeInsetsMake(30,30,30,30); 设置内边距
3) 对背景图片拉伸处理,让其适应控件frame大小,显示这个动作要放在控件设置frame
图片拉伸:UIImage *newSendImage = [self resiableImageWithName:@“chat_send_nor”];
设置背景图:[self.chatView setBackgroundImage:newSendImage forState:UIConrolStateNormal]
```
拉伸方法实现 因为按钮的边距各增加了20,所以让改变按钮的大小,增加40 ,// 由于背景,文字的大小要比按钮的实际大小上下左右均少textMargin
-(UIImage *)resiableImageWithName:(NSString *)name
{
UIImage *originalImage = [UIImage imageNamed:name];
CGFloat w = originalImage.size.width*0.5;
CGFloat h = originalImage.size.height*0.5;
return [originalImage resizableImageWithCapinsets:UIEdgeInsetsMake(h,w,h,w) resizingMode:UIImageResizingModeStretch];
}
-(UIImage *)resiableImageWithName:(NSString *)name
{
UIImage *originalImage = [UIImage imageNamed:name];
CGFloat w = originalImage.size.width*0.5;
CGFloat h = originalImage.size.height*0.5;
return [originalIma];
}
4、当滚动屏的时候 将键盘退出
在控制器里 实现代理方法
-(void)srcollViewWillBeginBraggng:(UIScrowView*)srcollView
{
[self.view endEditing:YES];
}
5、解决光标闪动位置
1)将文本框拖入控制器
2)利用文本控件.leftView,重写自定义个赋给它,然后
self.inputView.leftViewMode = UITextFieldViewModlAlways;
6、解决键盘覆盖文本框的问题 (通知机制)
1)订阅键盘frame即将改变的通知 在viewDidLoad里写
[[NSNotificationCenter defaultCenter] //指定默认通知中心
ddObserver:self //指定通知接受者
selector:@selector(keyboradWillChangeFrame:)//告诉接受者收到通知后作的动作
name:UIKeyboardWillChngeFrameNotification //说明是通知名
object:nil //指明是发布者:nil代表所有发布者
];
2)通知到达后zhi执行的方法,通知到达改变View的位置
-(void)keyboredWillChangeFrame:(NSNotificaiton *)noti
{
//NSLog(@“%@”,noti.userInfo);//打印通知内容
利用通知内容获取键盘的最终位置
CGRect keyBoardFrame = [noti.userInfo[@“UIKeyboradFrameEndUserInfoKey” CGRectValue]];
UIKeyboardFrameEndUserInfoKey
//用键盘的最终的y值 - view自身的高度就是要移动的距离
CGFloat ct = keyBoardFrame.origin.y - self.view.frame.size.height;
//获取键盘的动画时间
CGFLoat duration = [noti.userInfo[@“UIKeyboradAnimationDurationUserInfoKey”] floatValue];
[UIView animateWithDuraiton:duration aimations:^{
self.view.transform = CGAffineTransformMakeTranslation(0,ct);
}];
}
3)在对象销毁时,要将对象移除订阅队列(必写)
-(void)dealloc
{
[[NSNotificatinCenter defaultCenter] removeObserver:self];
}
4)%%点击cell 取消键盘
-(void)tochesBegan:(NSSet *)toches withEvent:(UIEvent *)event
{
[self.superview.superview.superview endEditing;YES];
}
7、点击回车发送问题
1)将文本框面板设置为:ReturnKey 打下面的勾
2)设置UITextField的代理
self.messageView.delegate = self;
3) 实现一点击键盘的确定按钮的代理方法
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
//回复信息
[self autoReplyWithString : textFiedl.text andType:HMMessageModelMe];
//自动回复
[self autoReplyWithString:@“自动回复”andType:HMMessageModelOther];
//清空文字
textField.text = nil;
return YES;
}
4)创建新数据,刷新界面
-(void)autoReplyWithString:(NSString *)replayString andType:(HMMessageModelType)type
{
HMMessageFrame *messageFrame = [[HMMessgeFrame alloc] init];
HMMessageModel *messgaeModel = [[HMessageModel alloc] init];
messageModel.text = replyString;
messageModel.type = type;
NSDate *now = [NSDate date];
NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init];
dateFormater.dateFormat = @“HH:mm”;
messageMode.time = [dateFormater stringFromeDate:now];
HMMessageFraom *lastFrame = [self.messageFrames lastObject];
if([lastFrame.messageModel isEqualToString:messageModel.time])
{
messageMode.hideTime = YES:
}
messageFrame.messageModel = messgeModel;
[self.messageFrams addObject:messageFrame];
[self.tableView reloadData];
[NSIndexPath *indexPath] = [NSIndexPath indexPathForRow:self.messageFrames.count -1 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPositioin:UITableViewSCrollPOsitionBottom animated:YES];
}
控件圆角效果
self.iconImageView.layer.cornerRadius = 25;
self.iconImageView.layer.masksToBounds = YES;
// 获取屏幕的宽度
CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
//4.通知中心发出通知
//postNotificationName:通知的名称
//object:通知的发出者,
//userInfo:通知的内容
[NSNotificationCenter defaultCenter]postNotificationName:@"junshi" object:tenxun userInfo:@{ @"title":@"伊拉克战争”}];