SnapKit:如何以编程方式设置 TableView 单元格中项目的布局约束

2024-04-25

我是 swift/iOS 开发的初学者。来自 Web 开发,与 DOM/Box 模型相比,布局模型对我来说完全令人困惑。我知道这意味着要头脑清醒,但对于我来说,我似乎无法弄清楚,我希望像这样的基本示例可以帮助说明一些事情,即使我正在使用 DSL像快照包:http://snapkit.io/ http://snapkit.io/

我该如何构建如下布局的约束:

到目前为止,我所得到的(显然是错误的)如下:

label1.snp.makeConstraints { (make) -> Void in
  make.leading.equalTo(Style.MARGIN)
  make.trailing.equalTo(-Style.MARGIN)
  make.centerX.equalTo(self)
  make.top.equalTo(Style.MARGIN)
}

label2.snp.makeConstraints { (make) -> Void in
  make.leading.equalTo(Style.MARGIN)
  make.trailing.equalTo(-Style.MARGIN)
  make.centerX.equalTo(self)
  make.top.equalTo(label1.snp.bottom)
}

exampleImage.snp.makeConstraints { (make) -> Void in
  make.leading.equalTo(0)
  make.trailing.equalTo(0)
  make.top.equalTo(label2.snp.bottom).offset(Style.MARGIN)
  make.bottom.equalTo(0)
}

where Style.MARGIN只是一个常量设置为20

我觉得我只需要看到这样的示例就可以了解布局的流动和构建方式,并且也许可以摆脱像网站一样的构建方式。我认为在最基本的层面上,对我来说最困惑的事情是理解如何将不同动态高度的对象放置在前一个对象的下方,并使 tableViewCell 也相应地调整大小。


从 iOS 9 开始,可以使用 UIStackViews 构建许多像这样的简单布局,UIStackViews 是管理子视图及其布局约束的容器视图,因此您不必这样做(就像怀旧评论家一样)。

除了概念简单之外,UIStackViews 对它们还有很多好处。它们性能良好,易于使用,并且可以轻松隐藏/显示视图,而无需手动操作和更新大量约束。

在本例中,您有两个 UILabels 和一个 UIImageView,它们以一定的间距堆叠在一起。如果我要实现这个布局,我会将两个标签组合在一个 UIStackView 中,将其添加到带有一些插图的 UIView 中,然后将该视图与 UIImageView 一起添加到另一个 UIStackView 中,如下所示:

UIStackView (1)

界面视图 (2)

UIStackView (3)

用户界面标签 (4)

用户界面标签 (5)

UI图像视图 (6)

并在代码中:

let containerStackView = UIStackView() // (1)
containerStackView.axis = .vertical

let greenLabel = UILabel() // (4)
greenLabel.text = "Hello,"

let blueLabel = UILabel() // (5)
blueLabel.text = "World!"

let textStackView = UIStackView() // (3)
textStackView.axis = .vertical
textStackView.spacing = 10
textStackView.addArrangedSubview(greenLabel)
textStackView.addArrangedSubview(blueLabel)

let textContainerView = UIView() // (2)
textContainerView.addSubview(textStackView)
textStackView.snp.makeConstraints { make in
    make.edges.equalToSuperview().inset(20)
}

