我正在使用多个XIB / Storyboard来构建我的应用程序。
我有在XIB中提出的意见。有些人UIStackView
来帮助整理布局。
我的主要故事板在UIStackView
中嵌入了两个视图,用于提取使用XIBs
创建的视图。
无法正确显示任何内容。尽管在界面构建器中正确显示,但视图大小不合适或根本不显示。
我怀疑是正在显示视图, BEFORE 它们被完全加载到视图中,导致帧的大小不同。
我被告知最佳做法是提供他们自己的故事板/ 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(具有多个堆栈视图)
概述
答案 0 :(得分:0)
.xib
文件的内容未被"链接"上课。也就是说,当您实例化该类时,它本身也不会加载您在xib中布局的视图和子视图。
有几种方法可以解决这个问题。一种方法是包括"加载元素"视图类中的代码。这允许更多的传统"加载/创建视图实例,添加为子视图,设置参数(框架或约束)等的方法
以下是使用" xib-load"对UIView
进行子类化的示例。函数,然后使你的实际类成为这个" base":
//
// 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
我把你可以看一下的这个例子(使用你的目标)放在一起。可能会帮助你掌握它: