我今天发帖是因为我希望在工具栏内找到与Xcode 7的进度指示器类似的结果。
在看似NSTextField
的下方显示一个蓝色条,我认为这将是一个库存UI元素,但我在对象库中找不到类似的东西。
如何获得类似的结果,最好使用原生的NSProgressIndicator
?
提前致谢。
编辑:我通过使用这个旧问题中的答案设法得到了类似的东西:NSTextField like safari address bar。 但在调整窗口大小以强制重新绘制文本字段之前,背景变为白色(而不是浅灰色渐变)。在初始化文本字段后,我应该将
实际上,我在self.needsDisplay
放在哪里以刷新文本字段?将它放在awakeFromNib
的末尾并不能做到。needsDisplay
中添加了一些didSet
之后,这种方式非常出色,所以我猜它已经解决了!如果您想将其作为按钮的目标,请不要忘记在某些时候设置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)
}
}
}
答案 0 :(得分:1)
我自己没有这样做,但我的猜测是这是工具栏内的自定义NSView
,用于绘制白框。在该视图中,有文本字段,小错误图像和自定义设计的进度指示器。
当然你可以使用股票NSProgressIndicator
,但要完全获得Xcode的设计,你必须将其子类化。
答案 1 :(得分:1)
我实际上自己设法做到了,请查看问题中的代码。
在初始化文本字段后,不要忘记将viewController
属性设置为按钮目标(在我的情况下是视图控制器)。