好久没有写文章了,把之前整理出的一些文章进行发一发,也算是给自己进行温习,期望可以帮到有需求帮助的人
iOS现在的干流布局办法为 纯代码布局 和 XIB布局。
各自优缺陷:
纯代码:
- 长处
- 万物皆可纯代码,修正灵活性较好。
- 只占用一个文件。
- 可以灵活运用多种布局结构辅佐完成布局。
- 复用性好,差异不大的布局只需求复制过来修正少部分就可以。
- 版别处理友爱,在codeReview时一目了然
- 纯代码界面加载速度和运转速度较快
- 缺陷
-
布局繁琐,界面越杂乱布局代码越多,调UI查看效果不直观。
-
相对简略的功能花费的时刻较长
-
捆绑冲突不清楚,在编码过程中无法排查捆绑冲突
XIB布局:
- 长处
- XIB布局运用的是AutoLayout,布局效果支撑预览,所见即所得,捆绑布局更直观。
- 相对杂乱的布局,可读性好
- 在子控件低于60个左右时,界面加载速度和运转速度和纯代码距离不明显。
- 开发效率明显,布局层级清楚。
- 捆绑冲突清楚可见,在编码过程中可躲避大部分捆绑问题
- 缺陷
- 版别处理时,无法一目了然看清修正项
- 多占用一个资源文件,占用编译时刻
- 没有构成共同标准时,XIB在迭代过程中将会是一个噩梦。
怎样取舍:
根底规矩:
XIB只适用于可以 StackView 布局,或许非常简略的惯例布局。
封装的父View或许Cell 假设子控件多于60个,只能运用纯代码布局。
关于一级页面
-
-
为寻求极致的体会,关于子控件多于30个的cell,运用纯代码布局。
-
子控件少于30个的cell,假设可以运用StackView进行布局的,优先引荐运用XIB,无法运用StackView布局的 Cell 运用纯代码布局。
-
关于View的封装和Cell的规矩保持共同,相同适用于以上两点。
-
运用标准:
命名标准
假设运用的是UIStackView 布局,在命名时需求将axis 写出来,比方论题的水平捆绑view,可以命名为topicHorizontalStackView。
添加subView时,请运用addArrangedSubview 办法进行添加,布局是否隐藏请运用 isHidden。详细可 参考HomeRecommendFeedInfoView
注释标准
将封装的 Cell 或许 View 写明注释,用于什么页面。
子控件代表什么
tip:
在布局的过程中,假设是纯代码布局,可能会出现(通过 运转时 → Debug → View Debugging → Capture View Hierarchy 查看)
出现这种问题的原因是布局过程中,在水平或许垂直方向上,捆绑缺失,相同的一个方向,不知道该优先缩放或许裁切哪个控件。
此刻只需求指定优先级。
contentHuggingHorizontalPriority &contentHuggingVerticalPriority (水平抗紧缩系数和垂直抗紧缩系数)
默认值为 250,设置值越小代表越简单被拉伸,即越难被紧缩。
举个例子:
label 设置水平249,那么就越简单被拉伸
label 设置水平为251,那么就比第二更难被拉伸
代码设置办法为
topicLabel.snp.contentHuggingHorizontalPriority= 251 或许topicLabel.setContentHuggingPriority(UILayoutPriority(rawValue:251),for: .vertical)
contentCompressionResistanceHorizontalPriority &contentCompressionResistanceVerticalPriority (水平优先裁剪系数和垂直优先裁剪系数)
默认值为 750,设置值越小代表越简单被裁剪。
举例说明:
第一 label 设置水平749,那么第一就越简单被裁剪
第一 label 设置水平751,那么第二就越简单被裁剪
布局标准
关于动态布局的卡片或许Cell,优先运用StackView进行布局。StackView可以自定义空隙,通过运用 setCustomSpacing(2, after: puNameL)
详细的StackView运用办法可以查看苹果官方文档UIStackView官方文档
项目中的动态卡片假设运用XIB,不要通过运用 Constraint 进行捆绑更新,而应该运用UIStackView的isHidden特点
关于XIB布局,怎样快速查看布局的层级
方案一:
翻开XIB文件,例如:
将文本进行填充,将子控件进行颜色填充,层级效果一目了然,比方:
通过 Preview查看效果和捆绑
方案二:
通过 Debug View Hierarchy 进行查看,Cell的卡片层级一目了然
运用纯代码布局可运用方案二查看捆绑层级结构。
假设排查捆绑冲突:
通过设置 UIViewAlertForUnsatisfiableConstraints,可以将捆绑的冲突打印在操控台上