UIStackView 实战:打造高效 iOS 界面布局
1. UIStackView 入门为什么它是 iOS 开发者的秘密武器第一次接触 UIStackView 是在 2014 年的 WWDC 大会上当时苹果工程师演示这个布局魔法时全场开发者都发出了惊叹声。这么多年过去我依然记得那个瞬间——因为 UIStackView 彻底改变了我写界面布局的方式。简单来说UIStackView 就像是一个智能的视图收纳盒。你把需要排列的按钮、标签、图片等 UI 元素扔进去它就能自动帮你排得整整齐齐。最神奇的是当屏幕旋转或者内容变化时它还能自动调整布局完全不用手动修改约束。举个例子假设你要做一个简单的商品标签栏传统方式需要创建 3 个 UILabel为每个 label 添加 leading/trailing/top/bottom 约束处理间距和居中对齐考虑屏幕旋转时的适配而用 UIStackView 只需要let stack UIStackView(arrangedSubviews: [label1, label2, label3]) stack.axis .horizontal stack.distribution .fillEqually stack.spacing 10四行代码搞定所有布局还能自动适配各种屏幕尺寸。这就是为什么我说它是 iOS 开发者的布局加速器。2. 核心属性详解掌握这 5 个参数就能玩转布局2.1 排列方向axis这个属性决定了你的视图是横着排还是竖着排就像选择书架是横放还是竖放// 水平排列像书架横放 stackView.axis .horizontal // 垂直排列像书架竖放 stackView.axis .vertical实际项目中我常用水平排列来做导航栏按钮组用垂直排列来做表单输入框列表。有个小技巧在 iPad 分屏适配时可以根据宽度阈值动态切换 axis 方向实现自动排版。2.2 分布方式distribution这个属性控制子视图在主轴方向上的空间分配就像决定书架每层放几本书// 等宽分布每个子视图宽度相同 stackView.distribution .fillEqually // 按内容比例分配图文混排时特别有用 stackView.distribution .fillProportionally // 固定间距保持子视图中心点等距 stackView.distribution .equalSpacing最近做电商项目时我用 .fillProportionally 实现了商品图片和价格的智能排版图片占 70% 宽度价格标签自动占剩余 30%完全不用手动计算 frame。2.3 对齐方式alignment控制垂直于主轴方向的对齐类似书籍在书架上的摆放方式// 顶部对齐适合导航栏按钮 stackView.alignment .top // 居中对齐适合表单输入框 stackView.alignment .center // 基线对齐文字排版必备 stackView.alignment .firstBaseline特别注意 .firstBaseline 对齐在做多行文本混排时能保证文字基线对齐避免出现参差不齐的情况。上周我就用这个特性完美解决了客户提出的文字对不齐的 bug。3. 实战技巧从简单布局到复杂界面3.1 创建带间距的按钮组假设要做一个社交应用的底部工具栏let stackView UIStackView() stackView.axis .horizontal stackView.distribution .fillEqually stackView.spacing 16 let buttons [首页, 发现, 消息, 我的].map { title in let btn UIButton(type: .system) btn.setTitle(title, for: .normal) return btn } buttons.forEach { stackView.addArrangedSubview($0) } // 添加底部安全区域约束 NSLayoutConstraint.activate([ stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ])这个方案会自动处理 iPhone X 系列的底部安全区域而且按钮间距会随着屏幕宽度自动调整。3.2 实现动态增减的标签云做筛选标签功能时经常需要动态增减标签// 添加标签 func addTag(_ text: String) { let label PaddedLabel() // 自定义带内边距的Label label.text text stackView.insertArrangedSubview(label, at: 0) // 动画效果 UIView.animate(withDuration: 0.3) { self.stackView.layoutIfNeeded() } } // 移除标签 func removeTag(_ index: Int) { let view stackView.arrangedSubviews[index] stackView.removeArrangedSubview(view) view.removeFromSuperview() }这里有个坑要注意removeArrangedSubview 只是从布局中移除视图依然存在必须再调用 removeFromSuperview 才能真正释放内存。4. 高级应用嵌套 StackView 构建复杂界面4.1 电商商品卡片布局最近用嵌套 StackView 实现了一个商品卡片结构如下垂直 StackView (整体卡片) ├─ 水平 StackView (标题行) │ ├─ 商品名称 Label │ └─ 价格 Label ├─ 商品图片 ImageView └─ 水平 StackView (按钮组) ├─ 收藏按钮 ├─ 购物车按钮 └─ 购买按钮关键代码// 外层垂直Stack let cardStack UIStackView() cardStack.axis .vertical cardStack.spacing 12 // 标题行 let titleStack UIStackView(arrangedSubviews: [nameLabel, priceLabel]) titleStack.distribution .fillProportionally // 按钮组 let buttonStack UIStackView(arrangedSubviews: [favoriteBtn, cartBtn, buyBtn]) buttonStack.distribution .fillEqually buttonStack.spacing 8 // 组合所有元素 cardStack.addArrangedSubview(titleStack) cardStack.addArrangedSubview(productImage) cardStack.addArrangedSubview(buttonStack)这种嵌套结构可以自动处理各种屏幕尺寸下的布局在 iPhone SE 和 iPad Pro 上都能完美显示。4.2 表单输入界面优化对于包含多个输入框的表单我推荐这种结构垂直 StackView (整体表单) ├─ 水平 StackView (姓名行) │ ├─ 姓 Label │ └─ 姓 TextField ├─ 水平 StackView (电话行) │ ├─ 电话 Label │ └─ 电话 TextField └─ 提交按钮技巧在于设置 StackView 的 isLayoutMarginsRelativeArrangementformStack.isLayoutMarginsRelativeArrangement true formStack.layoutMargins UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)这样会自动保留内边距让表单看起来更专业。记得设置 TextField 的 contentHuggingPriority防止被拉伸变形。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2513838.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!