点击控件我们在size inspector 一栏,最下部可以看到下面优先级。
Content Hugging Priority:表示一个控件“抗拉伸”的优先级。优先级越高,越不容易被拉伸,默认是:251。
Content Compression Resistance Priority:表示一个控件“抗压缩”的优先级。优先级越高,越不容易被压缩,默认是:750。
应用场景
最常见的简单问题,如果我们需要在一行放两个Label,Label宽度自适应。这样就会报错,因为无法确定哪一个Label的宽度撑开的优先级高。
演示Demo:
两个Label约束如下:
![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMuZ2l0Ym9vay5jbi82YjgzZjM0MC0zNzM3LTExZWEtYWVjMy1jMTU0MjJhNTQ5ODA?x-oss-process=image/fo 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 rmat,png)
这时候就会报,上文所说的错误,修改一个优先级即可,我们想让Label1拉伸,所有将Label2的抗拉伸优先级调高成252,同理你可以将Label1调成249。
还没有结束,上述过程是空间充足的情况如果空间不足的话,还会出现报错。
现在我们不希望Label2被压缩,所以同理调高优先级即可。
3. @IBDesignable 和 @IBInspectable 的使用
应用场景:我们使用Xib绑定Custom Class想看一下样子,所见即所得,IBDesignable这个属性即可满足这个需求。
有时候我们想在XIb里直观修改Xib属性,但是Xcode并不全部提供属性修改,可以通过Keypath修改,但是键入太麻烦容易出错,所以可以通过IBInspectable添加自定义属性。
应用Demo:
制作一个可以动态修改Raduis属性,即可显示的Demo。
import UIKit
@IBDesignable
class LayerView: UIView {
@IBInspectable var myRaduis:CGFloat = 0.0{
didSet{
self.layer.cornerRadius = myRaduis
}
}
}
# 视图复用
1.自定义Xib View复用
Xcode 创建CocoaTouch Class View的时候,不可以自动生成绑定的Xib View。所以需要创建Xib View,然后绑定Custom Class。
step 1:
step 2:新建View Class,并在XIb绑定Custom Class为该类。
step 3:使用该View
2,3步截图使用代码如下:
if let customView = Bundle.main.loadNibNamed(“CustomView”, owner: self, options: nil)?.first as? CustomView{
customView.frame = CGRect(x: 200, y: 500, width: 200, height: 100)
self.view.addSubview(customView)
}
2.在StoryBoard和Xib中怎么复用Xib文件
上个例子中制作了一个Xib view,但是在项目中往往想更直接在StoryBoard中复用Xib view。直接关联肯定是不行的。
下面介绍下如何在Sb中复用XIb 文件:
接上文例子,我们想在Sb中加上Xib view需要如下步骤,
step 1:绑定Xib 文件的 File’s owner 的Class
step 2:在 init?(coder: NSCoder)初始化方法中,添加xib视图。
import UIKit
class SbView: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
if let sbView = Bundle.main.loadNibNamed(“SbView”, owner: self, options: nil)?.first as? UIView{
sbView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
self.addSubview(sbView)
}
}
}
step3: 在StoryBoard中,将该视图绑定Class即可。
# StoryBoard
1.Segue
Segue是一个很简单对象类,继承于NSObject。目的也很简单,主要是Sb VC之间跳转关系的纽带。
基本属性:
| 属性 | 作用 |
| — | — |
| identifier | 字符串标识,区分页面不同Segue |
| source | 跳转之前的控制器 |
| destination | 需要跳转到的控制器 |
传值:
有时候我们需要判断是否满足跳转的条件,可以重写UIViewController shouldPerformSegue
代理:
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == “jumpSecond”{
return true
}
return false
}
传值的时候,可以重写prepare
方法。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == “jumpSecond”{
let vc = segue.destination as? SecondViewController
vc?.title = “第二控制器”
}
}
下面一个图可以清楚说明:
2.快捷TableViewController
一些简单的表格页面,比如设置页面,可以使用静态TableViewController,简单高效。