【问题标题】:What is iOS's equivalent of Java/Swing's FlowLayout?iOS 相当于 Java/Swing 的 FlowLayout 是什么?
【发布时间】:2019-06-10 02:14:43
【问题描述】:

我正在尝试构建一个UIView,它使用其固有宽度从左到右布置其他视图,然后在必要时进行换行。 UICollectionView 对于我需要的东西来说似乎过于复杂。我还尝试使用用于 Yoga 的 FlexLayout 包装器,但似乎无法获得正确的咒语。看起来应该比这容易得多——简单的解决方案是什么?

【问题讨论】:

  • 除了第一句话的内容外,还有其他要求吗?您提供的详细信息越多,只了解 iOS 的人就越有可能回答这个问题(即,也不必了解 FlowLayout)。
  • 无额外要求。使用内在宽度和环绕是核心要求。我需要添加/删除子视图,因此它应该在添加/删除视图时尽可能多地包装/展开。
  • 动态添加/删除它们,你的意思是,当视图在屏幕上时?
  • 是的。我会看看我是否可以上传我想要构建的屏幕截图,但这个想法很简单。用户选中屏幕底部的 1-12 复选框,将相应的图像添加到屏幕顶部。他当然可能会改变对他想看的东西的想法,所以他可能会多次检查和取消检查。上部屏幕自然保持最新状态。最后按下一个按钮,图像被随机重新排序。
  • 这段视频的前25秒让您了解我正在尝试的内容,尽管它没有显示MEEEPle-Shapped图像包装,而不是在线上安装。 youtube.com/watch?v=mY19eAj5K0c&t=27s

标签: ios cocoa-touch layout uiview flowlayout


【解决方案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()
}

}

【讨论】:

    【解决方案2】:

    在界面生成器中,使用 UIStackView 来实现一个简单的替代方案。

    你也可以开启自动布局,让它自然。

    【讨论】:

    • 请记住,UIStackView 让您设置一列或一行控件。它与 Swing 的 FlowLayout 或集合视图的流布局完全不同。
    • 不幸的是,UIStackView 没有换行。
    • 关于嵌套堆栈视图
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 2012-03-22
    • 2017-08-21
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2022-11-11
    相关资源
    最近更新 更多