news 2026/2/21 9:07:35

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/2/20 5:15:13

WebLink 即时通讯系统--测试报告

目录 一、测试背景 二、测试环境 三、功能测试 3.1设计测试用例 3.2基本功能测试 四、自动化测试 五、性能测试 一、测试背景 随着互联网的快速发展,即时通讯工具已成为人们日常生活和工作中不可或缺的一部分。网页聊天室作为一种轻量级的即时通讯平台&#…

作者头像 李华
网站建设 2026/2/19 16:02:38

学生开发者免费获取EmotiVoice学习资源

学生开发者免费获取EmotiVoice学习资源 在智能语音助手越来越“懂人心”的今天,你有没有想过,一段机器生成的声音也能带着笑意、藏着哽咽,甚至像老朋友一样轻声安慰?这不再是科幻电影的桥段——随着深度学习的发展,文本…

作者头像 李华
网站建设 2026/2/20 16:04:49

浏览器AI失控怎么办?WebLLM日志处理器精准干预指南

浏览器AI失控怎么办?WebLLM日志处理器精准干预指南 【免费下载链接】web-llm 将大型语言模型和聊天功能引入网络浏览器。所有内容都在浏览器内部运行,无需服务器支持。 项目地址: https://gitcode.com/GitHub_Trending/we/web-llm 你是否遇到过这…

作者头像 李华
网站建设 2026/2/19 12:53:18

22、文本文件处理与控制台脚本使用指南

文本文件处理与控制台脚本使用指南 1. 归档与压缩相关命令 在处理文件时,归档和压缩是常见的操作, tar 和 cpio 是常用的工具。 1.1 tar 命令 tar 命令功能强大,可用于创建、提取、比较和更新归档文件。使用 --extract 开关提取文件时,它会恢复文件路径名中的…

作者头像 李华