Проблема в том, что вы устанавливаете ограничения для underlineBar , которые обновляют свойства X, Y и width, height, поэтому при попытке анимировать изменение положения вид не перемещается, потому что ограничения имеют более высокий приоритет. В заключение вам нужно будет анимировать ограничения.
Я создал глобальный leftAnchor , который вы будете изменять при каждом нажатии сегмента.
var underlineBarLeftAnchor: NSLayoutConstraint!
Там, где вы устанавливаете свои ограничения, обновите функцию следующим образом:
underlineBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
underlineBar.heightAnchor.constraint(equalToConstant: 3).isActive = true
underlineBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true
underlineBarLeftAnchor = underlineBar.leftAnchor.constraint(equalTo: segmentedControl.leftAnchor, constant: 0)
underlineBarLeftAnchor.isActive = true
Теперь вам нужно зарегистрировать методы целевого действия для сегментированного элемента управления, используя константу valueChanged , как показано ниже, обновить viewDidLoad () :
override func viewDidLoad() {
super.viewDidLoad()
setSegmentedControlStyle()
segmentedControl.addTarget(self, action: #selector(updateSegmentedControl), for: .valueChanged)
}
Последний шаг, создайте функцию updateSegmentedControl () , в которой вы будете анимировать движение:
Эта функция вызывается каждый раз, когда изменяется значение сегмента управления
@objc func updateSegmentedControl() {
let padding = underlineBar.frame.width * CGFloat(self.segmentedControl.selectedSegmentIndex)
underlineBarLeftAnchor.constant = padding
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
Вам нужно вычислить, сколько левого отступа вам нужно, а затем обновить пользовательский интерфейс, layoutIfNeeded () , анимируя изменения.