首先直入正题:@IBInspectable & @IBDesignable

对于 @IBInspectable 和 @IBDesignable 可详见官方文档 : Creating a Custom View That Renders in Interface Builder

当然也可以阅读下中文版的: http://nshipster.cn/ibinspectable-ibdesignable/

如果自定view是自己用纯代码写的,对于上面两种处理都比较简单,只需要指定类名即可。

但是如果这个自定义view是用写的,那么如果让xib的界面直接render到storyboard呢?

1. 创建一个IDView,添加一个IDView.Xib

2. 对IDCard.xib添加约束

3. 在IDCard.xib的 File's Owner class 设置为IDCard:

4. 在IDCard.swift中添加如下代码,把xib的view连线到代码上的contentView:

5. 绑定xib,实现 @IBInspectable, @IBDesignable这几部分代码

@IBDesignable
class IDCard: UIView { @IBOutlet var contentView: UIView! @IBInspectable
var cornerRadius: CGFloat = {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius >
}
}
@IBInspectable
var borderWidth: CGFloat = {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable
var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
} override init(frame: CGRect) {
super.init(frame: frame)
initialFromXib()
} required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialFromXib()
} func initialFromXib() {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "IDCard", bundle: bundle)
contentView = nib.instantiateWithOwner(self, options: nil)[] as! UIView
contentView.frame = bounds
addSubview(contentView) } }

6. 在Main.storyboard实现拖入view,并指定其class为IDCard,并对其进行约束

7. 运行代码,结果如下

总结遇到的一些坑:

1. 如何让 sb上的约束生效

 2. 如何让xib渲染到sb上

 上面的两个问题都在initialFromXib上解决

func initialFromXib() {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "IDCard", bundle: bundle)
contentView = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
contentView.frame = bounds // 问题1的解决方案
addSubview(contentView) }

那么为什么要设置contentView.frame = bounds?

首先我们都知道程序首先会加载vc对应的sb,那么sb上相关的约束等会对其上的view进行渲染,那么这个时候 IDCard.xib也会得到渲染,如果我们这个时候不设置contentView的frame的话,

那么这个时候contentView的frame将会被xib上的覆盖掉,那么这个时候contentView的大小只能是你在xib上的大小。这个时候也是凸显为什么要有contentView这个属性了。因为

self = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

这是不被编译通过的。

问题2, 在写这个例子的时候,我加载这个

contentView = NSBundle.mainBundle().loadNibNamed("Xib", owner: self, options: nil)[0] as! UIView

替代

 let bundle = NSBundle(forClass: self.dynamicType)

let nib = UINib(nibName: "IDCard", bundle: bundle)

contentView = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

  这个时候我们看在sb上看不到IDCard这个view,或者报错"Failed to update auto layout status"。原因待查,可参考

还有一个可能的原因:

  NIb加载会把xib文件加载到内存中,读取快,经常使用的xib文件可以使用nib加载,

    Bundle加载,每次会从磁盘上加载,效率会慢一点

3. 还有在其他需要注意的点

   在用@IBDesignable时候, 你最好重写init(frame:) 和 init(coder:)这两个初始化方法

在xib中,你不需要给这个view的class设置为IDCard,默认的UIView就好

关联文章: 文章

   

 

