2015年07月11日第八天笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu_4074/article/details/46957237

细节归纳
一、控制器里的细节
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":@"伊拉克战争”}];

猜你喜欢

转载自blog.csdn.net/yu_4074/article/details/46957237
今日推荐