Я пытаюсь создать пользовательский UISegmentedControl
с полосой внизу под выбранным параметром. Я добавил CALayer
в качестве бара. После изменения выбранной опции полоса не перемещается в ожидаемое положение.
Код для пользовательского UISegmentedControl
выглядит следующим образом:
class ProfileSegmentedControl: UISegmentedControl {
private lazy var bottomBar = getBottomBar()
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
}
private extension ProfileSegmentedControl {
func setup() {
tintColor = .clear
let normalAttributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.white,
.font: UIFont.systemFont(ofSize: 16, weight: .medium)
]
setTitleTextAttributes(normalAttributes, for: .normal)
setTitleTextAttributes([.foregroundColor: UIColor(named: "black") as Any], for: .selected)
}
}
private extension ProfileSegmentedControl {
func getBottomBar() -> CALayer {
let bar = CALayer()
bar.backgroundColor = UIColor(named: "black")?.cgColor
layer.addSublayer(bar)
return bar
}
func setBarFrame() {
let barWidth = bounds.width / CGFloat(numberOfSegments)
let barHeight: CGFloat = 2
let x = barWidth * CGFloat(selectedSegmentIndex)
let y = bounds.height - barHeight
bottomBar.frame = CGRect(x: x, y: y, width: barWidth, height: barHeight)
}
}
extension ProfileSegmentedControl {
override func layoutIfNeeded() {
super.layoutIfNeeded()
setBarFrame()
}
}
Требуется 2 нажатия на опцию, чтобы переместить нижнюю панель в ожидаемое положение.
Кто-нибудь может указать, почему это происходит? Кто-нибудь может указать, как это исправить?
Правка - когда представление загружается в первый раз и нажимается «Сегмент 0», полоса отображается в правильном положении, как показано ниже -
При однократном нажатии на «Сегмент 1» полоса не перемещается, как показано ниже -
При повторном нажатии на «Сегмент 1» полоса перемещается в правильное положение, как показано ниже: