标签:
常用xib的基本上都是UITableViewCell,今天动手拖出来个UIView的子类。
打开工程新建一个view:StoryBoardView.新建view不能创建xib,需要手动创建一个xib
打开这个新建的xib。
拖上去一个label,一个button,暂时别连线。
拖着个xib的时候,可能第一反应就是先将这个view指向StoryBoardView,这个时候千万别指向自定义的View,后面解释
将file‘s owner 指向 StoryboardView
现在说明下原因:如果在storyboard中的一个vc中拖了一个View,指向StoryBoardView,View加载时候回调用 StoryBoardView的
- (id)initWithCoder:(NSCoder *)aDecoder + - (void)awakeFromNib.
但是实例化一个xib对象的StoryBoardView是通过
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options;
方法来获取的。
这就两难了:想在storyboard中拖一个StoryBoardView到一个VC,但是得到的却是一个空白的View;通过代码loadnibname,就不能用storyboard方便的添加约束;这个时候就需要添加一个中间层了。把xib实例化出来的View当做StoryBoardView的一个subview。
具体就是,重载initWithCoder,在内部调用loadNibName,把这个获取到的View再添加到self上就好了。
这样即使通过storyboard拖的,有load自己的xib了。
在.h中添加属性
@interface StoryBoardView : UIView
@property(weak , nonatomic) IBOutlet UIView* contentView;
@property(weak , nonatomic) IBOutlet UILabel* contentLabel;
@property(weak , nonatomic) IBOutlet UIButton* transformButton;
@end
.m中重载方法
- (id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
self.contentView.frame = self.bounds;
[self addSubview:self.contentView];
}
return self;
}
xib中连线:
虽然label、button的直接父类是contentView,但是对外还是通过StoryBoardView的propriety属性。
在storyboard中
尽管看起来不是xib的样式,run起来就能看到了
为了兼容手写代码创建StoryBoardView,看习惯添加代码,比如:
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
self.contentView.frame = self.bounds;
[self addSubview:self.contentView];
}
return self;
}
标签:
原文地址:http://blog.csdn.net/growinggiant/article/details/43563037