在ios開發中,使用storyboard的某些場景下我們可能希望同時使用xib定義一些可以重複利用的view,並在storyboard中呼叫。本文將分享一種此類xib bridge的簡單實現方式。
本方法的思路是將xib的file』s owner所對應的uiview作為placeholderview
,其作用只是在storyboard中起到佔位作用,並承載storyboard中與xib自定義view相關的autolayout約束,其背景色將被設為[uicolor clearcolor]
,並且不顯示任何內容。顯示自定義內容的任務將交給乙個uiview
–contentview
,它將作為placeholderview
的子檢視。
為了使在storyboard中作用於placeholderview
的autolayout約束能夠自動的作用於contentview
,可以向placeholderview
新增nslayoutrelationequal
約束,讓placeholderview
和contentview
的上下左右四個nslayoutattribute
分別完全相等,這樣contentview
在storyboard中的的frame將完全和placeholderview相同,從而達到目的。
以上方法同樣可以適用於xib的某個子view是另外乙個xib的情形。
首先需要在identity inspector中將xib檔案的file』s owner設定成為建立好的coverview
類
接下來我們就可以在xib中自動建立的uiview
子檢視中進行自定義ui了,此時可以在coverview
類中建立該uiview
子檢視(這裡命名為contentview
)以及其他ui元件的ibaction
和iboutlet
等。
作為placeholderview
的基類,xibbridgebaseview
中定義了如下的乙個方法,用於從nib中載入contentview並新增進占位檢視的子檢視中,其中xibbridgebaseview
的initwithcoder:
方法將使用其派生子類的類名作為xib的名字,因此子類和其所對應的xib檔案應該使用相同的命名。
@implementation
xibbridgebaseview
- (instancetype)initwithcoder:(nscoder *)adecoder
return
self;
}- (void)setupxibbridgewithplaceholderviewnibname:(nsstring *)placeholderviewnibname
其中- (void)setxibbridgeconstraintstocontentview:(uiview *)contentview
方法主要是實現前文提到的通過向佔位檢視新增nslayoutrelationequal
約束讓placeholderview
和contentview
的上下左右四個nslayoutattribute
分別完全相等:
@implementation
xibbridgebaseview
- (void)setxibbridgeconstraintstocontentview:(uiview *)contentview
作為placeholderview
的實際類,每建立乙個需要被橋接的xib時就要建立乙個對應的實際類(本文中為coverview
類),coverview
中將包含在xib中定義的自定義ui相關的屬性和操作:
@inte***ce
coverview : xibbridgebaseview
@property (weak, nonatomic) iboutlet
uilabel *headerlabel;
@property (weak, nonatomic) iboutlet
uibutton *submitbutton;
@property (strong, nonatomic) iboutlet
uiview *contentview;
@implementation
coverview
- (ibaction)submitbuttonclicked:(uibutton *)sender
因為我們是用父storyboard或者xib來呼叫placeholderview
的,實際使用中只需要將placeholderview
的實際類繼承於基類xibbridgebaseview
,即可實現橋接功能。該placeholderview
的其他初始化工作可以放在- awakefromnib
中進行
@implementation coverview
- (void)awakefromnib
做完以上步奏後,只需在父storyboard或者xib中拖乙個uiview
來作為placeholderview
,並在identity inspector中將其class屬性設定成為對應的placeholderview
的實際類即可。
在使用如上方法來進行xib橋接的過程中需要注意一下幾點使用方式:
對於xib橋接問題大神sunnyxx給出了乙個更高階的解決方案,利用到了ios runtime相關的技術。
github:
Storyboard使用隨筆
sliverlight情景下使用 方法一 使用visualstatemanager 技術,呼叫 gotostate xaml layoutroot background white mybuttonstates normal changed mybutton storyboard.targetpro...
Storyboard使用心得
uistoryboard的優缺點都非常明顯,導致兩極分化嚴重。雖然我在下面吐槽了很多storyboard的問題,但是依舊非常喜歡storyboard,建議10人以下的團隊果斷轉向storyboard。storyboard的缺點 1.storyboard不是萬能的,限制很多,導致某些介面必須要加 實現...
Storyboard使用心得
uistoryboard的優缺點都非常明顯,導致兩極分化嚴重。雖然我在下面吐槽了很多storyboard的問題,但是依舊非常喜歡storyboard,建議10人以下的團隊果斷轉向storyboard。storyboard的缺點 1.storyboard不是萬能的,限制很多,導致某些介面必須要加 實現...