swift 之xib自定义view可视化到storyboard的更多相关文章

  1. iOS开发——UI基础-自定义构造方法,layoutSubviews,Xib文件,利用Xib自定义View

    一.自定义构造方法 有时候需要快速创建对象,可以自定义构造方法 + (instancetype)shopView { return [[self alloc] init]; } - (instance ...

  2. iOS 用xib自定义View

      网上有很多关于实现用xib自定义View,那我为什么还要写呢?第一,我用他们的方法都没有实现.第二,用xib遇到了很多问题,想分享给大家.    用xib自定义View:FHCustomView ...

  3. iOS中 xib自定义View在storyboard中的使用

    1,创建UIView 的SubClass 命名为MyView 2, new一个名为MyView的xib p1 3,配置xib的属性 p2 4,为View 添加背景色,添加一个按钮并定制按钮约束,这里我 ...

  4. IOS 使用XIB 自定义View

    一般自定义View       代码方式 有 在初始化的时候添加 子Views - (id)initWithFrame:(CGRect)frame { self = [super initWithFr ...

  5. iOS 用xib自定义view控件 debug笔记

    1.在view不是很复杂的情况下,如果多次检查后依旧出现coding-compliant这种情况,干脆彻底删除这个xib重新新建一个xib来做一遍.(至今未明真相) 2.初始化xib中的view的大致 ...

  6. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

    在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...

  7. 【swift学习笔记】三.使用xib自定义UITableViewCell

    使用xib自定义tableviewCell看一下效果图 1.自定义列 新建一个xib文件 carTblCell,拖放一个UITableViewCell,再拖放一个图片和一个文本框到tableviewc ...

  8. iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解

    iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...

  9. 自定义不等高cell—storyBoard或xib自定义不等高cell

    1.iOS8之后利用storyBoard或者xib自定义不等高cell: 对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持) 添加子控件和contentView(cell的content ...

随机推荐

  1. Activiti-04-.Spring integration

    ProcessEngineFactoryBean <beanid="processEngineConfiguration"class="org.activiti.s ...

  2. java最全时间类及用法

    对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...

  3. 一文搞懂各种 Docker 网络 - 每天5分钟玩转 Docker 容器技术(72)

    前面各小节我们先后学习了 Docker Overaly,Macvaln,Flannel,Weave 和 Calico 跨主机网络方案.目前这个领域是百家争鸣,而且还有新的方案不断涌现. 本节将从不同维 ...

  4. 我的第一个python web开发框架(2)——一个简单的小外包

    第一部分说明 第一部分大概有20来章,主要讲的是一些开发常识.开发前中后期准备内容.开发环境与服务器部署环境安装设置.python基础框架结构与功能等内容,代码会比较简单. 本系列会以故事的方式,向大 ...

  5. macbook 263企业邮箱设置

    第一步:打开邮箱,点击添加账号,选择其他 第二步:填写完整的电子邮件地址和密码 第三步:填写收件服务器(popcom.263xmail.com),发件服务器(smtpcom.263xmail.com)

  6. Vue.js的从入门到放弃进击录(二)

    哇塞,昨晚更新的篇(一)这么多阅读量,看来入坑的人越来越多啦~熬了一个礼拜夜,今天终于生病惹~国庆要肥家咯·所以把篇(二)也更完.希望各位入坑的小伙伴能少跳几个坑呗.如果有什么不对的地方也欢迎讨论指正 ...

  7. java基础知识及详细笔记

    第一章:初识java 1.1.java的概述 ü  什么是计算机程序:计算机按照某种顺序而完成的一系列有序指令的集合. ü  Java的作用:1:安装和运行本机上的桌面程序.2:通过浏览器访问面向in ...

  8. Ubuntu Docker 版本的更新与安装

    突然发现自己的docker 版本特别的低,目前是1.9.1 属于古董级别的了,想更新一下最新版本,这样最新的一下命令就可以被支持.研究了半天都没有更新成功,更新后的版本始终都是1.9.1 :蒙圈了,找 ...

  9. 通过npm写一个cli命令行工具

    前言 如果你想写一个npm插件,如果你想通过命令行来简化自己的操作,如果你也是个懒惰的人,那么这篇文章值得一看. po主的上一篇文章介绍了定制自己的模版,但这样po主还是不满足啊,项目中我们频繁的需要 ...

  10. ZOJ2150 Raising Modulo Numbers 快速幂

    ZOJ2150 快速幂,但是用递归式的好像会栈溢出. #include<cstdio> #include<cstdlib> #include<iostream> # ...