用xib自定义UIView

来源:互联网 发布:淘宝店铺认证骗局 编辑:程序博客网 时间:2024/05/23 01:17

常用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) IBOutletUIView* contentView;

@property(weak , nonatomic) IBOutletUILabel* contentLabel;

@property(weak , nonatomic) IBOutletUIButton* transformButton;


@end


.m中重载方法

- (id)initWithCoder:(NSCoder *)aDecoder{

   self = [superinitWithCoder:aDecoder];

   if (self) {


        [[NSBundlemainBundle] loadNibNamed:NSStringFromClass([selfclass]) owner:selfoptions:nil];

       self.contentView.frame =self.bounds;

        [selfaddSubview:self.contentView];

    }

    returnself;

}


xib中连线:


虽然label、button的直接父类是contentView,但是对外还是通过StoryBoardView的propriety属性。

在storyboard中


尽管看起来不是xib的样式,run起来就能看到了






为了兼容手写代码创建StoryBoardView,看习惯添加代码,比如:

- (instancetype)initWithFrame:(CGRect)frame{

   self = [superinitWithFrame:frame];

   if (self) {

        [[NSBundlemainBundle] loadNibNamed:NSStringFromClass([selfclass]) owner:selfoptions:nil];

       self.contentView.frame =self.bounds;

        [selfaddSubview:self.contentView];

    }

    return self;

}










0 0
原创粉丝点击