iOS与Java / Swing的FlowLayout等效吗?

时间:2019-01-16 02:13:48

标签: ios cocoa-touch layout uiview flowlayout

我正在尝试构建一个UIView,该布局使用其固有宽度从左到右布置其他视图,然后在必要时进行包装。 UICollectionView似乎太复杂了。我也尝试过将FlexLayout包装器用于Yoga,但似乎无法获得正确的咒语。似乎比这要容易得多-什么是简单的解决方案?

2 个答案:

答案 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实现一个简单的替代方法。

您还可以打开自动版面设置使其自然。