試圖創建一個自定義NSSlider. 覆寫更改旋鈕外觀的drawKnob()方法,NSSliderCell但這樣做會以某種方式斷開旋鈕位置與用戶與滑塊的互動之間的聯系。
在經常參考的目標 C 示例(https://github.com/lucasderraugh/LADSlider)中,看起來當您覆寫時,drawKnob()您需要顯式處理該startTracking方法,但我還沒有找到適合我的解決方案- 目前我只是將單元格的 startTracking 'at' 屬性設定為滑塊的當前值,但不確定正確的方法是什么。
相當多的例子包括單元格的自定義初始化程式中的 NSCoder 引數 - 我不明白為什么,但這可能與確保旋鈕顯示和實際滑塊值之間的連接有關?
import Cocoa
class ViewController: NSViewController {
var seekSlider = NSSlider()
var seekSliderCell = SeekSliderCell()
override func viewDidLoad() {
super.viewDidLoad()
seekSlider = NSSlider(target: self, action: #selector(self.seek(_:)))
seekSlider.cell = seekSliderCell
seekSlider.cell?.target = self
seekSlider.cell?.action = #selector(self.seek(_:))
seekSlider.isEnabled = true
seekSlider.isContinuous = true
view.addSubview(seekSlider)
}
@objc func seek(_ sender: NSObject) {
let val = seekSlider.cell?.floatValue
let point = NSPoint(x: Double(val!), y: 0.0)
seekSlider.cell?.startTracking(at: point, in: self.seekSlider)
}
}
class SeekSliderCell: NSSliderCell {
// required init(coder aDecoder: NSCoder) {
// super.init(coder: aDecoder)
// }
override func drawKnob() {
let frame = NSRect(x: 0.0, y: 6.0, width: 20.0, height: 10.0)
let c = NSColor(red: 0.9, green: 0.0, blue: 0.6, alpha: 1.0)
c.setFill()
NSBezierPath.init(roundedRect: frame, xRadius: 3, yRadius: 3).fill()
}
override func startTracking(at startPoint: NSPoint, in controlView: NSView) -> Bool {
return true
}
}
uj5u.com熱心網友回復:
國家的檔案drawKnob():
特殊注意事項 如果您創建 NSSliderCell 的子類,請不要覆寫此方法。改為覆寫 drawKnob(_:)。
代替
func drawKnob()
覆寫
func drawKnob(_ knobRect: NSRect)
例子:
class ViewController: NSViewController {
var seekSlider = NSSlider()
var seekSliderCell = SeekSliderCell()
override func viewDidLoad() {
super.viewDidLoad()
seekSlider = NSSlider(target: self, action: #selector(self.seek(_:)))
seekSlider.cell = seekSliderCell
seekSlider.cell?.target = self
seekSlider.cell?.action = #selector(self.seek(_:))
seekSlider.isEnabled = true
seekSlider.isContinuous = true
view.addSubview(seekSlider)
}
@objc func seek(_ sender: NSObject) {
let val = seekSlider.cell?.floatValue
print("\(String(describing: val))")
}
}
class SeekSliderCell: NSSliderCell {
override func drawKnob(_ knobRect: NSRect) {
var frame = NSRect(x: 0.0, y: 6.0, width: 20.0, height: 10.0)
frame.origin.x = knobRect.origin.x (knobRect.size.width - frame.size.width) / 2
frame.origin.y = knobRect.origin.y (knobRect.size.height - frame.size.height) / 2
let c = NSColor(red: 0.9, green: 0.0, blue: 0.6, alpha: 1.0)
c.setFill()
NSBezierPath.init(roundedRect: frame, xRadius: 3, yRadius: 3).fill()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437386.html
上一篇:為什么UIPageViewController上的setViewControllers不起作用?
下一篇:在SWIFT中發送本地通知
