Cocoa:工具栏文本字段内的进度条
Cocoa: Progress Bar Inside Toolbar Text Field
我今天发帖是因为我想获得与 Xcode 7 位于工具栏内的进度指示器类似的结果。
蓝色条显示在似乎是 NSTextField
的下方,我认为这将是常用 UI 元素,但我在对象库中找不到类似的东西。
如何才能达到类似的结果,最好使用原生 NSProgressIndicator
?
提前致谢。
编辑:我通过使用这个老问题中的答案设法得到了类似的东西:NSTextField like safari address bar。 但是在我调整 window 的大小以强制重新绘制文本字段之前,背景变成了白色(而不是浅灰色渐变)。我应该把 self.needsDisplay
放在哪里以便在初始化后刷新文本字段?把它放在 awakeFromNib
的末尾是行不通的。
实际上,在我在 didSet
中添加了一些 needsDisplay
之后,这非常有效,所以我想它已经解决了!如果您想将其作为按钮的目标,请不要忘记在某个时候设置 viewController
属性。
import Cocoa
class ToolbarTextField: NSTextField {
var button = NSButton()
var inProgress: Bool = false {
didSet {
self.needsDisplay = true
self.button.hidden = !self.inProgress
self.button.needsDisplay = true
self.button.enabled = true
}
}
var progress: CGFloat = 0.0 {
didSet {
self.needsDisplay = true
self.button.needsDisplay = true
}
}
var viewController: NSViewController? = nil {
didSet {
self.button.target = self.viewController
self.button.action = "cancelLoadingButtonClicked:"
}
}
override func awakeFromNib() {
let buttonFrame = NSMakeRect(0.0, 0.0, 16.0, 16.0)
self.button = NSButton(frame: buttonFrame)
self.button.setButtonType(NSButtonType.MomentaryChangeButton)
self.button.bezelStyle = NSBezelStyle.RegularSquareBezelStyle
self.button.bordered = false
self.button.imagePosition = NSCellImagePosition.ImageOnly
self.button.image = NSImage(named: NSImageNameStopProgressFreestandingTemplate)
self.button.hidden = !self.inProgress
self.addSubview(self.button)
}
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
if self.inProgress {
let buttonFrame = NSMakeRect(self.bounds.size.width - 22, ceil((self.bounds.size.height / 2) - 9), 16.0, 16.0)
self.button.frame = buttonFrame
var progressRect = self.bounds
progressRect.origin.y = progressRect.size.height - 4
progressRect.size.height = 2
progressRect.size.width *= self.progress
NSColor.alternateSelectedControlColor().set()
NSRectFillUsingOperation(progressRect, NSCompositingOperation.CompositeSourceIn)
}
}
}
我自己没有这样做,但我的猜测是这是工具栏内绘制白框的自定义 NSView
。在该视图中有文本字段、小错误图像和自定义设计的进度指示器。
当然你可以使用stockNSProgressIndicator
,但是要得到Xcode的设计,你必须继承它。
其实我是自己搞定的,请看问题中的代码
不要忘记在初始化文本字段后将 viewController
属性 设置为您的按钮目标(在我的例子中是视图控制器)。
我今天发帖是因为我想获得与 Xcode 7 位于工具栏内的进度指示器类似的结果。
蓝色条显示在似乎是 NSTextField
的下方,我认为这将是常用 UI 元素,但我在对象库中找不到类似的东西。
如何才能达到类似的结果,最好使用原生 NSProgressIndicator
?
提前致谢。
编辑:我通过使用这个老问题中的答案设法得到了类似的东西:NSTextField like safari address bar。 但是在我调整 window 的大小以强制重新绘制文本字段之前,背景变成了白色(而不是浅灰色渐变)。我应该把
实际上,在我在 self.needsDisplay
放在哪里以便在初始化后刷新文本字段?把它放在 awakeFromNib
的末尾是行不通的。didSet
中添加了一些 needsDisplay
之后,这非常有效,所以我想它已经解决了!如果您想将其作为按钮的目标,请不要忘记在某个时候设置 viewController
属性。
import Cocoa
class ToolbarTextField: NSTextField {
var button = NSButton()
var inProgress: Bool = false {
didSet {
self.needsDisplay = true
self.button.hidden = !self.inProgress
self.button.needsDisplay = true
self.button.enabled = true
}
}
var progress: CGFloat = 0.0 {
didSet {
self.needsDisplay = true
self.button.needsDisplay = true
}
}
var viewController: NSViewController? = nil {
didSet {
self.button.target = self.viewController
self.button.action = "cancelLoadingButtonClicked:"
}
}
override func awakeFromNib() {
let buttonFrame = NSMakeRect(0.0, 0.0, 16.0, 16.0)
self.button = NSButton(frame: buttonFrame)
self.button.setButtonType(NSButtonType.MomentaryChangeButton)
self.button.bezelStyle = NSBezelStyle.RegularSquareBezelStyle
self.button.bordered = false
self.button.imagePosition = NSCellImagePosition.ImageOnly
self.button.image = NSImage(named: NSImageNameStopProgressFreestandingTemplate)
self.button.hidden = !self.inProgress
self.addSubview(self.button)
}
override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
if self.inProgress {
let buttonFrame = NSMakeRect(self.bounds.size.width - 22, ceil((self.bounds.size.height / 2) - 9), 16.0, 16.0)
self.button.frame = buttonFrame
var progressRect = self.bounds
progressRect.origin.y = progressRect.size.height - 4
progressRect.size.height = 2
progressRect.size.width *= self.progress
NSColor.alternateSelectedControlColor().set()
NSRectFillUsingOperation(progressRect, NSCompositingOperation.CompositeSourceIn)
}
}
}
我自己没有这样做,但我的猜测是这是工具栏内绘制白框的自定义 NSView
。在该视图中有文本字段、小错误图像和自定义设计的进度指示器。
当然你可以使用stockNSProgressIndicator
,但是要得到Xcode的设计,你必须继承它。
其实我是自己搞定的,请看问题中的代码
不要忘记在初始化文本字段后将 viewController
属性 设置为您的按钮目标(在我的例子中是视图控制器)。