首先說明我不知道這個方法,有沒有人知道或者已經玩熟了。但這個東西是我本身想出來。
1給UIView配置單獨的XIB佈局
好,咱們廢話很少說開始,這種方式是我在作一個極其複雜的彈出視圖時想出來的,也是用來作這個的,若是是一個ViewController的話感受不合適因此才決定在這麼作的。測試
第一步1 咱們須要新建一個UIView的類,咱們看到這裏的xib是勾選不了的。咱們要作就是讓它有xib文件 ui
而後咱們新建一個和這個類名同樣的XIB文件command+n 選擇User interface 裏面的View 記住這裏的名字必定要和剛纔咱們新建的UIView類相呼應要一致
OK 咱們的準備工做已經作完了,一共三個文件 HeaderView_Test.h
HeaderView_Test.m
HeaderView_Test.xib
肯定有了這三個文件以後咱們就能夠作配置了atom
咱們打開xib文件 看到一個大方塊的View 我通常會選擇最小的適配3.5英寸的爲了適配Iphone4 寬度320高度480的設備 選擇這種是彈出窗口會佔用整個視圖的咱們也能夠選擇大的,反正視圖裏面想怎麼用想怎麼玩均可以。不要限制。spa
而後咱們選擇右邊第三個檢查器有的人也叫屬性配置器或者控件配置區,無論它叫什麼咱們選擇第三個 而後看到第一個配置的是 Custom Class 好咱們就動它 默認的是UIView類。咱們在這裏填上咱們剛纔新建的UIView類 HeaderView_Test 而後回車讓它確認這個View是繼承自咱們選擇的類
OK 完成了這裏剩下的就是代碼部分了。code
咱們回到HeaderView_Test.h 文件中定義一個靜態方法 也就是類方法 。讓其返回一個本身類對象自己對象
+(HeaderView_Test*)AcquireCustomView;
咱們不須要傳任何參數只須要返回對象自己,通過這個方法處理完的對象自己是通過xib 初始化出來的,這就是這種方式的關鍵點,咱們不須要用代碼加約束和代碼寫子View。要作的就是像普通ViewController的xib文件同樣畫你須要的視圖和操做正常XIB同樣
好 ,咱們隨便拖兩個按鈕或者什麼其餘的鬼東西,通常是彈出視圖因此咱們須要 背景是毛玻璃 你能夠直接調整View的顏色,也能夠放張ImageView作底放一張毛玻璃的圖片,而後把控件放在imageView上面 我這裏是測試一個TableView的HeaderView 因此放的比較小。大家按需求來作。繼承
到了這裏,咱們開始寫關鍵代碼在咱們HeaderView_Test.m文件中實現咱們剛纔聲明的方法圖片
+(HeaderView_Test*)AcquireCustomView { //咱們這裏須要把這個xib加載出來而這個xib的所擁有者就是當前的對象`instantiateWithOwner:`這個方法就是對此xib文件進行擁有者關聯,關聯這個xib是屬於哪個類的咱們固然這是self HeaderView_Test*View = [[UINib nibWithNibName:@"HeaderView_Test" bundle:nil]instantiateWithOwner:self options:nil].lastObject; return View; }
如今驗證一下咱們的類和這個xib有沒有關聯,其實早就關聯了只不過這裏纔是關聯實例化這個xib裏面控件的關鍵步驟。理論上也是實例化xib裏面的控件也是經過上面的代碼的完成的 。it
咱們從剛纔的xib裏面拖根線 定義一個屬性給這個當前類HeaderView_Test
是否是能夠了,咱們如今定義這些屬性。這裏講一點我無心間發現的一個奇怪的東西。其實咱們連線而後去掉線,其實至關於給這個類定義了一個屬性,只不過沒有實例化而已,若是實例化了這個被斷掉線的屬性的話,其實也能夠用,這個東西等完了說這個講起來有點麻煩要看圖。
好咱們繼續,如今咱們只是把這個View給建立並鏈接了所擁有控件當作此類的屬性,如今咱們就來用他。
咱們新建一個ViewController或者大家已經有的視圖控制器。想要哪裏顯示出來就在哪裏。到達大家要填加父視圖.m文件中 咱們首先整一個屬性把這個咱們新建的View類當作裏面的一個屬性
@property(nonatomic,strong)HeaderView_Test*HeaderView;
如今咱們去懶加載一次這個View
-(HeaderView_Test*)HeaderView { if (!_HeaderView) { _HeaderView = [[HeaderView_Test AcquireCustomView]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; } return _HeaderView; }
由於咱們新建的View類是繼承於UIView的因此自己就有初始化方法,因此咱們不須要重寫除非你想在初始化的時候想修改下xib裏面控件的layer或者其餘什麼初始化值之類的。
(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame]; if (self) { //若是子視圖只須要配置一次而後一直就是那個樣子就寫在初始化方法裏面 <#statements#> } return self;
}
其實也能夠在這個方法裏面寫均可以。
(void)drawRect:(CGRect)rect {
//這裏面寫你對子視圖的初始配置 是後期還要調用的就寫在這裏面
}
若是你想在特定的時候須要從新設定子控件爲初始狀態的話,就寫在這個方法裏面。而後在想要恢復原貌或者初始值得時候調用 [_HeaderView setNeedsDisplay];
View的這個方法會自動調用這個drawRect:(CGRect)rect
方法。給你的子控件從新佈局或者恢復原貌賦初始值。
而後用的時候直接調用靜態方法或者類方法[HeaderView_Test AcquireCustomView]
這個返回的就是一個咱們自定義Xib關聯的實例對象ok 咱們就簡單的介紹到這裏。其餘的就靠本身領悟了,其實習慣了以後。這種方式有很大的用處的。就看大家的發覺了。裏面涉及的邏輯咱們能夠建一個ViewModel的類來管理。或直接在裏面操做。或者直接在你所在父視圖控制器操做 。ViewController能夠作到這個均可以作到。並且這個在不一樣的需求裏面。有着不一樣的效果。項目須要的時候就會想起了。