## 精華界面不等高cell的搭建
1 . 精華界面搭建,tableview展示數據;
不等高cell(復雜界面)
1.1 劃分結構(功能結構)top view ?middle ?view ? 最熱評論view? 底部的view
1.2 搭建界面方式:純代碼 (因為有些結構不確定是否顯示)
1.3. 當cell一開始創建的時候,把所有子結構全部添加上去;
知識點:
通過注冊class創建cell;那么cell創建的 方式initwithStyle
通過代碼創建cell,必定來initwithStyle 方法
不會來到initWithframe
什么時候來到initWithframe方法呢?控件通過init方法 才會執行initWithframe
通過XIB就必定來到 awarkFromeNib ;
A .cell不同架構流程思想:
1.頂部view的展示:
自定義cell,因為有些功能系統可能實現不了,所以需要自定義cell;
由于整個cell可以大致分為4個模塊,并且都有自己的功能與邏輯;再自定義View.XIB;
2.數據傳值;
自定義cell中拿不到XIB中控件,傳不了值;需要跨多個類傳值;
所以每個類當中定義模型屬性。傳值,重寫set方法;
3.計算cell的frame
在哪里計算?
一般是在heightForRowAtIndexPath:方法中進行計算,但是這個方法調用頻率非常高;所以最好只需要計算一次就行;在數據請求成功的時候,但是cell還沒有刷新的時候就計算好高度就可以;
疑問:在顯示cell的時候,為什么文字有的能顯示,有的只顯示一半,有的超過了cell的高度;
猜算,估計是cell的循環利用出現錯誤;
4.MVVM思想:
將模型中保存的數據給到視圖模型;取數據,存數據都是存視圖模型當中;
VM專門去處理視圖業務邏輯,計算視圖子控件frame
抽取思路:
a. 創建視圖模型 (nsobject)
b. 請求數據,字典數組變成模型數組,定義指針指向他;
c. 遍歷模型數組;創建視圖模型,將遍歷出的模型數據給到視圖模型;
d. 視圖模型:定義模型屬性保存傳入的數據;
注意:在傳值的時候就直接把cell的frame計算出來;
e. ?重寫set方法;在set方法中給cell計算尺寸;
f. 在外面定義屬性保存cell的frame;和topView的frame
為什么要定義兩個?、??
因為一個cell里面包含了topview,還有其他的view,并且之后的view都是添加到top view的后面的;
B .中間圖片展示
1.架構搭建;
為什么要用XIB去做???
因為中間的圖片有可能顯示圖片,視頻,音頻。或者不顯示;那這個時候就不怎么好去做,只要是不確定的控件,
該隱藏的隱藏,不該隱藏的就顯示,做個判斷就可以;
A. 注意點,在進行命名的時候;一定不要把XIB的名字設置成跟某一個控制器的名稱一樣;如果一樣,那么在加載過程中,底層會先判斷該文件當中,有沒有同名的view,或者去掉controller的view,只要有一個符合,那么控制器首先就會去加載這些相同的view;
B.描述XIB時,他的frame不用去管,只需要確定內部子控件的約束就行;具體的frame在外面才計算
C.設置picture view的尺寸,它的Y值是以top view ?cell 的高度為基準;
D.不要犯SB錯誤了;
因為在initwithstyle 方法中加載picture view的時候,盡然用了alloc ?init ?,卻沒有調用加載XIB的類方法;死活出不來數據
C.中間圖片的細節處理
問題1. GIF圖,不是大圖,就把點擊查看大圖按鈕隱藏起來;
問題2 . 大圖又太長。并且有些大圖寬度是不夠的,如何解決?
設置圖片的高度的時候,判斷H是大于屏幕的高度,是的就將H定在某個值;并且記錄當前是大圖,賦值Yes;
在下載圖片完成的時候,將圖片畫出來;
畫之前,最好判斷是不是大圖,不是就不用畫;
a.開啟圖形上下文;帶有三個參數的;第一個,繪畫的范圍;第二,填NO 第三 。0 就行
b。畫圖
c. 獲取繪畫的圖片;
d.關閉上下文,
e.將最新的圖片賦值回去;
D.下載進度條的處理
進度條,一般都是去github去搜索,別人的一些框架;都是下載回來就用
利用終端下載框架;
包含頭文件
思路:
1.控件通過XIB,一定會來到awerkFromeNib方法;
a.設置進度條的顏色,以及進度值;
2.重寫SET方法
a.圖片下載到到沙盒
b. 如果沙盒中有,直接讓進度條變為0;不下載;
c.如果沒有,就下載;
事先把進度條清0;利用SD框架下載
如何讓下載的進度顯示文,真實的數據滾動???想要顯示進度條,在progress中顯示;
E,視頻界面搭建處理
視屏也用XIB描述
a. 他的frame只需要設置一次就可以了,將frame修改為統一的屬性描述;
b.如何加載視屏類型???
c.在加載數據的時候,增加相對應的參數值,下載的數據就會不一樣;
d.模型中添加界面需要的屬性值;
e.cell中獲取數據的時候,判斷一下,返回的是什么類型的參數;不要的隱藏,要的顯示;
f. ? 拿到控件進行賦值的時候;要求記錄多少時間;
g.每個類都需要加載XIB,并且擁有模型屬性;
抽取一個基類,將模型,加載XIB方法,添加進去,子類繼承他自然就會有父類的方法
G: 音頻界面搭建處理:
a.音頻I的XIB搭建;
b.cell中傳遞數據信息,進行判斷; 類型是音頻,就把其他控件,視頻,圖片隱藏; 不是音 ? ? ?頻,就全部隱藏,就是段子
c.數據賦值注意點
時間的算法跟上圖的一樣;
H:最熱評論view搭建,分析
a. 有可能出現兩種不同的情況;
1.只有評論,沒有聲音;
2.只有聲音,沒有評論;
XIB中評論先確定好位置;然后再往lable上面添加一個view;view里面放其他控件;
b. 搭建完,查看數據并設置模型屬性
1.特點,數組中包含字典,字典包含字典;復雜層次結構;
解決思路:開發中碰到這種情況;一般是一個字典對應一個模型;如果用數組去解決的話,很麻煩;
1.1 利用MJ框架,MJ框架底層是在做什么事情呢?
mj框架轉模型,底層會去遍歷模型的屬性;去文件中找,找到了就會幫他去賦值;
1.2,如何將數組中的值轉換到模型屬性中去?
取出數組中的第一個字典,kvc將字典轉換成模型;
2。尺寸設定問題:
1. 視圖模型中去寫尺寸;視圖模型專門處理這些視圖控件的業務邏輯
1.1 判斷是否是評論模型
判斷模型中的屬性有沒有內容(文字),只要是判斷,文字的內容就用length
是 ==》計算文字的內容;根據內容計算文字高度;
不是 ===》 另外計算;
1.2. 在view中對控件賦值;
還是先判斷模型中有沒有內容長度;
有===》就是文字評論 ? 對文字進行一個拼接;
沒有===》語音音頻;