Сегмент управления с полосой под выбранным элементом - PullRequest
0 голосов
/ 10 октября 2019

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

Я пробовал использовать как авторазметку, так и фреймы

@IBOutlet weak var segmentControl: UISegmentedControl!
fileprivate var buttonBar = UIView()

//viewDidLoad
buttonBar = UIView()
self.view.insertSubview(buttonBar, aboveSubview: segmentControl)
// This needs to be false since we are using auto layout constraints
buttonBar.translatesAutoresizingMaskIntoConstraints = false
buttonBar.backgroundColor = UIColor.white
buttonBar.topAnchor.constraint(equalTo: segmentControl.bottomAnchor).isActive = true
buttonBar.heightAnchor.constraint(equalToConstant: 2).isActive = true
// Constrain the button bar to the left side of the segmented control
buttonBar.leftAnchor.constraint(equalTo: segmentControl.leftAnchor).isActive = true
// Constrain the button bar to the width of the segmented control divided by the number of segments
buttonBar.widthAnchor.constraint(equalTo: segmentControl.widthAnchor, multiplier: 1 / CGFloat(segmentControl.numberOfSegments)).isActive = true


@objc func segmentedControlValueChanged(_ sender: UISegmentedControl) {
  showSearchResults()
  DispatchQueue.main.async {
    UIView.animate(withDuration: 0.3) {
      let segmentSize = (self.segmentControl.frame.width / CGFloat(self.segmentControl.numberOfSegments))
      let segmentOrigin = self.segmentControl.frame.origin.x
      let index = CGFloat(self.segmentControl.selectedSegmentIndex)
      self.buttonBar.frame.origin.x = segmentOrigin + (segmentSize * index)
    }
  }
}

...