我正在尝试构建一个UIView
,该布局使用其固有宽度从左到右布置其他视图,然后在必要时进行包装。 UICollectionView
似乎太复杂了。我也尝试过将FlexLayout包装器用于Yoga,但似乎无法获得正确的咒语。似乎比这要容易得多-什么是简单的解决方案?
答案 0 :(得分:1)
我最终编写了自己的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()
}
}
答案 1 :(得分:-1)
在界面构建器中,使用UIStackView实现一个简单的替代方法。
您还可以打开自动版面设置使其自然。