Petral-UI是一个以Swift实现的 UI布局框架,以最少的代码,实现UI的搭建、属性设置以及布局控制。

源码

Github地址:github.com/HuangZhiBin…

接入条件

swift.version >= 4.2.0
复制代码

接入方式

pod 'Petral-UI'
复制代码

Petral-UI主要是下面两个部分:

1.连续点方法

连续设置UIView的属性,例如

let nameLabel = UILabel.init()
.pt_frame(x: 0, y: 0, width: 80, height: 20)
.pt_text("姓名")
.pt_font(size: 14, bold: true)
.pt_textColor(UIColor.init(hexString: "#1f1f1f"));
复制代码

通过直接调用.pt_为前缀的方法,直接连续设置View的UI属性,与调用系统方法的API类似。可实现对View的连续设置,减少代码。 现有的API可以基本满足UI设置,大家可以根据实际需要自行添加更多的API方法。

2.自动布局

通过最少的代码,实现类似AutoLayout/Masory自动布局的功能,但代码量远少于这两个框架。

自动布局的使用步骤:

  1. View初始化后,通过addSubview()方法添加到当前页面。必须先执行addSubview()方法,才能使用Petral-UI进行自动布局的设置。
self.view.addSubview(nameLabel);
复制代码

2.访问View的petralRestraint属性,通过以pt_为前缀的方法设置布局。

nameLabel.petralRestraint
.pt_topIn(self.view, distance: 10) // View的顶部与父View的距离为10
.pt_leftIn(self.view, distance: 20);// View的左边与父View的距离为20
复制代码

自动布局的API

1.同级间View的约束

View a与View b是属于同一层级的两个View,View b的位置可以由View a决定。

注意:如果a与b不是属于同一层级,调用以下方法将报错。

(1)to方法
  • pt_leftTo()

View b的左边与View a的距离是n

b.petralRestraint.pt_leftTo(a, distance: n)
复制代码

  • pt_rightTo()

View b的右边与View a的距离是n

b.petralRestraint.pt_rightTo(a, distance: n)
复制代码

  • pt_topTo()

View b的顶部与View a的距离是n

b.petralRestraint.pt_topTo(a, distance: n)
复制代码

  • pt_bottomTo()

View b的底部与View a的距离是n

b.petralRestraint.pt_bottomTo(a, distance: n)
复制代码
(2)as方法
  • pt_leftAs

View b的左边与View a的左边的水平位置一致

b.petralRestraint.pt_leftAs(a)
复制代码

  • pt_rightAs

View b的右边与View a的右边的水平位置一致

b.petralRestraint.pt_rightAs(a)
复制代码

  • pt_topAs

View b的顶部与View a的顶部的水平位置一致

b.petralRestraint.pt_topAs(a)
复制代码

  • pt_bottomAs

View b的底部与View a的底部的水平位置一致

b.petralRestraint.pt_bottomAs(a)
复制代码

  • pt_xCenterAs
b.petralRestraint.pt_xCenterAs(a)
复制代码

View b的中间水平位置与View a的中间水平位置一致


  • pt_yCenterAs
b.petralRestraint.pt_yCenterAs(a)
复制代码

View b的中间垂直位置与View a的中间垂直位置一致


  • pt_centerAs
b.petralRestraint.pt_centerAs(a)
复制代码

View b的中间点与View a的中间点位置一致

2.父子间View的约束

View a与View b的父View,View b的位置可以由View a决定。

注意:如果a不是b的父View,调用以下方法将报错。

  • pt_leftIn()

View b的左边与父View a的左边的距离为n

b.petralRestraint.pt_leftIn(a, distance: n)
复制代码

  • pt_rightIn()

View b的右边与父View a的y右边的距离为n

b.petralRestraint.pt_rightIn(a, distance: n)
复制代码

  • pt_topIn()

View b的顶部与父View a的顶部的距离为n

b.petralRestraint.pt_topIn(a, distance: n)
复制代码

  • pt_bottomIn()

View b的底部与父View a的底部的距离为n

b.petralRestraint.pt_bottomIn(a, distance: n)
复制代码

  • pt_xCenterIn()

View b的水平位置位于父View a的中间

b.petralRestraint.pt_xCenterIn(a)
复制代码

  • pt_yCenterIn()

View b的垂直位置位于父View a的中间

b.petralRestraint.pt_yCenterIn(a)
复制代码

  • pt_centerIn()

View b的水平和垂直位置位于父View a的中间

b.petralRestraint.pt_centerIn(a)
复制代码

3.指定View的固定宽高

  • pt_width()

View b的固定宽度为n

b.petralRestraint.pt_width(n)
复制代码

  • pt_height()

View b的固定高度为n

b.petralRestraint.pt_height(n)
复制代码

布局的级联更新

  • pt_updateDependeds()

View b的位置受到View a的制约,View c的位置受到View b的制约,若View a的位置或者大小发生改变,要保持之前的制约条件(Restraint),需要手动调用API方法a.petralRestraint.pt_updateDependeds();进行更新,使View b和View c的位置和大小发生改变。不手动调用该方法,将不主动实现UI的级联更新。

a.petralRestraint.pt_updateDependeds();
复制代码

