2016-02-09 4 views
7

Моя цель - сделать представление, похожее на текстовый редактор Goole Docs, с комментарием, выделяющим текст, где есть комментарии. HighlightNSTextView внутри NSView и NSScrollView

Мое решение иметь NSScrollView содержащий NSView (набор в качестве вида документа), что свитки и содержит одновременно NSTextView текста и других NSView с, которые будут основные направления.

Для этого необходимо, чтобы 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 
... 

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) 
    } 
} 

enter image description here

1

NSLayoutManager (который используется NSTextView и NSAttributedString в целом) имеет специальная функция, предназначенная для изменения текста перед его отображением на экране без изменения источника: временные атрибуты.

Посмотрите NSLayoutManager документацию для методов, которые имеют «TemporaryAttribute» в их названиях:

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

Они должны быть использованы, например, как зеленый/красный подчеркивание слов во время проверки орфографии, или просто выделить часть текста временно. Они позволяют изменять внешний вид частей текста для простого отображения без изменения исходного атрибутного источника текста.

+0

Это похоже на отличное решение. Другое решение, о котором я думал, состояло в том, чтобы просто добавить экземпляры CALayer под основным слоем «NSTextLayer» в «NSTextView», чтобы показать выделение, но это решение выглядит лучше. Как вы думаете? – jamespick

Смежные вопросы