Избегайте ограничений вида, мешающих смене кадра - PullRequest
0 голосов
/ 21 января 2019

Я работаю над ползунком, который при перемещении обновляет значение определенной метки.Линейка в ползунке имеет вертикальное ограничение, чтобы держать его только над другим элементом, и еще один, чтобы центрировать его по горизонтали.

Если я не обновляю метку, изменяя позицию бара с помощью 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)
}

Однако, если я изменю метку в любой точке этого панорамы (во время или в конце), полоса переместится обратно в горизонтальный центр, я думаю, из-заограничение.

Если я устраняю горизонтальное (или все) ограничение (я) во время панорамирования, то полоса полностью выпрыгивает из экрана, как я делаю небольшое панорамирование.

Есть лиспособ не дать контроллеру обновить вид бара обратно в его заданное ограничением положение?

enter image description here

Спасибо!

1 Ответ

0 голосов
/ 21 января 2019

Удалите ограничение, которое центрирует полосу, и измените его на левое ограничение, относящееся к meterView (я предполагаю, meterView это полоса) к его ширине суперпредставления:

meterView.left equal to Superview.left + constant

Теперь создайте ссылку на это ограничение с именем meterViewLeftConstraint, а в handlePan измените свойство constant ограничения на resultingX:

meterViewLeftConstraint.constant = resultingX

И вам не нужно устанавливать center сейчас.

Я также рекомендую использовать SnapKit для создания ограничений, поскольку API NSLayoutConstraint довольно грязный.

...