let imageView = UIImageView(image: UIImage(named: "my-image") // (6)
containerStackView.addArrangedSubview(textContainerView)
containerStackView.addArrangedSubview(imageView)

然后您需要将容器堆栈视图限制为 UITableViewCell 的内容视图:

contentView.addSubview(containerStackView)
containerStackView.snp.makeConstraints { make in
    make.edges.equalToSuperview()
}

我就是这样做的。当然,您自己管理约束的方法同样有效,并且可以按如下方式完成:

contentView.addSubview(label1)
label1.snp.makeConstraints { make in
    make.leading.equalToSuperview().offset(20)
    make.trailing.equalToSuperview().offset(-20)
    make.top.equalToSuperview().offset(20)
}

contentView.addSubview(label2)
label2.snp.makeConstraints { make in
    make.leading.equalToSuperview().offset(20)
    make.trailing.equalToSuperview().offset(-20)
    make.top.equalTo(label1.snp.bottom).offset(10)
}

contentView.addSubview(exampleImage)
exampleImage.snp.makeConstraints { make in
    make.leading.trailing.bottom.equalToSuperview()
    make.top.equalTo(label2.snp.bottom).offset(20)
}

请注意,我是在文本编辑器中编写的,因此可能存在一些拼写错误,但总体思路应该成立。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SnapKit:如何以编程方式设置 TableView 单元格中项目的布局约束 的相关文章

随机推荐

  • 如何防范资源耗尽等漏洞?

    我们碰巧使用IBM appscanhttp www 01 ibm com software awdtools appscan http www 01 ibm com software awdtools appscan 针对我们的 java
  • 仅使用 CSS 切换手风琴字形图标

    嗯 我有一个手风琴菜单 我想更改字形图标 我找到了一些询问同样问题的人的答案 但我发现没有答案适用于我的 可能是因为我不知道在哪里应用代码 我在 Jsfiddle 中的菜单 http jsfiddle net 3wt0ehcj http j
  • 连接从左到右 (LTR) 和从右到左 (RTL) 文本

    似乎使用组合从左到右 LTR 和从右到左 RTL 文本paste可能会产生意想不到的结果 x paste c green collapse arabic for blue and red gt 1 green paste x yellow
  • Java If(false) 编译

    我正在使用 Tomcat 开发一个动态 Web 项目 有一个全局标志很有用 这是我在开发服务器和部署服务器之间唯一需要更改的东西 该标志的最大用途是与打印语句一起使用 public class Debug public final stat
  • 安卓定时器问题

    您好 我正在构建一个应用程序 它将在固定的时间段 例如每 30 分钟 执行一段代码 我希望这个时间段是严格的 我的意思是我希望保证该时间段为 30 分钟而不是 28 分钟 或者每当操作系统想要执行它时 我有一个 Timer 对象并按如下方式
  • 如何在本机反应中使用高度自动?

    在浏览器中 可以指定图像的宽度 并且可以将高度设置为自动 这将使图像在绑定到指定宽度的同时保留宽高比 高度和长宽比均事先未知 我怎样才能在本机反应中做同样的事情 Height 属性只能接受数字值 解决方法 得到Dimensions模块来自r
  • 如何展平嵌套 JSON

    尝试将嵌套的 json 响应从 2 层深度压平到 1 层 这是我在 Go Playground 上的工作代码 http play golang org p kHAYuZUTko http play golang org p kHAYuZUT
  • 找出 2 个日期之间的月数

    select age 2012 11 30 00 00 00 timestamp 2012 10 31 00 00 00 timestamp age 2012 12 31 00 00 00 timestamp 2012 10 31 00 0
  • 将MapPageRoute添加到asp.net mvc项目后,站点停止进入Home Controller

    我正在尝试在我的 asp net mvc 项目中路由 aspx Webforms 页面 我在 global asax 中注册该页面 routes IgnoreRoute resource axd pathInfo routes MapPag
  • 如何使用 VS Code 浏览器进行导航

    这是一个关于 VS Code 资源管理器窗口导航的问题 在 Windows 资源管理器应用程序中 我可以立即导航到我选择的任何文件 如果 Windows 资源管理器窗口以升序名称顺序显示我的文件夹或文件 我可以通过键入我要查找的文件 文件夹
  • 获取 angular2 中表单的所有值

    我可以使用以下代码获取表单的值
  • 查找集合列表中不相交集合对的数量

    问题陈述如下 给定一个包含 n 个集合的列表 每个集合包含 k 个整数 找到不相交集合对的数量 假设集合的可能元素为正 且上界为 c gt n 并且假设 k 我试图想出一种有效的算法来比 O kn 2 更快地解决这个问题 这是简单解决方案的
  • 使用java将当前GMT时间转换为CST时区

    我正在尝试使用 JDK8 将当前 GMT 时间转换为 CST 时间 但我的代码总是为两个时区返回相同的时间 我还验证了 getAvailableIDs 具有 CST Calendar cal Calendar getInstance Tim
  • ASP.NET WebForms:短路验证

    我有一个正在验证的网格文本框
  • Django AJAX JSON 响应在浏览器中显示为原始文本

    我正在 Pinax 框架内使用 Django 1 4 2 开发一个 Stripe Web 应用程序 django stripe 付款 艾尔达瑞安 阿贾克斯 我已经一切正常 除了 ajax 响应 JSON 格式 似乎没有被任何 ajax 回调
  • 将聚合查询结果映射到 hibernate 对象

    是否可以将聚合查询的结果映射到 hibernate 支持的域对象中的字段 例如 如果我有一个如下所示的 Car 对象 Entity public class Car Id private int id Column private Stri
  • iOS - 本地通知 - cancelAllLocalNotifications

    可能是一个简单的问题 当我调用 cancelAllLocalNotifications 时 它是仅取消该应用程序创建的通知还是也会取消来自其他应用程序的所有通知 其他应用程序创建的通知不会受到影响 From 本地和推送通知编程指南 http
  • 最好的“忘记密码”方法是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 忘记密码 实现忘记密码功能的最佳方法是什么 https stackoverflow com questions 522967 forgot password what is the best meth
  • 使用 ruby​​ 的正则表达式来匹配句子中的主题标签

    我正在尝试使用 ruby on Rails 为一个简单的大学项目提取主题标签 我面临着仅包含数字的标签和没有空格的标签的问题 text Pack my box with 5 dozen liquor jugs link com liquor
  • SnapKit:如何以编程方式设置 TableView 单元格中项目的布局约束

    我是 swift iOS 开发的初学者 来自 Web 开发 与 DOM Box 模型相比 布局模型对我来说完全令人困惑 我知道这意味着要头脑清醒 但对于我来说 我似乎无法弄清楚 我希望像这样的基本示例可以帮助说明一些事情 即使我正在使用 D