Cocoa:工具栏文本字段中的进度条

时间:2016-02-17 20:50:11

标签: swift macos cocoa progress-bar toolbar

我今天发帖是因为我希望在工具栏内找到与Xcode 7的进度指示器类似的结果。

enter image description here

在看似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)
        }
    }

}

2 个答案:

答案 0 :(得分:1)

我自己没有这样做,但我的猜测是这是工具栏内的自定义NSView,用于绘制白框。在该视图中,有文本字段,小错误图像和自定义设计的进度指示器。

当然你可以使用股票NSProgressIndicator,但要完全获得Xcode的设计,你必须将其子类化。

答案 1 :(得分:1)

我实际上自己设法做到了,请查看问题中的代码。

在初始化文本字段后,不要忘记将viewController属性设置为按钮目标(在我的情况下是视图控制器)。