嵌入UIStackViews中的多个XIB显示在一个StoryBoard中,带有UIStackViews

问题描述:

我正在使用多个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文件不与该类“链接”。也就是说,当你实例化这个类时,它本身不会 - 也加载你在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