亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

QQ聊天界面的布局和設計(IOS篇)-第二季

2019-11-14 18:52:56
字體:
來源:轉載
供稿:網友

QQChat Layout - 第二季

  • 本來第二季是快寫好了, 也花了點功夫, 結果gitbook出了點問題, 給沒掉了。有些細節可能會一帶而過, 如有疑問, 相互交流進步~.

    在第一季中我們完成了QQ聊天界面的基本框架.但是相對于iphone上手機QQ的聊天界面還存在以下差距。

  • 第二季中的工程源文件下載地址:點擊到百度云下載
  • 聊天消息沒有左右區分。
  • 聊天內容沒有背景圖片。
  • 菜單欄還沒做出, 不能發消息。

現在我們就一步步來解決這些問題。首先我們解決消息沒有左右區分的問題。

  • 第四步:
    我們打開StoryBoard。拖入和左邊一樣的兩個控件ImageView和UIButton。并設置和左邊一樣的約束。具體的約束思路如下:


    1.設置ImageView距離右邊10 , 寬高為40==》確定了x,和寬高

    2.設置ImageView的上面和timeLabel下面對齊 ==》確定了Y, 確定了Button

    3.設置Button右邊距離ImageView左邊10, 固定寬高。

    4.設置Button的上面與ImageView上面對齊。


    SB圖片如下:

  • 修改完SB的cell界面后開始編碼了。我們主要需要在setMessage這個setter方法中, 加入判斷聊天消息是屬于左邊還是屬于右邊。具體邏輯如下:

