我正在尝试构建一个UIView
,该使用其他视图的固有宽度从左到右布置其他视图,然后在必要时换行。 UICollectionView
对于我需要的东西来说似乎过于复杂了。 我还尝试使用FlexLayout包装器进行瑜伽,但似乎无法获得正确的咒语。 似乎应该比这容易得多 - 简单的解决方案是什么?
我最终编写了自己的UIView来解决这个问题。 我怀疑它是否非常强大,但它解决了我的迫切需求。 如果您有改进建议,请发表评论。
import UIKit
class FlowLayout: UIView {
private var hgapValue: CGFloat = 0.0
private var vgapValue: CGFloat = 0.0
var hgap: CGFloat {
set(newValue) {
hgapValue = (newValue < 0) ? -newValue : newValue
}
get {
return hgapValue
}
}
var vgap: CGFloat {
set(newValue) {
vgapValue = (newValue < 0) ? -newValue : newValue
}
get {
return vgapValue
}
}
//initWithFrame to init view from code
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
//initWithCode to init view from xib or storyboard
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
override func didAddSubview(_ subview: UIView) {
refreshLayout()
}
//common func to init our view
private func setupView() {
// backgroundColor = .red
}
public func refreshLayout() {
var x: CGFloat = 0.0
var y: CGFloat = 0.0
for subview in subviews {
subview.frame.origin.x = x
subview.frame.origin.y = y
x += subview.frame.width + hgapValue
if x + subview.frame.width >= (subview.superview?.frame.width)! {
x = 0.0
y += subview.frame.height + vgapValue
}
}
setNeedsDisplay()
}
}
在界面生成器中,使用 UIStackView 实现一个简单的替代方案。
您还可以打开自动布局以使其自然。