Как я могу предотвратить скрытие одного UIView другим UIView? - PullRequest
0 голосов
/ 28 января 2019

Я создаю пользовательский сегментированный контроллер многократного использования, используя UIViews, и у меня проблема с перекрывающимися представлениями.В настоящее время это выглядит так:

enter image description here

Вы можете видеть, что синий селектор - под кнопками, но я хочу, чтобы он сидел на внизу и высотой четыре пикселя.Для этого у меня есть:

let numberOfButtons = CGFloat(buttonTitles.count)
let selectorWidth = frame.width / numberOfButtons
let selectorYPosition = frame.height - 3 <--- This cause it to be hidden behind the button
selector = UIView(frame: CGRect(x: 0, y: selectorYPosition, width: selectorWidth, height: 4))
selector.layer.cornerRadius = 0
selector.backgroundColor = selectorColor
addSubview(selector)
bringSubviewToFront(selector) <--- I thought this would work but it does nothing

, что приводит к тому, что селектор UIView скрывается за сегментом UIView (у меня позиция Y установлена ​​на - 3, чтобы вы могли видеть, как он покрываетсяЯ действительно хочу, чтобы это было - 4, но это заставляет это исчезнуть полностью):

enter image description here

Я думал, что использование bringSubviewToFront() принесет это впередняя часть сегмента UIView, но, похоже, ничего не делает.Я просмотрел Руководство по программированию Apple View и множество SO-тем, но не могу найти ответ.

Может кто-нибудь помочь мне увидеть, что мне не хватает?

Полный код:

class CustomSegmentedControl: UIControl {
  var buttons = [UIButton]()
  var selector: UIView!
  var selectedButtonIndex = 0

  var borderWidth: CGFloat = 0 {
    didSet {
      layer.borderWidth = borderWidth
    }
  }

  var borderColor: UIColor = UIColor.black {
    didSet {
      layer.borderColor = borderColor.cgColor
    }
  }

  var separatorBorderColor: UIColor = UIColor.lightGray {
    didSet {

    }
  }

  var commaSeparatedTitles: String = "" {
    didSet {
      updateView()
    }
  }

  var textColor: UIColor = .lightGray {
    didSet {
      updateView()
    }
  }

  var selectorColor: UIColor = .blue {
    didSet {
      updateView()
    }
  }

  var selectorTextColor: UIColor = .black {
    didSet {
      updateView()
    }
  }

  func updateView() {
    buttons.removeAll()
    subviews.forEach { $0.removeFromSuperview() }

    // create buttons
    let buttonTitles = commaSeparatedTitles.components(separatedBy: ",")
    for buttonTitle in buttonTitles {
      let button = UIButton(type: .system)
      button.setTitle(buttonTitle, for: .normal)
      button.setTitleColor(textColor, for: .normal)
      button.backgroundColor = UIColor.white
      button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
      buttons.append(button)
    }

    // make first button selected
    buttons[0].setTitleColor(selectorTextColor, for: .normal)

    let numberOfButtons = CGFloat(buttonTitles.count)
    let selectorWidth = frame.width / numberOfButtons
    let selectorYPosition = frame.height - 3
    selector = UIView(frame: CGRect(x: 0, y: selectorYPosition, width: selectorWidth, height: 4))
    selector.layer.cornerRadius = 0
    selector.backgroundColor = selectorColor
    addSubview(selector)
    bringSubviewToFront(selector)

    let stackView = UIStackView(arrangedSubviews: buttons)
    stackView.axis = .horizontal
    stackView.alignment = .fill
    stackView.distribution = .fillEqually
    addSubview(stackView)

    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    stackView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
    stackView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
  }

  @objc func buttonTapped(button: UIButton) {
    for (buttonIndex, btn) in buttons.enumerated() {
      btn.setTitleColor(textColor, for: .normal)

      if btn == button {
        let numberOfButtons = CGFloat(buttons.count)
        let selectorStartPosition = frame.width / numberOfButtons * CGFloat(buttonIndex)
        UIView.animate(withDuration: 0.3, animations: { self.selector.frame.origin.x = selectorStartPosition })
        btn.setTitleColor(selectorTextColor, for: .normal)
      }
    }

    sendActions(for: .valueChanged)

  }

}

1 Ответ

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

Вы закрываете selector с помощью stackView.

Вам необходимо выполнить:

bringSubviewToFront(selector)

после добавления всех представлений.Переместите эту строку в конец updateView().

...