NSLevelIndicatorその中に文字列値を表示できるカスタムを作成しました。以下はそのコードです。これをストーリーボード OSX アプリでテストしたところ、うまく機能しました。
import Cocoa
class CustomLevelIndicator: NSLevelIndicator {
var text: String!
private var textField: NSTextField!
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
}
override func awakeFromNib() {
textField = NSTextField()
textField.stringValue = text
textField.bezeled = false
textField.drawsBackground = false
textField.editable = false
textField.selectable = false
textField.textColor = NSColor.blackColor()
textField.font = NSFont.systemFontOfSize(12)
textField.translatesAutoresizingMaskIntoConstraints = false
addSubview(textField, positioned: .Above, relativeTo: nil)
let xCenterConstraint = NSLayoutConstraint(item: textField, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0)
let yCenterConstraint = NSLayoutConstraint(item: textField, attribute: .CenterY, relatedBy: .Equal, toItem: self, attribute: .CenterY, multiplier: 1, constant: 0)
addConstraints([xCenterConstraint, yCenterConstraint])
}
}
今、メニュー バー アプリで同じコントロールを使用しようとしています。これがそのビューのレイアウトです。
メニュー オブジェクトのコード。
class ProgressMenuController: NSObject {
@IBOutlet weak var menu: NSMenu!
@IBOutlet weak var progressView: ProgressView!
let menuItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength)
var progressMenuItem: NSMenuItem!
override func awakeFromNib() {
menuItem.menu = menu
menuItem.image = NSImage(named: "icon")
progressMenuItem = menu.itemWithTitle("Progress")
progressMenuItem.view = progressView
progressView.update(42)
}
@IBAction func quitClicked(sender: NSMenuItem) {
NSApplication.sharedApplication().terminate(self)
}
}
レベル インジケーターを持つビューのコード。
import Cocoa
class ProgressView: NSView {
@IBOutlet weak var progressIndicator: CustomLevelIndicator!
func update(value: Double) {
dispatch_async(dispatch_get_main_queue()) {
self.progressIndicator.doubleValue = value
self.progressIndicator.text = "\(value)%"
}
}
}
問題は、カスタム レベル インジケーターのテキストが表示されないことです。レベルインジケーターには、ある種の暗いオーバーレイがあります。
なぜこれが起こっているのかわかりません。私の実際のアプリでは、このインジケーターの値は、バックグラウンド スレッドで実行されるネットワーク リクエストを介して定期的に更新されます。そのため、特に関数内のメイン スレッドで UI を更新しupdate()ます。クロージャー内のコードを取り出して、テストするためだけに外に出しましたが、それでも機能しません。問題はtextプロパティの値を割り当てることでありdoubleValue、レベル インジケーターの値は適切に更新されますが、テキストは更新されないことがわかります。私は今ちょっと困惑しています。
どんな助けでも大歓迎です。ここにもデモプロジェクトをアップロードしました。


