欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

IOS如何實(shí)現(xiàn)聊天界面

小編給大家分享一下IOS如何實(shí)現(xiàn)聊天界面,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在福綿等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷,成都外貿(mào)網(wǎng)站建設(shè),福綿網(wǎng)站建設(shè)費(fèi)用合理。

效果圖如下所示

 IOS如何實(shí)現(xiàn)聊天界面

IOS如何實(shí)現(xiàn)聊天界面

我希望通過相對(duì)簡(jiǎn)單的方式實(shí)現(xiàn)界面的布局,沒有復(fù)雜的計(jì)算達(dá)到自適應(yīng)的效果。

iOS8新功能介紹

雖然self size cell最終沒有在我的工程中用到,但是這是我曾經(jīng)挖過的坑,所以在此做了簡(jiǎn)單的介紹。

在iOS 8 中,UITableView新增一項(xiàng)功能 self size cells,這是一項(xiàng)通過 UITableViewCell 的約束自動(dòng)自動(dòng)計(jì)算UITableView contentSize 的技術(shù)。這個(gè)新特性給我們帶來兩個(gè)個(gè)好處。

  • 我們不再需要為了自適應(yīng)文字,去計(jì)算每個(gè)cell 中文字所需要的高度。

  • 而且有更高的性能。(因?yàn)閁ITableView每次reloadData的時(shí)候都會(huì)重新計(jì)算 cell 的高度,意味著如果有1萬個(gè) cell 要展示,需要 調(diào)用heightForRowAtIndexPath一萬次,這效率是特別低的)

我們通過一個(gè)簡(jiǎn)單的demo來介紹一下 Self Size Cells 的用法,demo 源碼

效果如圖

 IOS如何實(shí)現(xiàn)聊天界面

使用步驟是

  • 為UITableViewCell添加約束

  • 設(shè)置UITableView 的estimatedRowHeight屬性

  • 設(shè)置 rowHeight為 UITableViewAutomaticDimension

  • 有一點(diǎn)需要注意,代碼中不能實(shí)現(xiàn)heightForRowAtIndexPath 這個(gè)方法

添加約束,有一個(gè)原則是,除了自適應(yīng)text的高度不需要約束外,需要確定所有必要約束

 IOS如何實(shí)現(xiàn)聊天界面

用代碼來說就是(這里用到第三方庫(kù) SnapKit 做代碼約束 SnapKit 傳送門)

textview.snp_makeConstraints{ (make)in
 make.top.equalTo(self.contentView).offset(15)
 make.width.equalTo(100)
 make.left.equalTo(self.contentView).offset(15)
 make.bottom.equalTo(self.contentView).offset(-15)
}

對(duì)于UILabel 來說還需要把numberOfLines置為0

然后設(shè)置UITableView的必要屬性

messageTable.estimatedRowHeight=44
messageTable.rowHeight=UITableViewAutomaticDimension

以上便是,使用self size cell 的所有步驟。

實(shí)戰(zhàn)篇

接下來便是實(shí)戰(zhàn)部分,我希望在聊天頁(yè)面中使用self size cell 這個(gè)功能,聊天頁(yè)面的效果圖

 IOS如何實(shí)現(xiàn)聊天界面

以下下是我為messageCell 制作約束圖,事實(shí)上用的是代碼約束,詳情可以查看我的源碼

 IOS如何實(shí)現(xiàn)聊天界面

問題

如果我想實(shí)現(xiàn) 一個(gè)功能像微信一樣下拉刷新,而且消息停留在原來的消息頁(yè)面上,如下圖所示

 IOS如何實(shí)現(xiàn)聊天界面

分析:在刷新數(shù)據(jù)后 調(diào)用tableview.reloadData 方法,可以刷新tableview 顯示的數(shù)據(jù),不過tableview 會(huì)滾動(dòng)到最頂部。幸運(yùn)的是tableView是UIScrollView的子類,如果我們改變了內(nèi)容,contentSize 這個(gè)屬性一定會(huì)改變,也就是說系統(tǒng)一定會(huì)掉用contentSize的set方法。如果我們重新這個(gè)set 方法,在每次掉用setContentSize 的時(shí)候計(jì)算出之前視窗所在的位置,并且在設(shè)置完contentSize后移動(dòng)到計(jì)算號(hào)的位置,就能平滑的上拉加載更多的歷史消息了。

下面是實(shí)現(xiàn)平滑滾動(dòng)的關(guān)鍵代碼

@objc(JChatMessageTable)
class JChatMessageTable: UITableView {
 var isFlashToLoad:Bool! = false
 override var contentSize: CGSize {
 didSet {
 if self.isFlashToLoad != false {
 if !CGSizeEqualToSize(self.contentSize, CGSizeZero) {
 if oldValue.height < self.contentSize.height {
 var offset = self.contentOffset
 offset.y = self.contentSize.height - oldValue.height
 self.contentOffset = offset
 }
 }
 }
 self.isFlashToLoad = false
 }
 }
 override init(frame: CGRect, style: UITableViewStyle) {
 super.init(frame: frame, style: style)
 }
 required init?(coder aDecoder: NSCoder) {
 fatalError("init(coder:) has not been implemented")
 }
 func loadMoreMessage() {
 self.isFlashToLoad = true
 self.reloadData()
 }
}

