Я решил написать свой собственный 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()
}
}
Mozilla.org имеет очень хорошее объяснение различных литералов с примерами.
Литералы массивов
Литерал массивов является списком нуля или большего количества выражений, каждое из которых представляет элемент массива, включенный в квадратные скобки ([]). При создании массива с помощью литерала массивов он инициализируется с заданными значениями как его элементы, и его длина установлена на количество указанных аргументов.
Литералы объектов
Литерал объектов является списком нуля или большим количеством пар имен свойства и присваиваемых значений объекта, включенного в фигурные скобки ({}). Вы не должны использовать литерал объектов в начале оператора. Это будет приводить к ошибке или не вести себя, как Вы ожидаете, потому что {будет интерпретироваться как начало блока.
Различием является способ, которым они индексируются.
Объекты имеют имя, оценивают пар, которые не заказаны. В некоторых браузерах порядок Вы добавленные стоимости будут порядком, который Вы получаете, когда Вы пересекаете объект, но не всего. Имя обычно является строкой.
Массивы численно индексируются, и порядок полностью надежен
Литерал объекта
var a = {};
Литерал массива
var a = [];
Вот и все!