我正在使用一个滑块,该滑块随着移动会更新特定标签的值。滑块中的条具有垂直约束,以使其仅位于另一个元素的顶部,而另一个则使其水平居中。
如果我不更新标签,则用PanGestureRecognizer
更改条形的位置非常有效:
@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translation(in: self.view)
if let meterView = recognizer.view {
let minX = view.bounds.minX + meterView.bounds.width/2
let maxX = view.bounds.maxX - meterView.bounds.width/2
var resultingX = meterView.center.x + translation.x
resultingX = resultingX < minX ? minX : resultingX
resultingX = resultingX > maxX ? maxX : resultingX
meterView.center = CGPoint(x: resultingX,
y: meterView.center.y)
updateHeight(at: meterView.center.x/(maxX-minX))
}
recognizer.setTranslation(CGPoint.zero, in: self.view)
}
func updateHeight(at percentage: CGFloat) {
let percentage = Float(percentage)
heightLabel.text = String((maxHeight - minHeight)*percentage)
}
但是,由于约束,我想如果在平底锅的任何一点(在它的中间或在它的末端)更改标签,则条形图会跳回到水平中心。
如果在平移过程中消除了水平(或所有)约束,则当我进行轻微平移时,该条会完全跳出屏幕。
是否可以避免控制器将条形图更新回其约束定义的位置?
谢谢!
答案 0 :(得分:1)
删除使条形居中的约束,然后将其更改为与meterView
(假设meterView
是条形)与其超视角宽度有关的左约束:
meterView.left equal to Superview.left + constant
现在创建对名为meterViewLeftConstraint
的约束的引用,并在handlePan
中将约束的constant
属性更新为resultingX
:
meterViewLeftConstraint.constant = resultingX
您现在无需设置center
。
我还建议您使用SnapKit进行约束,因为NSLayoutConstraint
API非常混乱。