嵌入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];
}
主要故事板
OrangeView
GREENVIEW(具有多个stackviews)
概述
答
的一个的内容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
使用单独的故事板/厦门国际银行文件*可以*是有帮助的,这取决于您的应用程序的复杂性。有时候,他们会比他们的价值更麻烦。如果你想从xib载入视图+子视图,你必须做的不仅仅是实例化类。你在这里的最终目标是什么?你想要你的xib视图加载和*缩放*以适应指定的帧?你想加载XIB视图,并有他们的“内部”框架/约束决定其大小?前者为 – DonMag
。我希望子视图可以缩放以适应指定的帧。 –