写点什么

Masonry 与 iOS 自动布局

  • 2014-02-10
  • 本文字数:1013 字

    阅读完需:约 3 分钟

开源项目 Masonry 旨在让自动布局(Auto Layout)的代码更简洁、可读性更强。

Masonry ,“一个轻量级的布局框架,采用更优雅的语法封装自动布局”,不需要使用 XIB 和 Storyboard。它的创造者 Jonas Budelmann论证了尽管自动布局很强大,但它很快就变得冗长而不可读。

Masonry 是一种领域特定语言(DSL),为自动布局的所有功能提供便捷的方法,包括建立和修改约束、存取属性、设置优先级以及调试支持。

GitHub 上的示例代码展示了 Masonry 的典型用法及其简洁的语法

复制代码
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
{1}
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];

自动布局最重要的是约束:UI 元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突、约束不足造成布局无法确定。这两种情况都会产生异常。

通过编程的方式,不使用Masonry,也可以创建约束:创建 NSLayoutConstraint , 关联到视图并指定属性和关系。Apple 也提供了 Visual Format Language ,它是另一种以文本方式描述关系的领域特定语言。

自动布局既不是强制的,也不是独有的方法。“springs and struts”仍然是一种有效的方法。“springs and struts”也就是 autoresizing masks ,决定了一个视图的父视图大小变化时,其自身如何变化。

Apple 提供了采用自动布局的令人信服的原因

  • “Springs and struts”模式需要编写代码来处理各种屏幕方向、尺寸和动态内容。
  • iOS 7 中的动态类型允许用户在应用中设置文字大小偏好。
  • 支持 iOS 6 和 iOS 7 以及它们不同的元素度量。

自动布局并非完美无缺。Apple 提供了一篇指南,以常用的UIScrollView 为例说明如何使用自动布局。Matt Newburg 在一篇回复中给出了充足的理由说明为什么“自动布局在视图转换时并不完美”。为了弥补这种不足,他建议更多地使用层转换。

任何类型的自动布局代码意味着你将无法获得Xcode5 提供的Interface Builder 增强功能的支持。特别是可视化地解决自动布局问题的功能,在assistant editor 的预览模式中查看各种屏幕方向、尺寸和iOS 系统版本下的运行时布局的功能。

原文英文链接: iOS Auto Layout with Masonry


感谢姚琪琳对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-02-10 07:5215671

评论

发布
暂无评论
发现更多内容

开源一夏 | 实战Node.js之GET/POST请求在Web 应用架构在客户端的使用

恒山其若陋兮

开源 8月月更

在线诺基亚短信图片生成器工具

入门小站

工具

在线XML转TSV工具

入门小站

工具

开源无界 携手共创|观测云参加 SUSECON 2022 北京开源技术峰会

观测云

阿里云ECS之MySQL基础操作

六月的雨在InfoQ

MySQL ECS 8月月更

头脑风暴:最长连续递增序列

HelloWorld杰少

算法 LeetCode 数据结构, 8月月更

加密市场由阴转晴,Zebec或成2022后半段黑马

鳄鱼视界

聚焦2022全球边缘计算大会·深圳站,揭秘火山引擎新一代边缘云解决方案

火山引擎边缘云

分布式 CDN 边缘计算 渲染 边缘云

架构实战营|毕业总结

KDA

#架构实战营

开源一夏 | 阿里云ECS之Linux 文件管理命令

六月的雨在InfoQ

Linux 开源 8月月更 文件管理命令 磁盘命令

《Dubbo3.0.8源码解析》15-Dubbo的三大中心之元数据中心源码解析

宋小生

dubbo Dubbo3

IPv4向IPv6的过渡技术

穿过生命散发芬芳

ipv6 8月月更

详解CAN总线:常用CAN连接器的使用方法

不脱发的程序猿

汽车电子 嵌入式开发 CAN连接器

物联网平台如何支持设备的多样化接入——设备接入类

阿里云AIoT

网络协议 存储 数据采集 JSON库 传感器

开源一夏 | 阿里云ECS之Linux 文本操作命令

六月的雨在InfoQ

vim Linux 开源 8月月更 more

坚叔:让科幻片的概念变成产品丨编程挑战赛 x 嘉宾分享

RTE开发者社区

人工智能 编程‘

Spring进阶(一):SpringMVC常用注解标签详解

No Silver Bullet

springmvc 注解 8月月更

文件管理-Linux系统文件属性

Albert Edison

Linux centos 运维 文件管理 8月月更

开源一夏 | 阿里云ECS之Linux 系统工作命令

六月的雨在InfoQ

Linux 开源 8月月更 系统命令

架构训练营毕业总结

joak

消费大众网民的审丑心理,如何拯救扭曲化的自媒体行业

石头IT视角

知识库如何进行定期检查?

Geek_da0866

开源一夏|三步注册gitee

坚果

开源 8月月更

智能化运维场景分析

阿泽🧸

智能运维 8月月更

C++多态的基本概念与原理刨析

CtrlX

c c++ 面向对象 代码 8月月更

LabVIEW LINX Toolkit控制Arduino设备(拓展篇—1)

不脱发的程序猿

嵌入式 单片机 LabVIEW Arduino LINX Toolkit

详解CAN总线:什么是CAN总线?

不脱发的程序猿

嵌入式 汽车电子 CAN总线协议

6.18秒杀系统架构设计

joak

从一条更新SQL的执行过程窥探InnoDB之REDOLOG

京东科技开发者

MySQL 数据库

一次minerd肉鸡木马的排查思路

京东科技开发者

安全 木马病毒

架构实战营|模块9

KDA

#架构实战营

Masonry与iOS自动布局_移动_Scott McKenzie_InfoQ精选文章