我想构建一个图像网格,通过调用Web服务从网络中获取项目。
我的观点是由UIStackView构成的(我的应用程序仅使用autolayout而不是基于IB,所有内容都是以编程方式制作的。)
我面临的问题是我想在后台线程中安排子视图,但当然,由于布局被更改而不是在主线程中,所以进程停止(我不能将其粘在主线程中)线程没有拖延应用程序)。
任何人都有聪明的方法吗? (对使用tableview或集合视图的建议不感兴趣)。
for cat in categories {
// Separator
let line = UILine()
explorer.addArrangedSubview(line)
line.translatesAutoresizingMaskIntoConstraints = false
line.heightAnchor.constraintEqualToConstant(1).active = true
let n = cat.publications.count
// Category name and call to action
if true {
let sv = UIStackView()
explorer.addArrangedSubview(sv)
sv.axis = .Horizontal
var
label = UILabel()
sv.addArrangedSubview(label)
label.text = cat.name
label.textColor = UIColor.grayColor()
label.sizeToFit()
if n >= explorerColumnsCount {
label = UILabel()
sv.addArrangedSubview(label)
label.text = "Tout >"
label.textColor = Customization.tintColor
label.sizeToFit()
}
}
// etc. including downloading remote image and adding to the stack view
有些评论与我的研究有关: 仅调度addArrandedSubview并不能解决问题,首先,因为它与程序的其余部分创建了一个时间转换(主队列与另一个线程是异步的,所以无法预测何时添加子视图,其次,问题的主要原因是元素之间的约束激活。我试图在数组中花费所有约束并在完成视图树时在主线程中激活它们,但它会使代码变得非常复杂。 我目前的解决方案是在视图树完成后运行第二个线程,负责在视图中下载和设置图像。