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)") } }