我在Swift中有一个包含自定义单元格的表格视图,其中包含水平布局UIView。我注意到在水平视图中滚动正确定位的子视图时会开始相乘。我猜这与在表滚动时调用layoutSubviews()有关,而事实tableview在隐藏时会回收它的单元格并在需要时显示它们,但忽略当前定位的子视图。
它看起来像这样
之前已经有类似的问题,但它没有好的答案。
UIScrollview calling superviews layoutSubviews when scrolling?
这是我在我的自定义单元格中使用的代码,用于水平定位:
class HorizontalLayout: UIView {
var xOffsets: [CGFloat] = []
override func layoutSubviews() {
var width: CGFloat = 0
for i in 0..<subviews.count {
var view = subviews[i] as UIView
view.layoutSubviews()
width += xOffsets[i]
view.frame.origin.x = width
width += view.frame.width
}
self.frame.size.width = width
}
override func addSubview(view: UIView) {
xOffsets.append(view.frame.origin.x)
super.addSubview(view)
}
func removeAll() {
for view in subviews {
view.removeFromSuperview()
}
xOffsets.removeAll(keepCapacity: false)
}
}
从这里采取:https://medium.com/swift-programming/dynamic-layouts-in-swift-b56cf8049b08
使用内部自定义单元格如下:
func loadStops(stops:[String]) {
for stop in stops {
// just testing purposes only
let view = UIView(frame: CGRectMake(10, 0, 40, 40))
view.backgroundColor = UIColor.redColor()
stopsView.addSubview(view)
}
}
有没有办法解决这个问题,防止子视图在滚动时成倍增加,也许是在子视图单元格中水平定位子视图的更好方法?