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

首頁 > 系統 > iOS > 正文

IOS 聊天界面(自適應文字)的實現

2020-07-26 02:53:27
字體:
來源:轉載
供稿:網友

該篇文章主要介紹一個實現聊天界面的思路過程,源碼可以在 源碼鏈接 獲得,該工程實現聊天的基本功能,功能還不夠完善,歡迎大家提PR,效果圖如下所示

 

我希望通過相對簡單的方式實現界面的布局,沒有復雜的計算達到自適應的效果。

iOS8新功能介紹

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

在iOS 8 中,UITableView新增一項功能 self size cells,這是一項通過 UITableViewCell 的約束自動自動計算UITableView contentSize 的技術。這個新特性給我們帶來兩個個好處。

  • 我們不再需要為了自適應文字,去計算每個cell 中文字所需要的高度。
  • 而且有更高的性能。(因為UITableView每次reloadData的時候都會重新計算 cell 的高度,意味著如果有1萬個 cell 要展示,需要 調用heightForRowAtIndexPath一萬次,這效率是特別低的)

我們通過一個簡單的demo來介紹一下 Self Size Cells 的用法,demo 源碼

效果如圖

 

使用步驟是

  • 為UITableViewCell添加約束
  • 設置UITableView 的estimatedRowHeight屬性
  • 設置 rowHeight為 UITableViewAutomaticDimension
  • 有一點需要注意,代碼中不能實現heightForRowAtIndexPath 這個方法

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

 

用代碼來說就是(這里用到第三方庫 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)}

對于UILabel 來說還需要把numberOfLines置為0

然后設置UITableView的必要屬性

messageTable.estimatedRowHeight=44messageTable.rowHeight=UITableViewAutomaticDimension

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

實戰篇

接下來便是實戰部分,我希望在聊天頁面中使用self size cell 這個功能,聊天頁面的效果圖

 

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

 

問題

如果我想實現 一個功能像微信一樣下拉刷新,而且消息停留在原來的消息頁面上,如下圖所示

 

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

下面是實現平滑滾動的關鍵代碼

@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() }}

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

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

self size cell 主要給我們帶來兩個好處

  • 能夠得到更高的執行效率
  • 我們不需要為文字的frame進行復雜的計算 ,只需要設置width的約束和位置,就能夠得到自適應的Size

由于messageTable 消息的展示是通過分頁加載消息的方式,第一次只會添加20條的消息,也就不會出現調用heightForRowAtIndexPath時間過長的卡頓問題。但是如果用戶不斷的下拉刷新heightForRowAtIndexPath的執行時間也會出現線性的增加,所以為了減少這方面的時間開支,我們在每次成功加載一個新的cell 的時候把高度緩存起來,這樣就可以減少計算的時間,每次只需要計算新展現的歷史消息高度就可以了。

  • 第一個問題經過分析我們可以通過緩存高度的方式提高性能.
  • 對于第二點,也是最重要的一點,如何不通過手動計算獲得UITableViewCell所需要的高度,經過分析發現UITableViewCell 有一個方法systemLayoutSizeFittingSize可以計算返回自身的高度,所以我接下來生成一個全局的UITableViewCell 用于計算UITableViewCell 的高度這樣我們就不需要手動計算Cell的高度了。通過messageCell.systemLayoutSizeFittingSize(CGSizeZero).height + 1//這里的 +1 是為了彌補分隔線的高度

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

自適應輸入框

接下來,我們需要實現如下圖的效果,輸入框能夠自適應輸入文字的大小JChatInputView

我們需要輸入框能夠自適應文本的大小,我們

