news 2026/7/7 10:25:03

4.布局系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.布局系统

quarius开发框架旨在帮助独立开发者和中小型团队,完成iOS App的快速实现与迭代。使用框架开发将给你带来简单、高效、易维护的编程体验。

Aquarius布局系统简介

Aquarius开发框架提供了一套完整的、极简的布局系统。通过该布局系统,你可以轻松的完成基于代码控制的视图布局。

核心价值:

🎯 一行顶多行 - 极简API,大幅减少代码量

⚡ 动效零成本 - 所有布局变化天然支持动画

🔗 关系式布局 - 直观表达视图间相对关系

📦 批量好帮手 - 一次性操作多个视图

🔄 无缝兼容 - 基于原生frame,即插即用

系统特点:

直观的定位和大小调整方法

内置动画支持

多视图批量操作

参见源码:

UIView+aLayout.swift

Array+aLayout.swift

复杂度:

基础布局:提供了对控件的基础设置

高级布局:提供了控件间关系型的动态设置

基础布局:重塑单个视图的操控体验

处理单个视图

位置

使用框架提供的方法,你可以轻松的完成视图位置的获取和设置。

获取x位置

不使用框架的获取方式

let x: CGFloat = myView.frame.origin.x

使用框架的获取方式

let x: CGFloat = myView.x()

//或

let x: CGFloat = myView.left()

设置x位置

不使用框架的获取方式

myView.frame.origin.x = 10.0

使用框架的获取方式

myView.x(x: 10.0)

//或

myView.left(left: 10.0)

获取y位置

不使用框架的获取方式

let y: CGFloat = myView.frame.origin.y

使用框架的获取方式

let y: CGFloat = myView.y()

//或

let y: CGFloat = myView.top()

设置y位置

不使用框架的获取方式

myView.frame.origin.y = 10.0

使用框架的获取方式

myView.y(y: 10.0)

//或

myView.top(top: 10.0)

获取右侧位置

不使用框架的获取方式

let right: CGFloat = myView.frame.origin.x + myView.frame.size.width

使用框架的获取方式

let right: CGFloat = myView.right()

设置右侧位置

不使用框架的获取方式

myView.frame.origin.x = 200.0 - myView.frame.size.width

使用框架的获取方式

myView.right(right: 200)

获取底部位置

不使用框架的获取方式

let bottom: CGFloat = myView.frame.origin.y + myView.frame.size.height

使用框架的获取方式

let bottom: CGFloat = myView.bottom()

设置底部位置

不使用框架的获取方式

myView.frame.origin.y = 200.0 - myView.frame.size.height

使用框架的获取方式

myView.bottom(bottom: 200.0)

大小

使用框架提供的方法,你可以轻松的完成视图大小的获取和设置。

获取宽度

不使用框架的获取方式

let width: CGFloat = myView.frame.size.width

使用框架的获取方式

let width: CGFloat = myView.width()

设置宽度

不使用框架的获取方式

myView.frame.size.width = 100.0

使用框架的获取方式

myView.width(width: 100.0)

获取高度

不使用框架的获取方式

let height: CGFloat = myView.frame.size.height

使用框架的获取方式

let height: CGFloat = myView.height()

设置高度

不使用框架的获取方式

myView.frame.size.height = 100.0

使用框架的获取方式

myView.height(height: 100.0)

point

获取point

不使用框架的获取方式

let point: CGPoint = myView.frame.origin

使用框架的获取方式

let point: CGPoint = myView.point()

设置point

不使用框架的获取方式

myView.frame.origin = CGPoint(x: 10.0, y: 10.0)

使用框架的获取方式

myView.point(x: 10.0, y: 10.0)

//或

