macOS滑块NSSlider
macOS滑块NSSlider

macOS滑块NSSlider

NSSlider 是 macOS AppKit 框架中的滑块控件,用于让用户通过拖动条来选择一个数值范围内的值,类似于音量、亮度、进度控制等。

基本定义

class NSSlider: NSControl

它是 NSControl 的子类,继承了 target/action、数值绑定、启用状态等功能。

通常用于选择连续值(如从 0 到 100)。

初始化方法

1、简单写法:

let slider = NSSlider(value: 50, minValue: 0, maxValue: 100, target: self, action: #selector(sliderChanged(_:)))

2、完整写法:

let slider = NSSlider()
slider.doubleValue = 50
slider.minValue =  0
slider.maxValue = 100
slider.target = context.coordinator as AnyObject
slider.action = #selector(SomeButton.sliderChanged)

基本示例

1、创建Slider控件

let slider = NSSlider(value: 50, minValue: 0, maxValue: 100, target: self, action: #selector(sliderChanged(_:)))
slider.frame = NSRect(x: 20, y: 20, width: 200, height: 20)

2、设置和读取值

slider.doubleValue = 30.5         // 设置当前值
let currentValue = slider.doubleValue  // 获取当前值

3、设置刻度线

slider.numberOfTickMarks = 5
slider.allowsTickMarkValuesOnly = true

让用户只能在 5 个刻度点之间跳跃。

4、添加响应事件

@objc func sliderChanged(_ sender: NSSlider) {
    print("当前值:\(sender.doubleValue)")
}

常用属性

1、minValue:最小值。

2、maxValue:最大值。

3、doubleValue:当前值(双精度)。

4、intValue:当前值(整数)。

5、numberOfTickMarks:设置刻度线数量(如 5)。

6、allowsTickMarkValuesOnly:是否只允许停在刻度线位置。

7、isContinuous:拖动时是否连续触发 action(默认 true)。

使用示例

在SwiftUI中显示NSSlider:

struct ContentView: View {
    @State private var value: Double = 0
    var body: some View {
        VStack {
            Text("Value:\(value)")
            NSSomeView(value: $value)
                .frame(width: 100,height:35)
        }
        .frame(width: 400,height:300)
    }
}

struct NSSomeView: NSViewRepresentable {
    
    @Binding var value: Double
    
    func makeCoordinator() -> Coordinator {
        Coordinator(value: $value)
    }
    
    func makeNSView(context: Context) -> NSSlider {
        let slider = NSSlider(value: value, minValue: 0, maxValue: 100,
                              target: context.coordinator,
                              action: #selector(Coordinator.sliderChanged(_:)))
        return slider
    }
    
    func updateNSView(_ nsView: NSSlider, context: Context) {
        if nsView.doubleValue != value {
            nsView.doubleValue = value
        }
    }
    
    class Coordinator {
        var value: Binding<Double>
        
        init(value: Binding<Double>) {
            self.value = value
        }
        
        @objc func sliderChanged(_ slider: NSSlider) {
            value.wrappedValue = slider.doubleValue
        }
    }
}

总结

NSSlicer可以初始化创建滑块,通过doubleValue获取当前值以及设置刻度。

相关文章

macOS控件父类NSControl:https://fangjunyu.com/2025/07/02/macos%e6%8e%a7%e4%bb%b6%e7%88%b6%e7%b1%bbnscontrol/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注