在Storyboard中使用由xib定義的view

2021-07-23 05:03:48 字數 3296 閱讀 1852

在ios開發中,使用storyboard的某些場景下我們可能希望同時使用xib定義一些可以重複利用的view,並在storyboard中呼叫。本文將分享一種此類xib bridge的簡單實現方式。

本方法的思路是將xib的file』s owner所對應的uiview作為placeholderview,其作用只是在storyboard中起到佔位作用,並承載storyboard中與xib自定義view相關的autolayout約束,其背景色將被設為[uicolor clearcolor],並且不顯示任何內容。顯示自定義內容的任務將交給乙個uiviewcontentview,它將作為placeholderview的子檢視。

為了使在storyboard中作用於placeholderview的autolayout約束能夠自動的作用於contentview,可以向placeholderview新增nslayoutrelationequal約束,讓placeholderviewcontentview的上下左右四個nslayoutattribute分別完全相等,這樣contentview在storyboard中的的frame將完全和placeholderview相同,從而達到目的。

以上方法同樣可以適用於xib的某個子view是另外乙個xib的情形。

首先需要在identity inspector中將xib檔案的file』s owner設定成為建立好的coverview

接下來我們就可以在xib中自動建立的uiview子檢視中進行自定義ui了,此時可以在coverview類中建立該uiview子檢視(這裡命名為contentview)以及其他ui元件的ibactioniboutlet等。

作為placeholderview的基類,xibbridgebaseview中定義了如下的乙個方法,用於從nib中載入contentview並新增進占位檢視的子檢視中,其中xibbridgebaseviewinitwithcoder:方法將使用其派生子類的類名作為xib的名字,因此子類和其所對應的xib檔案應該使用相同的命名。

@implementation

xibbridgebaseview

- (instancetype)initwithcoder:(nscoder *)adecoder

return

self;

}- (void)setupxibbridgewithplaceholderviewnibname:(nsstring *)placeholderviewnibname

其中- (void)setxibbridgeconstraintstocontentview:(uiview *)contentview方法主要是實現前文提到的通過向佔位檢視新增nslayoutrelationequal約束讓placeholderviewcontentview的上下左右四個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不是萬能的,限制很多,導致某些介面必須要加 實現...