2016-02-09 18 views
7

Moim celem jest stworzenie widoku podobnego do edytora tekstu Goole Docs z podświetlaniem komentarzy za tekstem, w którym znajdują się komentarze. HighlightNSTextView wewnątrz NSView i NSScrollView

Moje rozwiązanie ma mieć NSScrollView zawierający NSView (ustawiony jako widoku dokumentu), który przewija i zawiera zarówno NSTextView tekstu i innych NSView s to będzie pasemka.

Aby to zadziałało, NSTextView musi mieć rozmiar tak, jakby należał bezpośrednio do NSScrollView. Jednak nie mogę sprawić, aby to zachowanie miało wartość NSTextView.

kod mam dla układu to:

LatinViewController: loadview()

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

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 
... 

można to zrobić?

Odpowiedz

1

Z Twoich wymagań wynika, że ​​możesz osiągnąć tę funkcjonalność za pomocą NSAttributedString i NSTextView. Poniżej jest przykładowy kod NSTextView już pochodzi z bogatej funkcjonalności edycji tekstu i przechowywania formacie można osiągnąć poprzez 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) 
    } 
} 

enter image description here

1

NSLayoutManager (który jest używany przez NSTextView i NSAttributedString w ogóle) ma specjalna funkcja przeznaczona do modyfikowania tekstu przed wyświetleniem go na ekranie bez zmiany źródła: tymczasowe atrybuty.

Spójrz NSLayoutManager dokumenty do metod, które mają „TemporaryAttribute” w ich nazwach:

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

Mają one być stosowane na przykład jako zielona/czerwona podkreśleniem wyrazów podczas sprawdzania pisowni lub po prostu zaznaczyć fragment tekstu tymczasowo. Pozwalają one modyfikować wygląd fragmentów tekstu dla zwykłych celów wyświetlania bez modyfikowania oryginalnego źródła tekstu.

+0

To wygląda na świetne rozwiązanie. Inne rozwiązanie, o którym myślałem, to dodanie instancji 'CALayer' pod główną warstwą' NSTextLayer' w 'NSTextView', aby pokazać podświetlanie, ale to rozwiązanie wygląda lepiej. Co myślisz? – jamespick