zoukankan      html  css  js  c++  java
  • (二十一)即时通信的聊天气泡的实现II

    一些优化:

    禁止TableView的点击:

    self.tableView.allowsSelection = NO;

    合并相同的时间:

    不需要显示的时间,只要不设置尺寸就行了。

    一个if判断的技巧,为了防止把==写成赋值,可以让左边的为非左值:

    NO == message.hideTime


    对于时间的判断,应该放在所有模型加载的地方(懒加载的位置)。

    为了得到上一条消息,由于使用的是for-in语句,无法获得index,但是由于临时数组在循环的最后才加入这一次循环操作的模型,因此在下一次循环开始时,临时数组中的lastObject存的正是上一次的消息模型,只需要判断二者的字符串是否全等即可,不必判断是否上一条消息为nil,因为nil的所有操作都会得到nil

    - (NSMutableArray *)messageFrames{
        
        if (_messageFrames == nil) {
            
            NSString *path = [[NSBundle mainBundle] pathForResource:@"messages.plist" ofType:nil];
            NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
            NSMutableArray *mfArray = [NSMutableArray array];
            for (NSDictionary *dict in dictArray) {
                Message *msg = [Message messageWithDict:dict];
                
                //取出上一个模型:利用mfArray的LastObject
                MessageFrame *lastMf = [mfArray lastObject];
                Message *lastMsg = lastMf.message;
                
                msg.hideTime = [msg.time isEqualToString:lastMsg.time];
                
                MessageFrame *mf = [[MessageFrame alloc] init];
                
                mf.message = msg;
                
                [mfArray addObject:mf];
            }
            _messageFrames = mfArray;
        }
        
        return _messageFrames;
        
    }
    

    接下来需要解决的就是聊天气泡的Button了,由于Button需要多次改变,在自定义Cell内里面进行调整。
    聊天气泡的图片大小是有限的,为了能大幅度拉伸图片又不影响图片质量,可以进行局部像素复制拉伸;也可以把气泡按钮加大,把label缩小(设置内边距)。

    聊天气泡是通过一个按钮和设置按钮的titleLabel实现的,如果只改变titleLabel的内边距,会使得图片上下超出按钮的边界,如下图所示:


    为了让按钮的title居中后压缩不会超出按钮边界,设内边距的值为x,那么先把按钮的宽高都增加2x,这样当标题居中后,四周都留下了x的“防线”,这样再压缩标题就不会超出边界了。


    但是按钮过大会使得图片失真和变形严重,应该采用另一种做法,复制图片的中间像素。


    代码的实现:

    在iOS5以前,使用的方法是告诉左边和上边,拉伸的是左边向下一个,上边向下一个的像素。

    在iOS5和以后,有一个新的方法可以提供这四条线来拉伸(安全起见是锁定最中间的像素),例如图片大小是64x56个点(注意用点表示),应该左右各31,上下各27。

    在iOS6和以后,可以设定平铺(tile)还是拉伸(stretch)。

    最应该注意的是,这个方法返回的是一个新的图片,必须重新赋值再试用

    UIImage *normal = [UIImage imageNamed:@"chat_send_nor"];
    UIImage *lastNoraml = [normal resizableImageWithCapInsets:UIEdgeInsetsMake(27, 31, 27, 31)];
    [self.textView setBackgroundImage:lastNoraml forState:UIControlStateNormal];

    注意按钮的文字颜色不能使用titleLabel.textColor,因为是分状态的,应该有setTitleColor方法

    [self.textView setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];



  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154232.html
Copyright © 2011-2022 走看看