swift - 带有自动布局的 uiscrollview 的动态内容未按预期工作
问题描述
我正在尝试将动态内容添加到滚动视图,如下所示
for i in 0 ..< 4 {
let gameView = Card.instantiate()
gameView.frame.origin.y = gameView.frame.size.height * CGFloat(i)
contentView.addSubview(gameView)
gameView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
let widthConstraint = NSLayoutConstraint(item: gameView, attribute: .width, relatedBy: .equal,toItem: contentView, attribute: .width, multiplier: 0.8,constant : 0.0)
contentView.addConstraint(widthConstraint)
let heightConstraint = NSLayoutConstraint(item: gameView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 100)
gameView.addConstraint(heightConstraint)
contentView.frame.size.height = contentView.frame.size.height + gameView.frame.size.height
scrollView.contentSize.height = scrollView.contentSize.height + gameView.frame.size.height
}
并在 IB 中查看结构如下 SuperView > ScrollView > ContentView > DynamicViews
ContentView 还包含一些静态内容,如按钮和标签。动态视图低于静态内容
这是将动态视图添加到滚动视图的正确方法吗?
解决方案
这是一个理想的案例UIStackView
堆栈视图将处理实例化gameView
s 的垂直定位和宽度(假设您的 xib 加载设置正确)。
通过将堆栈视图的顶部、前导、尾随、底部和宽度约束到滚动视图,它还将定义“可滚动区域”(the .contentSize
)。
全部通过自动布局完成:
let sv = UIStackView()
sv.axis = .vertical
sv.alignment = .fill
sv.distribution = .fill
sv.spacing = 0 // change to add vertical spacing if desired
sv.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(sv)
NSLayoutConstraint.activate([
sv.topAnchor.constraint(equalTo: scrollView.topAnchor),
sv.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
sv.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
sv.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
sv.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1.0),
])
for _ in 0 ..< 4 {
let gameView = Card.instantiate()
gameView.translatesAutoresizingMaskIntoConstraints = false
gameView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
sv.addArrangedSubview(gameView)
}
推荐阅读
- crystal-reports - 以所需格式格式化水晶报表中的小数点
- python - 减少所有英语单词的 Trie 的大小
- php - 在 Debian GNU/Linux 9 上安装 mailparse
- r - 需要帮助将变量更改为 Rstudio 中 103 列中的整数
- node.js - 根据扳手数据库中的插入/更新创建触发器
- reactjs - React - 如何在 setState 中执行网络请求,我的代码可以吗?
- c++ - 如何修复警告“编译器可以假定‘对象’的地址永远不会为 NULL”
- sed - SED 替换了少数第一次出现(和范围)的模式
- git - 如何从特定 repo 下载源代码,其中仅包含在该 repo 中的特定提交期间已更改或添加的文件?
- python - 具有水平索引号的字符串