2016-02-17 94 views
1

我今天發佈,因爲我想實現類似的結果,Xcode 7的進度指示器位於工具欄內。可可:工具欄內部的進度條文本字段

enter image description here

中的藍條顯示這似乎是一個NSTextField下,我認爲這將是一個股票UI元素,但我找不到對象庫中類似的東西。

如何才能達到類似的結果,最好使用本地NSProgressIndicator

在此先感謝。

編輯:在這個老問題中,我設法得到了類似的答案:NSTextField like safari address bar但在調整窗口大小以強制重新繪製文本字段之前,背景變爲白色(而不是淺灰色漸變)。我應該在self.needsDisplay的哪個位置進行初始化以刷新文本字段?把它放在awakeFromNib的末尾不會。 其實這個工程出色後,我在didSet s增加了幾個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) 
     } 
    } 

} 

回答

0

我自己設法做到了,請參閱問題中的代碼。

在初始化文本字段後,不要忘記將viewController屬性設置爲您的按鈕目標(這是我的情況下的視圖控制器)。

1

我沒有這個做我自己,但我的猜測是,這是繪製的白盒工具欄裏面的自定義NSView。在該視圖內有文本字段,小錯誤圖像和自定義設計的進度指示器。

當然,您可以使用庫存NSProgressIndicator,但要準確獲得Xcode的設計,您必須對其進行子類化。

+0

我編輯我的問題,包括一個嘗試的答案。我能夠對'NSTextField'進行子類化並獲得類似的結果,但是在重新繪製視圖之前,我正面臨着一個新問題,即背景完全變白。 – beeb