布局冲突的情况

以下的情形会发生布局冲突,运行时抛出fatalError:

  • 同时设置view的left、right和width约束
  • 同时设置view的top、bottom和height约束
  • 同时设置view的left、xCenter约束
  • 同时设置view的right、xCenter约束
  • 同时设置view的top、yCenter约束
  • 同时设置view的bottom、yCenter约束

运行时发现fatalError的情形,请修改约束条件后重新运行。

转载于:https://juejin.im/post/5d034dfdf265da1b934dfe98

一个UI布局框架,以最少的代码实现UI设置及布局控制相关推荐

  1. ui自动化测试框架_浅谈前端(UI)自动化测试

    作为一名测试开发从业者,自动化测试好像是绕不开的话题....结合最近接触到的一些测开应聘同学聊到关于前端自动化测试及自己的理解,分享一下自己对UI自动化测试的认识,大概如下. 测试分层的自动化测试思想 ...

  2. UI自动化框架如何设计及搭建?

    目录 UI自动化框架 自动化原则: 如何减少自动化维护成本? UI自动化框架优化方案:(在不增加维护成本前提下) UI自动化脚本可分为3种: 已经实现自动化的模块可以不做手工测试了吗? UI自动化公式 ...

  3. 十个前端UI优秀框架包含前端代码下载

    十个前端UI优秀框架 最近需要一些前端框架,于是在网上整理了一些感觉不错的前端框架,有pc端和移动端,为了方便日后自己先记录下来了... Bootstrap 首先说 Bootstrap,估计你也猜到会 ...

  4. vue框架是ui框架么_Vue是2020年一个了不起的框架,为什么

    vue框架是ui框架么 An amazing conference regarding the Vue framework was held in the US in the first week o ...

  5. PyQt的一个UI单元测试框架思路

    專 欄 ❈ 丁果,Python中文社区作者.对 django.pyqt.opencv.tornado感兴趣. GitHub:https://github.com/lidingke ❈ 一.思路 PyQ ...

  6. 从0开始写一个基于Flutter的开源中国客户端(5)——App整体布局框架搭建

    上一篇中我记录了Flutter中常用的一些布局,本篇开始开发基于Flutter的开源中国客户端了.在本篇博客中,要实现的是一个App的整体框架,包括页面底部的Tab导航菜单.页面的侧滑菜单以及跳转到新 ...

  7. 从零开始实现一个简易的Java MVC框架(九)--优化MVC代码

    前言 在从零开始实现一个简易的Java MVC框架(七)--实现MVC中实现了doodle框架的MVC的功能,不过最后指出代码的逻辑不是很好,在这一章节就将这一部分代码进行优化. 优化的目标是1.去除 ...

  8. 基于UI组件的Vue可视化布局、快速生成.vue代码

    一.项目简介 基于UI组件的Vue可视化布局.快速生成.vue代码 二.实现功能 通用(文本.链接.换行.div.图片) 支持elementUI 支持iViewUI(button .icon.radi ...

  9. 手把手实现一个深度学习框架(附代码实现)

    编辑丨极市平台 转载 | 深度学习初学者 来源丨https://zhuanlan.zhihu.com/p/78713744 当前深度学习框架越来越成熟,对于使用者而言封装程度越来越高,好处就是现在可以 ...

最新文章

  1. 深度学习:梯度下降算法改进
  2. 注册CSDN帐号的见闻续
  3. 输入和学生成绩的输出
  4. Apache下的ArrayUtils工具类总结
  5. javascript 调用c#变量实例
  6. Python的这几个常用库,你会用吗?
  7. linux中断调用spi函数,基于Linux的ARM与FPGA SPI驱动,中断函数调用spidev_sync_read(),出现异常...
  8. C#自定义规则对比两个集合的对象是否相等
  9. 织梦php 文章采集规则,织梦输入网址采集单个网页功能发布 不需要写采集规则一键采集...
  10. C语言小项目——动手打造属于自己的C语言IDE
  11. html中img的title属性值,img标签中alt属性和title属性的区别是什么?
  12. 足球大数据预测胜平负、走地之人工智能算法现状与改进措施
  13. 动词变名词的变化规则_动词变名词的规则?(要求完整)
  14. 数据分析|Python|拼多多优惠券使用预测分析报告
  15. python简单温度转换,python编写的简单温度转换程序
  16. 洛谷刷题——P1192 台阶问题
  17. vue项目中element-ui的分页器(组件封装)
  18. Flink实操 : 广播变量/累加器/分布式缓存
  19. DELPHI 颜色表
  20. JS获取当月windows显示的日历(简易版本)

热门文章

  1. 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  2. shell 动态进程守护
  3. zzzp0371 属于本人
  4. 网购切莫小看1毛钱 暗藏信用卡诈骗玄机
  5. 配置安装光盘为yum源
  6. SQL Server 2005 For XML[学习]
  7. 文化致胜的时代 协同OA可以这样助力企业文化建设
  8. Jmeter --- 分布式测试
  9. Linux内核TCP/IP参数分析与调优
  10. 如何兼容並蓄Android Studio 與 Eclipse 的優點, 減少顧此失彼的缺憾