我的第一篇文章,所以我希望自己做对了。
我有一个自定义UIView,其中包含自定义UIButton的数组。
我已经重写了func draw(_ rect:CGRect),它具有以下代码:
override func draw(_ rect: CGRect) {
// remove all buttons currently on the bar
self.subviews.forEach { $0.removeFromSuperview() }
// process all buttons that are not hidden
var i = 0
for btn in buttons {
if !btn.button.isHidden {
self.addSubview(btn.button)
// set constraints with SnapKit
btn.button.snp.makeConstraints { (c) in
c.size.equalTo(buttonSize)
c.left.equalToSuperview().offset(padding.width + (isVertical ? 0 : (i * buttonSize.width)))
c.top.equalToSuperview().offset(padding.height + (isVertical ? (i * buttonSize.height) : 0))
}
i += 1
}
}
// set button bar's constraints
snp.updateConstraints { (c) in
if isVertical {
c.height.equalTo(max(visibleCount, 1) * buttonSize.height + 2 * padding.height)
} else {
c.width.equalTo(max(visibleCount, 1) * buttonSize.width + 2 * padding.width)
}
}
}
每当我执行setNeedsLayout()时,它都会按预期执行,但是也会在同一超级视图中更新UIImage。
这会导致问题,因为UIImage可以平移并且无法将其重新居中。
我已经通过注释不同的部分对上面的代码进行了测试,发现是当它自己放置按钮时才引起这种行为。
当然,这不是我想要的行为。
任何帮助/想法/建议都将受到欢迎。
ViewController中子视图添加的顺序是...
private func setupViews() {
view.backgroundColor = .green
view.addSubview(mapDisplay)
view.addSubview(contextMenu)
view.addSubview(FloatingMenu)
}
答案 0 :(得分:0)
我把代码拆开后自己解决了这个问题。
事实证明,我所讨论的UIImageView有一个空约束占位符,并且SnapKit接受了一个空约束作为显式指令来“删除”所有约束,并在其他调用时将所讨论的项重置为“零”。进行更新。
我认为这种行为是错误的,因为我的UIView是视图控制器中的同级子视图,但是确实存在……所以做类似的事情
mapDisplay.snp.makeConstraints {(c)in
}
当UIView更新按钮位置时,由于某种原因,会使UIImageView(mapDisplay)捕捉回到屏幕中心。
我猜应该将其发布在他们的gitHub上。