"真正的coder手寫代碼,不錯,可惜我只是是雞智的賊佬"。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ----沒錯,是我
公司里禁用xib(storyboard)來布局,手寫布局實在egg pain,只好使用Masonry來寫布局約束,疼痛減輕不少;但每次都要的編譯才能可看到結果,如果遇上莫名的奔潰或者要要挪來挪去一個個像素來微調的話,一次次編譯實在浪費生命,今日發現其實可以使用IB_DESIGNABLE來實時渲染布局,這樣就無需編譯就可以查看布局變化。
簡單介紹一個IB_DESIGNABLE(在Swift里面是@IBDesignable,但本文只涉及OC,不提swift),IB_DESIGNABLE的宏的功能就是讓XCode動態渲染出該類圖形化界面。比如說:現在我們繪制一個UIView,里面只有一個方法drawRect:
我怎么知道這個UIView長什么樣子呢?很簡單:在@implementation前面添加IB_DESIGNABLE,
然后創建一個xib文件,名字隨便起,我們只用它來展示我們用代碼寫得界面,然后讓xib里面的uiview繼承于BombView:
? ? 當布局成功后,就可顯示布圖案。
布局對了就可以刪除對應的xib(stroyboard)文件。
更好玩的是,我們可以利用B_DESIGNABLE這個Xcode的新特性來查看Masonry布局,無需編譯。
于是我們的頭部就創建好了,么?不知道,創建一個Xib文件,命名隨意,讓里面的view大小設置為320*160,設置它是ScheduleHeaderView的子類,于是:
這樣,我們就完成了Masnory布局代碼的實時渲染。
/**
*? UIimage的擴展,為在使用 IB_DESIGNABLE 的時候可以在IB上看到圖片,需要把IB_DESIGNABLE所在類當參數傳給NSBundle
*? 不能簡單使用[UIImage imageWithNamed]來給圖片賦值,因為在IB渲染和運行時的NSBundle是不一樣的,
NSBundle *bundle;
bundle= [NSBundle bundleForClass: [YouView class]];//YouView指的是對應視圖的類名
UIImage *image = [UIImage imageNamed:imageNamed inBundle:bundle compatibleWithTraitCollection:nil];使用圖片,
這里,我寫了一個擴展,
@end
使用方法:
imageView.image = [UIImage imageForIBWithImageNamed:@"bg_transparent_gallerynormal" classForBundle:[self class]];
這樣就在IB和運行時就會使用不同的bundle,用圖片的問題就解決了
*/
總結 ?
? ? ?優點:方便純代碼黨試試看到(修改)界面代碼(布局,Core Graphics)的效果,提高工作 ?效率。
? ? 缺點:1.無法直接在UIViewController上面使用? IB_DESIGNABLE,只能用于UIView的子類。
? ? ? ? ? ? ?2.渲染可能會出錯,有時候比較慢。