- (void)setMessage:(Message *)message {    _message = message;    MessageWhoIsMe ==        _message.type?        [self setShowButton: _rightText andIcon: _rightIcon withMessage:message]:        [self setShowButton: _text andIcon: _icon withMessage:message];}/** *  設置要展示的消息內容與頭像 * *  @param button 設置要顯示的信息。 *  @param icon   設置要顯示的頭像 */- (void)setShowButton:(UIButton *)text andIcon:(UIImageView *)icon withMessage:(Message*)message{    _rightIcon.hidden = _rightText.hidden = (text != _rightText);    _icon.hidden = _text.hidden = (text != _text);    // 1.給控件裝數據    icon.image = [UIImage imageNamed:[self getPicture: message.type]];    [text setTitle:message.text forState:UIControlStateNormal];    _timeLabel.text = message.time;    // 2.裝完數據強制布局, 使得設置按鈕高度的值準確, 并且更新約束    [text layoutIfNeeded];    // 要先強制布局, 這時候更新約束才準確    // 更新約束, 使得按鈕的高度此時等于文本的高度。    [text updateConstraints:^(MASConstraintMaker *make) {        CGFloat textH = CGRectGetHeight(text.titleLabel.frame); //+ 30;        make.height.equalTo(textH);    }];    // 3.再次強制布局, 使得約束生效, 這樣獲取到的按鈕高度才準確    [text layoutIfNeeded];    CGFloat textH = CGRectGetMaxY(text.frame);    CGFloat iconH = CGRectGetMaxY(icon.frame);    CGFloat cellH = MAX(textH, iconH) + 10;    // 4.更新cell的高度到模型中    message.height = cellH;}

效果圖如下(已經實現了左右排列):

  • 第五步:
  • 我們已經完成了QQ消息的可以分左右排列, 接下去我們需要給消息上背景圖, 也就是設置按鈕的背景圖。由于按鈕有狀態,所以你不能操作它的圖片控件來給它設置圖, 應該用其提供的設置圖片的接口。具體的邏輯比較簡單。你可以直接看代碼,我主要講下[UIImage resizeWithImageName:的知識點。
    .....省略N行代碼    _timeLabel.text = message.time;    // 1.2 改進背景圖。    if (!_rightText.hidden) {    // 當前顯示的是右邊, 則設置右邊的背景        [_rightText setBackgroundImage:[UIImage resizeWithImageName:@"chat_send_nor"] forState:UIControlStateNormal];        [_rightText setBackgroundImage:[UIImage resizeWithImageName:@"chat_send_PRess_pic"] forState:UIControlStateHighlighted];    }else { // 顯示的是左邊        [_text setBackgroundImage:[UIImage resizeWithImageName:@"chat_recive_press_pic"] forState:UIControlStateNormal];        [_text setBackgroundImage:[UIImage resizeWithImageName:@"chat_recive_nor"] forState:UIControlStateHighlighted];    }    // 2.裝完數據強制布局, 使得設置按鈕高度的值準確, 并且更新約束    .....省略N行代碼
  • 具體的邏輯很簡單,但是我要介紹下圖片拉伸的知識。在實際項目中, 我們使用的資源圖片不可能是十分大的, 能小則小。不然很消耗內存。你可以打開工程看到, 這個工程中的資源圖片中消息背景圖。你可以嘗試把UIImage resizeWithImageName:替換成UIImage imageNamed:來加載圖片, 會發現,當按鈕中的文字變大時候,圖片還是那么大,也就說圖片沒有隨著按鈕的尺寸進行伸縮。好在蘋果已經為我們提供了一個方法來伸縮圖片。其實UIImage resizeWithImageName:只是我對Apple官方的方法的一個封裝, 并將它做成UIImage的分類
  • 細說-(UIImage *)resizableImageWithCapInsets:這個方法是Apple提供的Image類的實例方法。為了不誤導大家, 特意查了官方解釋如下:

    1.簡單來說該方法是用來返回一個可隨著Button尺寸自動伸縮的圖片,并且能保留住原來圖片的四個邊角, 也就說你要把它設置成Button的背景圖。
    ?2.該方法主要通過保護區域是不是有寬、高,和保護區域的大小來決定渲染的方式。當保護區域有高該圖片就是豎直可伸縮, 有寬則是水平可伸縮。當寬高都是1px時候,選用的渲染方式是直接把這1px的圖片扯大, 渲染的效率十分高。

??????那么究竟如何確定保護區域呢?根據官方文檔,我們最好將保護區域設置成1*1的大小。這樣水平、豎直方向都可以進行拉伸, 并且渲染方式也高, 還有一點就是這個區域我們最好選擇的是最靠近正中間的, 因為一般來說這樣才能盡可能把圖片邊緣切掉, 保證渲染出來的圖片和遠圖片看上去是放大后的效果。否則可能出現,圖片存在菱角。當然我們還能通過resizableImageWithCapInsets:resizingMode:來說明圖片渲染的模式,一種是使用拉伸來resize圖片, 一種是使用平鋪的方式來resize圖片.說了那么多, 你應該懂得了原理, 那么直接看我給UIImage擴充的分類方法吧。

#import "UIImage+Resizingable.h"@implementation UIImage (Resizingable)+ (UIImage *)resizeWithImageName:(NSString *)imageName {    UIImage * image = [UIImage imageNamed: imageName];    int W = image.size.width * 0.5;    int H = image.size.height * 0.5;    return [image resizableImageWithCapInsets: UIEdgeInsetsMake(H, W, image.size.height - H - 1 , image.size.width - W - 1)];}@end

第五步-1效果圖:

  • 你一定會看出還存在一點問題。問什么文字沒有全部被背景包括著,這是因為很多時候美工給的圖片背景都會有留白問題。也就是不是沒有被圖片包括著,是因為圖片旁邊有一些空白,顯示出來就成這樣了。這是后我們又可以利用按鈕的內邊距來把Label向左右推,這樣Label就會變高了,會超出Button,所以我們需要再給Button加點高度。應為給Button設置內邊距只需要設置一次,所以我一般將這種操作方法- (void)awakeFromNib方法中
- (void)awakeFromNib {    // 設置自動換行    _text.titleLabel.numberOfLines = 0;    _rightText.titleLabel.numberOfLines = 0;    // 設置button的內邊距    _text.contentEdgeInsets = UIEdgeInsetsMake(0, 30, 0, 30);    _rightText.contentEdgeInsets = UIEdgeInsetsMake(0, 30, 0, 30);}

更改Button的高度約束,多加30

    [text updateConstraints:^(MASConstraintMaker *make) {        CGFloat textH = CGRectGetHeight(text.titleLabel.frame)+ 30;        make.height.equalTo(textH);    }];

我覺得你會對內邊距存在很大的疑惑, 請看我的博客有專門介紹了下內邊距。

最終效果圖如下:

時間有限,菜單欄還介紹, 敬請關注第三季。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲亚洲妇女av| 日本欧美国产在线| 日韩中文字幕免费| 亚洲免费伊人电影在线观看av| 久久久久久国产三级电影| 欧洲亚洲女同hd| 欧美国产高跟鞋裸体秀xxxhd| 日本在线精品视频| 国产免费一区视频观看免费| 中文字幕精品一区二区精品| 日韩成人性视频| 精品偷拍各种wc美女嘘嘘| 国产999精品久久久| 久久91亚洲精品中文字幕奶水| 久久影视电视剧免费网站清宫辞电视| 少妇高潮久久久久久潘金莲| 成人网欧美在线视频| 中文字幕av一区二区| 久久久人成影片一区二区三区| 久久免费国产精品1| 成人免费视频97| 国产成人avxxxxx在线看| 亚洲成人国产精品| 伊人久久免费视频| 亚洲色图欧美制服丝袜另类第一页| 91在线免费视频| 亚洲图片制服诱惑| 欧美综合一区第一页| 精品国产美女在线| 欧美激情第1页| 国产一区二区精品丝袜| 精品亚洲一区二区三区在线播放| 亚洲成人亚洲激情| 亚洲高清不卡av| 欧美激情一区二区久久久| 国产精品三级在线| 日韩在线视频一区| 91影院在线免费观看视频| 日韩中文字在线| 久热精品视频在线| 亚洲一区二区三区成人在线视频精品| 亚洲欧美国产视频| 欧美精品video| 久久久久久久久久久免费精品| 欧美成人激情图片网| 欧美日韩一区二区在线| 国产偷国产偷亚洲清高网站| 久久91亚洲精品中文字幕奶水| 亚洲国产天堂网精品网站| 亚洲美女又黄又爽在线观看| 国产一区二区黄| 1769国内精品视频在线播放| 欧美久久精品一级黑人c片| 日本精品免费观看| 亚洲一区二区中文| 亚洲国模精品私拍| 欧美激情在线观看视频| 亚洲永久在线观看| 亚洲桃花岛网站| 国内伊人久久久久久网站视频| 成人欧美在线视频| 91国产精品电影| 日韩av在线影院| 中文字幕亚洲色图| 欧美激情伊人电影| 欧美人与物videos| 久久久免费观看视频| 亚洲欧美日韩图片| 亚洲综合色激情五月| 国内精品模特av私拍在线观看| 亚洲精品日韩激情在线电影| 欧美性高潮在线| 亚洲第一av在线| 国产成人亚洲综合青青| 亚洲在线免费视频| 国产精品va在线播放我和闺蜜| 久久久久久久久久久久av| 91在线国产电影| 国产丝袜视频一区| 国产成人精品免高潮费视频| 亚洲国产精品女人久久久| 亚洲国产日韩欧美在线99| 日韩电影视频免费| 国产精品精品一区二区三区午夜版| 欧美日韩成人在线视频| 成人午夜在线影院| 国产欧美一区二区三区久久人妖| 91九色视频导航| 狠狠躁18三区二区一区| 97视频免费在线看| 久久久久久九九九| 亚洲一区二区三区视频播放| 国产女精品视频网站免费| 亚洲一品av免费观看| 国产亚洲日本欧美韩国| 欧美午夜性色大片在线观看| 久久久欧美一区二区| 日韩在线视频线视频免费网站| 欧美精品性视频| 性欧美长视频免费观看不卡| 91精品国产色综合久久不卡98| 亚洲视频一区二区| 久久久精品欧美| 欧美日韩福利在线观看| 精品国产31久久久久久| 国产精品一区二区三区毛片淫片| 伊人成人开心激情综合网| 国产日韩欧美另类| 久久青草福利网站| 欧美另类老女人| 国产欧美一区二区三区久久人妖| 亚洲日本aⅴ片在线观看香蕉| 北条麻妃一区二区在线观看| 欧美综合在线观看| 日韩视频免费大全中文字幕| 国产成人精品久久久| 欧美激情三级免费| 97在线视频国产| 久久九九有精品国产23| 激情久久av一区av二区av三区| 欧美性猛交丰臀xxxxx网站| 中文字幕日韩在线观看| 成人激情电影一区二区| 欧美日韩国产综合新一区| 国产精品jizz在线观看麻豆| 国产精品久久久久久久久久久久| 尤物yw午夜国产精品视频| 亚洲最大av在线| 亚洲精品视频中文字幕| 亚洲性生活视频| 91精品在线播放| 欧洲成人性视频| 国产精品一二区| 亚洲视频在线观看免费| 久久久久久久久久久人体| 亚洲一级片在线看| 萌白酱国产一区二区| 91丝袜美腿美女视频网站| 日韩在线精品视频| 欧美一区二区三区免费视| 国产成人在线亚洲欧美| 尤物yw午夜国产精品视频| 日韩精品在线影院| 精品国产一区二区三区久久久| 777午夜精品福利在线观看| 日韩av免费在线播放| 精品久久中文字幕久久av| 国产一区二区日韩精品欧美精品| 92看片淫黄大片欧美看国产片| 亚洲欧美日本精品| 4438全国成人免费| 欧美视频在线看| 亚洲欧洲在线看| 欧美自拍视频在线观看| 96pao国产成视频永久免费| 欧美日本黄视频| 国产精品丝袜高跟| 亚洲色图色老头| 欧美成人午夜免费视在线看片| 国产精品久久久久不卡| 亚洲成人黄色网| 两个人的视频www国产精品| 日韩av在线导航| 国产一区二区三区久久精品|