2017-10-04 50 views
0

我正在使用多個XIB/Storyboard來構建我的應用程序。嵌入UIStackViews中的多個XIB顯示在一個StoryBoard中,帶有UIStackViews

我有意見在XIBs佈局。有些人有UIStackView來幫助組織布局。

我的主要故事板有兩個視圖嵌入在UIStackView中,該視圖引入了用XIBs創建的視圖。

什麼都不會正確顯示。儘管在界面構建器中正確顯示,但視圖尺寸不正確或完全不顯示。

我懷疑是正在顯示的視圖,之前它們完全加載到視圖導致幀的大小不同。

有人告訴我最好的做法是給意見自己的情節提要/ XIB更好的融合,維護等...所以這就是我努力學習。

有沒有人知道正確的方式來完成我在做什麼?

下面是我在做什麼:

的ViewController

#import "OrangeView.h" 
#import "GreenView.h" 

@interface ViewController() { 
    OrangeView *ov; 
    GreenView *gv; 
} 

@property (weak, nonatomic) IBOutlet UIView *viewOrange; 
@property (weak, nonatomic) IBOutlet UIView *viewGreen; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Load Orange View 
    ov = [[OrangeView alloc] initWithFrame:_viewOrange.frame]; 
    [_viewOrange addSubview:ov]; 

    //Load GreenView 
    gv = [[GreenView alloc] initWithFrame:_viewGreen.frame]; 
    [_viewGreen addSubview:gv]; 

} 

主要故事板

enter image description here

OrangeView

enter image description here

GREENVIEW(具有多個stackviews)

enter image description here

概述

enter image description here

+0

使用單獨的故事板/廈門國際銀行文件*可以*是有幫助的,這取決於您的應用程序的複雜性。有時候,他們會比他們的價值更麻煩。如果你想從xib載入視圖+子視圖,你必須做的不僅僅是實例化類。你在這裏的最終目標是什麼?你想要你的xib視圖加載和*縮放*以適應指定的幀?你想加載XIB視圖,並有他們的「內部」框架/約束決定其大小?前者爲 – DonMag

+0

。我希望子視圖可以縮放以適應指定的幀。 –

回答

0

的一個的內容0文件不與該類「鏈接」。也就是說,當你實例化這個類時,它本身不會 - 也加載你在xib中佈置的視圖和子視圖。

有幾種方法可以解決這個問題。一種方法是在視圖類中包含「加載元素」代碼。這允許更加「常規」的方式來加載/創建視圖實例,添加爲子視圖,設置參數(框架或約束)等。

這裏是子類UIView與 「XIB-負荷」 功能的一例,然後使你的實際的類的子類這種 「基地」 的:


// 
// XIBViewBase.h 
// 

#import <UIKit/UIKit.h> 

@interface XIBViewBase : UIView 

@end 

// 
// XIBViewBase.m 
// 

#import "XIBViewBase.h" 

@implementation XIBViewBase 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 

    if (self) { 
     [self xibSetup]; 
    } 

    return self; 
} 

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 

    if (self) { 
     [self xibSetup]; 
    } 

    return self; 
} 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    [self xibSetup]; 
} 

- (void)xibSetup { 

    // make sure we don't add the subviews more than once 
    if (!self.subviews.count) { 

     UIView *view = [self loadFromXIB]; 

     view.frame = self.bounds; 
     view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

     [self addSubview:view]; 
     [self sendSubviewToBack:view]; 

    } 

} 

- (UIView *)loadFromXIB { 

    // Note: the .xib file MUST be named the same as the class for this to work 

    NSString *className = NSStringFromClass([self class]); 
    NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 
    UINib *nib = [UINib nibWithNibName:className bundle:bundle]; 
    UIView *v = [nib instantiateWithOwner:self options:nil].firstObject; 

    return v; 

} 

@end 

我把這個例子(使用你的目標)放在一起,你可以看看。可以幫助你得到它的句柄:

https://github.com/DonMag/SimpleXIB


相關問題