從開始學習ios時,做這個小項目就卡了很久,到現在這個小項目算是我做的比較熟練的一個了,大概模型做出來了,做的比較粗糙,看起來挺挫的,呵呵。oc和swift兩個版本都順利完成了。因此總結一下曾經在這個小項目中遇到的種種問題!
效果圖:

微信聊天界面主要內容有五部分構成:
1.TableView部分,設置好各種必須的代理;
2.TableViewCell部分,在自定義cell中要設置好三個控件的位置,這也是整個過程中最麻煩的部分;
3.設置TextField部分發送消息時,界面消息的刷新和TextField代理的設置。
4.設置ejabberd服務器。
5.通過xmpp實現通信。
第一部分:
主要設置TableView的必備代理;
cell的高度,section的數量,rownumber的數量,cell這幾個簡單的設置。需要注意的是:在設置單元格高度的時候需要計算出每次聊天內容的長度,通過聊天內容的高度來動態計算cell的高度。
第二部分:
在聊天過程中,由於兩個人的頭像和對話框在界面的兩邊,因此需要判斷朋友和自己的不同位置。

在cell中主要設置三個控件的位置-->[頭像(UIImageView),聊天氣泡(UIImageView),聊天文字(UILabel)],通過動態計算各自控件的frame。
頭像的大小固定設置,注意:聊天內容和氣泡的大小,主要通過計算輸入文字的長度,這個size的大小通過這個方法:
#define talkMax 200 @implementation UILabel (Resize) -(CGSize)Resize:(NSString *)message{ NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:17]}; CGSize size = [message boundingRectWithSize:CGSizeMake(talkMax, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:attribute context:nil].size; return size; }
其次需要注意的是:氣泡圖片的如果按照原圖設計會失真,因此通過類別為UIImage添加一個新方法:
-(UIImage *)Resize:(UIImage *)image{ float top = image.size.width * 0.6; float buttom = image.size.width * 0.5; float avar = image.size.width * 0.5; return [image resizableImageWithCapInsets:UIEdgeInsetsMake(top, avar, buttom, avar) resizingMode:UIImageResizingModeStretch]; }
第三部分:
自己消息的發送通過textfield的代理來推送實現,在nsmutablearray中添加新數據,並更新tableview數據。
由於每次編輯聊天內容時都會彈出鍵盤,遮住textfield,我們通過一個kvo廣播來得到鍵盤的高度和彈出動畫時間,然后加一個動畫效果來實現鍵盤和textfield一起移動。具體實現在鍵盤高度設定那篇隨筆中有詳細描述。
第四部分:
ejabberd虛擬服務器的配置,只需要設置好自己的用戶域名,添加一些好友進去就可以實現。好友的聊天客戶端通過mac自帶的Imessage或者Aduim添加一個ejabberd賬戶就可以了。
注:在使用ejabberd服務器時,登錄頁面並輸入用戶名和密碼后並未出現登錄頁,不知道是否瀏覽器問題,需要再次start一次ejabberd,便可登錄了。


第五部分:
使用xmpp來實現消息的收發和好友狀態的改變,以及用戶登錄。
在xmpp簡單介紹中有詳細使用方法。
以上各點就是我在做這個小項目的過程中遇到的一些小問題。
