0
I am developing a Mac Catalyst app using UIKit. I have set the "Mac Catalyst Interface" of the target to "Optimize for Mac". All UISliders in my app update their UI "one interaction late": When I click on the slider track, the value of the slider changes accordingly, but the knob does not move to the appropriate position. Only when I click the second time, the knob moves to that position. But when I click on a different position on the track instead, the knob will move to the location corresponding to the previous click. What I tried:
- Changing "isContinuous", it has no effect.
- Listen for the "valueChanged" event and in the handler call "setNeedsLayout()" on the slider.
- Listen for the "valueChanged" event and in the handler call "setNeedsDisplay()" on the slider.
When I change the target's "Mac Catalyst Interface" to "Scaled to match iPad", UISlider behaves as expected. But I need it to be "Optimize for Mac".
FWIW, here is my code to add a UISlider in a UIViewController, it is super basic stuff:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let slider = UISlider()
view.addSubview(slider)
slider.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
slider.heightAnchor.constraint(equalToConstant: 50),
slider.widthAnchor.constraint(equalToConstant: 300),
slider.centerXAnchor.constraint(equalTo: view.centerXAnchor),
slider.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
slider.addTarget(self, action: #selector(onSlider(_:)), for: .valueChanged)
}
@objc func onSlider(_ slider: UISlider) {
// slider.setNeedsLayout()
// slider.setNeedsDisplay()
print("on slider: \(slider.value)")
}
}