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 属性 设置为您的按钮目标(在我的例子中是视图控制器)。