用xib自定义UIView

常用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;

}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值