2016-02-09 66 views
7

我的目標是製作一個類似於Goole Docs文本編輯器的視圖,其中註釋突出顯示評論後面的文本。 HighlightNSView和NSScrollView中的NSTextView

我的解決辦法是將具有含NSView(設定爲文檔視圖)的NSScrollView該卷軸和既包含文本和其他NSView s表示將成爲亮點的NSTextView

要使用此功能,NSTextView的尺寸必須與其直接屬於NSScrollView一樣。但是,我不能讓NSTextView有這種行爲。

我對佈局的代碼是:

LatinViewController:的loadView()

... 
let latinView = LatinView() 
latinView.autoresizingMask = [.ViewWidthSizable] 
latinView.wantsLayer = true 
latinView.layer?.backgroundColor = Theme.greenColor().CGColor 
self.latinView = latinView 
scrollView.documentView = latinView 
... 

拉丁語查看:的init()

... 
let textView = LatinTextView() 
textView.translatesAutoresizingMaskIntoConstraints = false 
textView.string = "Long string..." 
self.addSubview(textView) 
self.textView = textView 

self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[text]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["text": textView])) 
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[text]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["text": textView])) 
... 

LatinTextView:的init()

... 
self.minSize = NSMakeSize(0, 0) 
self.maxSize = NSMakeSize(0, CGFloat(FLT_MAX)) 
self.verticallyResizable = true 
self.horizontallyResizable = false 
self.textContainer?.heightTracksTextView = false 
... 

可以這樣做?

回答

1

從您的要求看來,您可以簡單地通過使用NSAttributedString和NSTextView來實現功能。以下是示例代碼 一個NSTextView已經自帶了豐富的文本編輯功能和格式存儲可通過NSAttributedString

import Cocoa 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 
    @IBOutlet var textView:NSTextView! 


    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     let singleAttribute1 = [ NSForegroundColorAttributeName: NSColor.purpleColor() , NSBackgroundColorAttributeName: NSColor.yellowColor() ] 

     let multipleAttributes = [ 
      NSForegroundColorAttributeName: NSColor.redColor(), 
      NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue ] 

     var string1 = NSAttributedString(string: "Hello World", attributes: singleAttribute1) 

     var string2 = NSAttributedString(string: " This is knowstack", attributes: multipleAttributes) 

     var finalString = NSMutableAttributedString(attributedString: string1) 
     finalString.appendAttributedString(string2) 

     self.textView.textStorage?.setAttributedString(finalString) 

    } 

    func applicationWillTerminate(aNotification: NSNotification) { 
     // Insert code here to tear down your application 
    } 


    @IBAction func getAttributedString(sender:AnyObject){ 
     var attributedString = self.textView.attributedString() 
     print(attributedString) 
    } 
} 
(一般所使用的 NSTextView,並 NSAttributedString

enter image description here

1

NSLayoutManager實現具有這是一個專門用於在屏幕上顯示文本之前更改文本而不更改源代碼的特殊功能:臨時屬性。

查找NSLayoutManager文檔爲擁有「TemporaryAttribute」在他們的名字的方法:

- (void)addTemporaryAttribute:(NSString *)attrName value:(id)value forCharacterRange:(NSRange)charRange 

他們應該拼寫檢查過程中使用,例如作爲詞的綠/紅色下劃線,或簡單地突出的部分的文字暫時。它們允許您修改僅用於顯示目的的文本部分的外觀,而無需修改原始屬性文本源。

+0

這看起來像一個很好的解決方案。我想到的另一個解決方案是在NSTextView的主NSTextLayer層下添加CALayer實例來顯示突出顯示,但這個解決方案看起來更好。你怎麼看? – jamespick

相關問題