想法是好的,但是現(xiàn)實(shí)總是殘酷的,在具體實(shí)行的時(shí)候出現(xiàn)了一個(gè)新的問題,因?yàn)槲矣玫氖荢elf size cell 來自適應(yīng)UITableView的contentSize的, Self size cell 在處理UITableView 的contentSize時(shí)候并不是一次性賦值成功的,它是每5個(gè)點(diǎn)的增加height(contentSize.height),直到合適的高度位置, 也就是說 contentSize的 Set 方法會(huì)被掉用很多次,而且上面的代碼完全沒有作用(可以想象結(jié)果是只有最后一次掉用contentSize的Set方法起到了作用小于5個(gè)點(diǎn)的偏移量,由于這個(gè)變化真的很小,我也是在這個(gè)地方被坑了一次),由于 Self size cells 的這個(gè)特性,似乎很難實(shí)現(xiàn)這個(gè)功能。

此時(shí)我果斷放棄了使用Self Size Cells ,雖然比較心痛,不過我們大致了解了Self size cell 是如何自適應(yīng)高度的。

self size cell 主要給我們帶來兩個(gè)好處

  • 能夠得到更高的執(zhí)行效率

  • 我們不需要為文字的frame進(jìn)行復(fù)雜的計(jì)算 ,只需要設(shè)置width的約束和位置,就能夠得到自適應(yīng)的Size

由于messageTable 消息的展示是通過分頁(yè)加載消息的方式,第一次只會(huì)添加20條的消息,也就不會(huì)出現(xiàn)調(diào)用heightForRowAtIndexPath時(shí)間過長(zhǎng)的卡頓問題。但是如果用戶不斷的下拉刷新heightForRowAtIndexPath的執(zhí)行時(shí)間也會(huì)出現(xiàn)線性的增加,所以為了減少這方面的時(shí)間開支,我們?cè)诿看纬晒虞d一個(gè)新的cell 的時(shí)候把高度緩存起來,這樣就可以減少計(jì)算的時(shí)間,每次只需要計(jì)算新展現(xiàn)的歷史消息高度就可以了。

  • 第一個(gè)問題經(jīng)過分析我們可以通過緩存高度的方式提高性能.

  • 對(duì)于第二點(diǎn),也是最重要的一點(diǎn),如何不通過手動(dòng)計(jì)算獲得UITableViewCell所需要的高度,經(jīng)過分析發(fā)現(xiàn)UITableViewCell 有一個(gè)方法systemLayoutSizeFittingSize可以計(jì)算返回自身的高度,所以我接下來生成一個(gè)全局的UITableViewCell 用于計(jì)算UITableViewCell 的高度這樣我們就不需要手動(dòng)計(jì)算Cell的高度了。通過messageCell.systemLayoutSizeFittingSize(CGSizeZero).height + 1//這里的 +1 是為了彌補(bǔ)分隔線的高度

返回的高度就是UITableView所需要的高度。

自適應(yīng)輸入框

接下來,我們需要實(shí)現(xiàn)如下圖的效果,輸入框能夠自適應(yīng)輸入文字的大小JChatInputView

IOS如何實(shí)現(xiàn)聊天界面

我們需要輸入框能夠自適應(yīng)文本的大小,我們

IOS如何實(shí)現(xiàn)聊天界面

需要給TextView 添加如下約束

inputTextView?.snp_makeConstraints(closure: { (make) ->Voidin
 make.right.equalTo(self.showMoreBtn.snp_left).offset(-5)
 make.left.equalTo(self.switchBtn.snp_right).offset(5)
 make.top.equalTo(inputWrapView).offset(5)
 make.bottom.equalTo(inputWrapView).offset(-5)
 make.height.greaterThanOrEqualTo(30)
 make.height.lessThanOrEqualTo(100)
})

inputWarpView 添加如下約束。不需要添加高度約束, 因?yàn)閕nputWarpView的高度由TextView 的高度和其他約束計(jì)算得出

inputTextView?.snp_makeConstraints(closure: { (make) ->Voidin
 make.right.bottom.left.equalTo(superView)
})

到此介紹了一個(gè)聊天界面的自適應(yīng)UI部分,靈活的使用約束可以減少大量的代碼。

看完了這篇文章,相信你對(duì)“IOS如何實(shí)現(xiàn)聊天界面”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享標(biāo)題:IOS如何實(shí)現(xiàn)聊天界面
標(biāo)題鏈接:http://aaarwkj.com/article30/pdepso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)企業(yè)建站、網(wǎng)頁(yè)設(shè)計(jì)公司、搜索引擎優(yōu)化品牌網(wǎng)站設(shè)計(jì)、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
在线视频日韩欧美国产二区| 国产精品无卡无在线播放| 免费国产中文字幕黄网站| 免费直接在线看亚洲黄色| 92午夜福利精品视频| 国产亚洲精品精品国产亚洲 | 日本一区二区三区加勒比| 欧美一区二区黑人巨大| 婷婷色中文字幕综合在线| 国产亚洲精品第一最新| 在线观看亚洲毛片网站| 国产在线精品91系列| 中文字幕国产精品一区二| 久久亚洲精品综合一区| 国产一区二区三区精品女同| 未满十八禁止免费视频| 亚洲一区精品中文字幕| 宅男午夜一区二区三区| 国产精品毛片av在线| 免费国产三级在线观看| 欧美老熟妇一区二区三区| 中文字幕日韩欧美资源站| 日韩在线不卡视频一区 | 欧美激情另类综合国内| 视频一区视频二区三区| 亚洲国产精品一区二区三区| 久久综合久中文字幕青草| 国产福利午夜一区二区| 国内精品av在线观看| 六月综合激情丁香婷婷色| a一级成人插少妇的逼| 国产乱码精品一区二区三区爽爽爽| 日本免费一区二区三区四区视频| 国产日韩欧美一区二区丝袜| 日韩精品第一区第二区| 精品视频一区二区三区中文字幕| 91桃色午夜福利视频| 日韩人成理论午夜福利| 精品爆白浆一区二区三区| 懂色av中文字幕一区| 中文字幕乱码在线观看一区|