需要給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 添加如下約束。不需要添加高度約束, 因為inputWarpView的高度由TextView 的高度和其他約束計算得出

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

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69久久夜色精品国产69乱青草| 成人欧美一区二区三区在线| 日韩经典中文字幕| 成人av在线亚洲| 全色精品综合影院| 亚洲自拍欧美色图| 欧美激情一级精品国产| 黄色一区二区三区| 性亚洲最疯狂xxxx高清| 国产97在线视频| 国产精品福利观看| 欧美视频中文字幕在线| 91po在线观看91精品国产性色| 日韩一二三在线视频播| 欧美日本高清视频| 91精品国产91久久久久久吃药| 成人黄色午夜影院| 久久久黄色av| 亚洲第一视频网站| 亚洲成人网av| 91av在线网站| 久久精品国产一区二区电影| 都市激情亚洲色图| 一区二区三区四区视频| 久久精品国产亚洲精品| 亚洲性视频网址| 日韩精品中文字幕久久臀| 国产91成人在在线播放| 性欧美在线看片a免费观看| 久久久女人电视剧免费播放下载| 国产亚洲福利一区| 日韩免费黄色av| 97久久精品人搡人人玩| 精品一区精品二区| 精品美女久久久久久免费| 欧美日韩国产综合新一区| 久久久免费观看视频| 久久av资源网站| 欧美日韩国产页| 国产自产女人91一区在线观看| 亚洲国产天堂网精品网站| 日韩久久午夜影院| 九九九热精品免费视频观看网站| 国内精品小视频| 精品欧美aⅴ在线网站| 精品国偷自产在线视频| 色先锋资源久久综合5566| 国产精品视频午夜| 最近2019中文字幕大全第二页| 97成人精品视频在线观看| 亚洲欧美国产精品专区久久| 日韩风俗一区 二区| 国产69精品久久久久9999| 久久久亚洲福利精品午夜| 日韩在线资源网| 国内精品久久久久久久久| 久久久久久久久久久久久久久久久久av| 亚洲欧美在线免费观看| 国产精品偷伦免费视频观看的| 欧美亚洲另类激情另类| 欧美电影免费观看高清完整| 国产高清视频一区三区| 色婷婷综合成人av| 国产精品日韩一区| 久久精品国产96久久久香蕉| 欧美做受高潮电影o| 国产欧美在线视频| 欧美乱人伦中文字幕在线| 亚洲国产精品久久| 精品国产一区久久久| 精品成人av一区| 91中文精品字幕在线视频| 亚洲精品国产综合区久久久久久久| 狠狠色噜噜狠狠狠狠97| 中文字幕久久久av一区| 亚洲视频自拍偷拍| 日韩av资源在线播放| 成人在线精品视频| 欧美最猛性xxxxx(亚洲精品)| 欧美大片免费观看在线观看网站推荐| 亚洲理论在线a中文字幕| 91国内在线视频| 中文字幕日本欧美| 日韩欧美在线观看视频| 9.1国产丝袜在线观看| 国产精品久久久久久av福利软件| 中文字幕久热精品在线视频| 日韩视频―中文字幕| www日韩欧美| 亚洲国产三级网| 久久91精品国产91久久跳| 亚洲国产精品va在线看黑人| 久久久亚洲福利精品午夜| 精品视频偷偷看在线观看| 日本国产精品视频| 欧美一区三区三区高中清蜜桃| 日韩av在线播放资源| 日韩www在线| 国产精品久久久久aaaa九色| 一本大道亚洲视频| 亚洲va男人天堂| 欧美激情2020午夜免费观看| 亚洲一区二区三区乱码aⅴ| 国模视频一区二区| 国产第一区电影| 庆余年2免费日韩剧观看大牛| 国产精品嫩草影院一区二区| 国产亚洲综合久久| 欧美小视频在线观看| 色播久久人人爽人人爽人人片视av| 91久久久久久久一区二区| 成人网在线免费观看| 久久这里有精品视频| 久久久久中文字幕2018| 久久精品国产96久久久香蕉| 欧美xxxx14xxxxx性爽| 亚洲国产日韩精品在线| 欧美中文在线视频| 久久夜精品va视频免费观看| 亚洲最大的av网站| 国产精品久久久一区| 国产精品久久97| 国产中文字幕亚洲| 最近中文字幕2019免费| www.亚洲男人天堂| 色偷偷9999www| 超碰91人人草人人干| 日韩在线观看免费网站| 不卡毛片在线看| 亚州成人av在线| 日韩视频免费在线观看| 国产性色av一区二区| 九九久久国产精品| 91欧美精品午夜性色福利在线| 欧美极品少妇与黑人| 尤物精品国产第一福利三区| 日韩黄色av网站| 亚洲性猛交xxxxwww| 国产成人精品在线| 国产精品1区2区在线观看| 久久久www成人免费精品张筱雨| 亚洲最大福利视频网| 欧美激情视频给我| 日韩av日韩在线观看| 亚洲精品美女在线观看| 青青草原成人在线视频| 日本精品在线视频| 久热99视频在线观看| 性欧美视频videos6一9| 久久99久久99精品中文字幕| 日韩电影网在线| 精品久久久久久亚洲国产300| 日av在线播放中文不卡| 国产精品视频在线播放| 欧美在线视频在线播放完整版免费观看| 中文字幕国产亚洲| 亚洲毛片在线观看| 性欧美长视频免费观看不卡| 狠狠操狠狠色综合网| 国产精国产精品| 亚洲天堂免费视频| 国产精品91在线| 一本大道久久加勒比香蕉| 68精品国产免费久久久久久婷婷|