myView.point(point: CGPoint(x: 10.0, y: 10.0)

//或

myView.point(points: [10.0, 10.0])

//当x, y值相同时

myView.point(xy: 10.0)

Size

获取Size

不使用框架的获取方式

let size: CGSize = myView.frame.size

使用框架的获取方式

let size: CGSize = myView.size()

设置Size

不使用框架的获取方式

myView.frame.size = CGSize(width: 100.0, height: 100.0)

使用框架的获取方式

myView.size(width: 100.0, height: 100.0)

//或

myView.size(w: 100.0, h: 100.0)

//或

myView.size(size: CGSize(width: 100.0, height: 100.0))

//或

myView.size(sizes: [100.0, 100.0])

//当宽和高相同时

myView.size(widthHeight: 100.0)

frame

获取frame

不使用框架的获取方式

let frame: CGRect = myView.frame

使用框架的获取方式

let frame: CGRect = myView.frame()

设置frame

不使用框架的获取方式

myView.frame = CGRect(x: 10.0, y: 10.0, width: 100.0, height: 100.0)

//或

myView.frame = CGRect(origin: CGPoint(x: 10.0, y: 10.0), size: CGSize(width: 100.0, height: 100.0))

使用框架的获取方式

myView.frame(frame: CGRect(x: 10.0, y: 10.0, width: 100.0, height: 100.0))

//或

myView.frame(x: 10.0, y: 10.0, w: 100.0, h: 100.0)

//或

myView.frame(frames: [10.0, 10.0, 100.0, 100.0])

//当x, y和宽、高相同时

myView.frame(xy: 10.0, widthHeight: 100.0)

处理多个视图

基础操作

设置多个视图相同的x值

不使用框架的获取方式

view1.frame.origin.x = 10.0

view2.frame.origin.x = 10.0

使用框架的获取方式

UIView.x(x: 10.0, views: [view1, view2])

//或

UIView.left(left: 10.0, views: [view1, view2])

设置多个视图相同的right值

使用框架的获取方式

UIView.right(right: 10.0, views: [view1, view2])

设置多个视图相同的y值

不使用框架的获取方式

view1.frame.origin.y = 10.0

view2.frame.origin.y = 10.0

使用框架的获取方式

UIView.y(y: 10.0, views: [view1, view2])

//或

UIView.top(top: 10.0, views: [view1, view2])

设置多个视图相同的bottom值

使用框架的获取方式

UIView.bottom(bottom: 10.0, views: [view1, view2])

设置多个视图相同的宽度

不使用框架的获取方式

view1.frame.size.width = 100.0

view2.frame.size.width = 100.0

使用框架的获取方式

UIView.width(width: 100.0, views: [view1, view2])

设置多个视图相同的高度

不使用框架的获取方式

view1.frame.size.height = 100.0

view2.frame.size.height = 100.0

使用框架的获取方式

UIView.height(height: 100.0, views: [view1, view2])

设置多个视图相同的point

不使用框架的获取方式

view1.frame.origin = CGPoint(x: 10, y: 10)

view2.frame.origin = CGPoint(x: 10, y: 10)

使用框架的获取方式

UIView.point(x: 10.0, y: 10.0, views: [view1, view2])

//或

UIView.point(point: CGPoint(x: 10.0, y: 10.0), views: [view1, view2])

//或

UIView.point(points: [10.0, 10.0], views: [view1, view2])

//当x, y值相同时

UIView.point(xy: 10.0, views: [view1, view2])

设置多个视图相同的Size

不使用框架的获取方式

view1.frame.size = CGSize(width: 100.0, height: 100.0)

view2.frame.size = CGSize(width: 100.0, height: 100.0)

使用框架的获取方式

UIView.size(width: 100.0, height: 100.0, views: [view1, view2])

//或

UIView.size(w: 100.0, h: 100.0, views: [view1, view2])

//或

UIView.size(size: CGSize(width: 100.0, height: 100.0), views: [view1, view2])

//或

UIView.size(sizes: [100.0, 100.0], views: [view1, view2])

//当宽和高相同时

UIView.size(widthHeight: 100.0, views: [view1, view2])

设置多个视图相同的frame

不使用框架的获取方式

view1.frame = CGRect(x: 10.0, y: 10.0, width: 100.0, height: 100.0)

view2.frame = CGRect(x: 10.0, y: 10.0, width: 100.0, height: 100.0)

//或

view1.frame = CGRect(origin: CGPoint(x: 10.0, y: 10.0), size:CGSize(width: 100.0, height: 100.0))

view2.frame = CGRect(origin: CGPoint(x: 10.0, y: 10.0), size:CGSize(width: 100.0, height: 100.0))

使用框架的获取方式

UIView.frame(x: 10.0, y: 10.0, w: 100.0, h: 100.0, views: [view1, view2])

//或

UIView.frame(frame: CGRect(x: 10.0, y: 10.0, width: 100.0, height: 100.0), views: [view1, view2])

//或

UIView.frame(frame: CGRect(origin: CGPoint(x: 10.0, y: 10.0), size: CGSize(width: 100.0, height: 100.0)), views: [view1, view2])

//或

UIView.frame(frames: [10.0, 10.0, 100.0, 100.0], views: [view1, view2])

//当x, y和宽, 高相等时

UIView.frame(xy: 10.0, widthHeight: 100.0, views: [view1, view2])

对齐操作

框架支持多个视图的对齐

//顶端对齐

UIView.top(views: [view1, view2, view3])

//底部对齐

UIView.bottom(views: [view1, view2, view3])

//左侧对齐

UIView.left(views: [view1, view2, view3])

//右侧对齐

UIView.right(views: [view1, view2, view3])

支持对齐到某个目标位置

//顶端对齐

UIView.top(views: [view1, view2, view3], position: 50)

//底部对齐

UIView.bottom(views: [view1, view2, view3], position: 50)

//左侧对齐

UIView.left(views: [view1, view2, view3], position: 50)

//右侧对齐

UIView.right(views: [view1, view2, view3], position: 50)

分布操作

均匀分布视图:

// 在第一个和最后一个视图之间水平分布视图

UIView.horizontal(views: [view1, view2, view3, view4])

// 在第一个和最后一个视图之间垂直分布视图

UIView.vertical(views: [view1, view2, view3, view4])

组合对齐和分布操作

在一次操作中对齐和分布视图:

// 顶端对齐并且水平分布视图

UIView.topAndHorizontal(views: [view1, view2, view3, view4])

// 顶端对齐到某个目标位置并且水平分布视图

UIView.topAndHorizontal(views: [view1, view2, view3, view4], position: 50)

// 底部对齐并且水平分布视图

UIView.bottomAndHorizontal(views: [view1, view2, view3, view4])

// 底部对齐到某个目标位置并且水平分布视图

UIView.bottomAndHorizontal(views: [view1, view2, view3, view4], position: 50)

// 左侧对齐并且垂直分布视图

UIView.leftVertical(views: [view1, view2, view3, view4])

// 左侧对齐到某个目标位置并且垂直分布视图

UIView.leftVertical(views: [view1, view2, view3, view4], position: 50)

// 右侧对齐并且垂直分布视图

UIView.rightVertical(views: [view1, view2, view3, view4])

// 右侧对齐到某个目标位置并且垂直分布视图

UIView.rightVertical(views: [view1, view2, view3, view4], position: 50)

批量操作

框架支持数组的方式批量操作视图

let views: [UIView] = [view1, view2, view3]

views.width(width: 100.0)

views.width(width: 100.0, 1)//设置数组中第2个UIView的宽度

views.height(height: 100.0)

views.height(height: 100.0, 1)//设置数组中第2个UIView的高度

高级布局:构建智能的、响应式的界面

Aquarius开发框架提供了一个强大且灵活的布局系统,超越了基本的定位功能。通过高级布局技术,帮助你用最少的代码和最大的灵活性创建复杂的UI布局。

Aquarius开发框架通过全面的布局方法扩展了UIView,这些方法建立在原生基于框架的布局系统之上,使其更加直观和强大。与Auto Layout的基于约束的方法不同,Aquarius开发框架提供了直接、命令式的API,易于理解且可以无缝动画。

相对定位

基础操作

Aquarius开发框架最强大的功能之一是它能够将视图相对于彼此定位。这消除了在排列视图时进行复杂计算的需要。

// 将viewB定位在viewA下方,间距为10pt

viewB.alignTop(view: viewA, offset: 10)

// 将viewB定位在viewA右侧,间距为15pt

viewB.alignLeft(view: viewA, offset: 15)

// 将viewB定位在viewA左侧,间距为8pt

viewB.alignRight(view: viewA, offset: 8)

// 将viewB定位在viewA上方,间距为12pt

viewB.alignBottom(view: viewA, offset: 12)

批量操作

let views: [UIView] = [view1, view2, view3]

// 将views数组定位在viewA下方,间距为8pt

views.alignTop(view: viewA, offset: 8)

// 将views数组中第2个视图定位在viewA下方,间距为8pt

views.alignTop(view: viewA, offset: 8, 1)

// 将views数组定位在viewA上方,间距为8pt

views.alignBottom(view: viewA, offset: 8)

// 将views数组中第2个UI视图在viewA上方,间距为8pt

views.alignBottom(view: viewA, offset: 8, 1)

// 将views数组定位在viewA右侧,间距为8pt

views.alignLeft(view: viewA, offset: 8)

// 将views数组中第2个视图视图iewA右侧,间距为8pt

views.alignLeft(view: viewA, offset: 8, 1)

// 将views数组定位在viewA左侧,间距为8pt

views.alignRight(view: viewA, offset: 8)

// 将views数组中第2个UI视图视图wA左侧,间距为8pt

views.alignRight(view: viewA, offset: 8, 1)

这些方法简化了流布局的创建,并能够在处理动态内容时无需手动计算位置。

等同定位

基础操作

当希望视图共享相同的边缘位置时,equal方法提供了一个简洁的语法

// 使viewB的左边缘与viewA相同(可选偏移)

viewB.equalLeft(target: viewA, offset: 5)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 4:54:38

智能会议新体验:声网STT如何实现会议内容的可视化管理?

混合办公后在线会议成日常,可痛点一堆:跨国会议遇口音英语,翻译软件识别不准,1 小时会拖到 2 小时;多人插话导致会后纪要靠回忆,重要观点遗漏还易出执行偏差;通勤或公共场合参会没法开声音&…

作者头像 李华
网站建设 2026/7/7 15:47:47

初识JMeter 元件(三)

每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。 1、取样器 在Jmeter中,取样器通常用来模拟并发用户…

作者头像 李华
网站建设 2026/7/7 13:16:02

AMD GPU上的注意力机制性能优化实战指南

AMD GPU上的注意力机制性能优化实战指南 【免费下载链接】flash-attention Fast and memory-efficient exact attention 项目地址: https://gitcode.com/GitHub_Trending/fl/flash-attention 您是否在AMD ROCm平台上部署大语言模型时,经常遇到内存不足或性能…

作者头像 李华
网站建设 2026/7/7 15:58:34

实测声网STT:连带成交率飙升,电商直播的留客神器

做电商直播两年多,我最头疼的就是抓不住用户需求!弹幕刷得快,主播根本顾不上一一回应;连麦用户的具体需求下播后也记不清,优化产品介绍和客服策略毫无方向。不少用户还因通勤、办公不便开声音,错过优惠和讲…

作者头像 李华