Ios 避免视图约束干扰帧更改

Ios 避免视图约束干扰帧更改,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,我正在使用一个滑块,它在移动时会更新特定标签的值。滑块中的条有一个垂直约束,使其正好位于另一个图元的顶部,另一个约束使其水平居中 如果我不更新标签,使用pangestrerecognizer更改条的位置将非常有效: @IBAction func handlePan(recognizer: UIPanGestureRecognizer) { let translation = recognizer.translation(in: self.view) if let meterVie

我正在使用一个滑块,它在移动时会更新特定标签的值。滑块中的条有一个垂直约束,使其正好位于另一个图元的顶部,另一个约束使其水平居中

如果我不更新标签,使用
pangestrerecognizer
更改条的位置将非常有效:

@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)
}
@iAction func handlePan(识别器:UIPangestureRecognitizer){
let translation=recognizer.translation(在:self.view中)
如果让meterView=recognizer.view{
设minX=view.bounds.minX+meterView.bounds.width/2
设maxX=view.bounds.maxX-meterView.bounds.width/2
var resultingX=meterView.center.x+translation.x
结果x=resultingXmaxX?maxX:resultingX
meterView.center=CGPoint(x:resultingX,
y:meterView.center.y)
更新高度(位于:meterView.center.x/(maxX minX))
}
识别器.setTranslation(CGPoint.zero,in:self.view)
}
func updateHeight(百分比:CGFloat){
让百分比=浮动(百分比)
heightLabel.text=字符串((最大高度-最小高度)*百分比)
}
但是,如果我在平移的任何一点(在平移过程中或在平移结束时)更改标签,我想,由于约束,该条会跳回水平中心

如果我在平移过程中消除水平(或全部)约束,则该条将完全跳出屏幕,就像我轻微平移一样

是否有办法避免控制器将条形图更新回其约束定义的位置


谢谢

删除使条形图居中的约束,并将其更改为与其superview宽度相关的左侧约束(我假设
meterView
是条形图):

meterView.left equal to Superview.left + constant
现在,创建一个对该约束的引用,名为
meterViewLeftConstraint
,并在
handlePan
中,将约束的
常量
属性更新为
resultingX

meterViewLeftConstraint.constant = resultingX
现在不需要设置
中心


我还建议您使用来生成约束,因为
NSLayoutConstraint
API非常混乱。

您不能更新约束的乘数,它是一个只读属性。@pckill我没有意识到这一点。已编辑。如果使用约束设置布局,则不要弄乱视图的框架,而是更改约束。我建议修改您的平移逻辑,以便使用自动布局更新条位置。