NSTextView 研究(1)

这次研究的目标是 NSTextView 控件的文本处理图片处理问题

这是一个初步演示,在这里我们建立一个类来处理文本的写入问题。你建立一个Cocoa工程,然后在View里拖入一个NSTextView对象,并在

ViewController类中添加 textView 变量。然后在 viewDidLoad() 函数中添加代码。令人你需要找一个girl.jpg文件,也拖入工程。

用到的代码全部列在后面,就不解释了。



里面添加代码。

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let attachmentCell = NSTextAttachmentCell(imageCell: NSImage(named: "girl.jpg"))
        let attachment = NSTextAttachment()
        attachment.attachmentCell = attachmentCell
        
        let attributedStr = NSAttributedString(attachment: attachment)
        self.textView.textStorage?.insert(attributedStr, at: 0)

         let designer = TextAttributedDesigner("Designer Example")
         designer.newline()
         designer.append("ForegroundColor", attrType: .foregroundColor(NSColor.blue))
         designer.newline()
         designer.append("BackgroundColor", attrType: .backgroundColor(NSColor.lightGray))
         designer.newline()
         designer.append("Font (Cochin-BoldItalic)", attrType: .font(NSFont(name: "Cochin-BoldItalic", size: 30)!))
         designer.newline()
         let para = NSMutableParagraphStyle()
         para.alignment = .center
         designer.append("this is paragraph text, the text is so length over than normal text line.",
         attrType: AttributeItemType.paragraphStyle(para))
         designer.newline()
         
         let para1 = NSMutableParagraphStyle()
         para1.firstLineHeadIndent = 20
         designer.append("this is left indent text, the text is so length than normal text line.this is left indent text, the text is so length over than normal text line.this is backgroundColor indent text, the text is so length over than normal text line.",
         attrType: AttributeItemType.paragraphStyle(para1))
         designer.newline()
         designer.append("ligature", attrType: .ligature(0))
         designer.newline()
         designer.append("the kern is long.", attrType: .kern(4))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(4))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(3))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(2))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(1))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(0))
         designer.newline()
         designer.append("strikethrough", attrType: .strikethrough(9))
         designer.newline()
         
         designer.append("underline", attrType: .underline(5))
         designer.newline()
         designer.append("underline", attrType: .underline(3))
         designer.newline()
         designer.append("underline", attrType: .underline(1))
         designer.newline()
         designer.append("underline", attrType: .underline(0))
         designer.newline()
         designer.append("StrokeColor", attrType: .strokeColor(NSColor.blue))
         designer.newline()
         
         let shdw = NSShadow()
         shdw.shadowColor = NSColor.brown
         shdw.shadowBlurRadius = 3
         shdw.shadowOffset = NSMakeSize(3, -3)
         designer.append("Shadow", attrType: .shadow(shdw))
         designer.newline()
         designer.append("TextEffect", attrType: .textEffect(NSTextEffectLetterpressStyle as NSString))
         designer.newline()
         
         designer.append(" Many Font (Cochin-BoldItalic)", attrTypes: [ .font(NSFont(name: "Cochin-BoldItalic", size: 30)!), .strokeColor(NSColor.blue), .strokeWidth(0.5)])
         designer.newline()
         designer.newline()
         
         // 如果想有外框效果。
         designer.append("OUTLINE", attrTypes: [.strokeColor(NSColor.blue), .strokeWidth(1) ])
         designer.newline()
        
         self.textView.insertText( designer.attributedString, replacementRange: NSMakeRange(0,0))
    }


支持上面写法的一个文本支持支持类:
//
//  TextAttributedDesigner.swift
//  TestTextKit
//
//  Created by wuzhiqiang on 2016/10/11.
//  Copyright © 2016年 wuzhiqiang. All rights reserved.
//

import Cocoa

public enum AttributeItemType {
    case font(NSFont)
    case paragraphStyle(NSParagraphStyle)
    case foregroundColor(NSColor)
    case backgroundColor(NSColor)
    case ligature(NSNumber)             // 是否使用连字符
    case kern(NSNumber)                 // 字距调整
    case strikethrough(NSNumber)
    case underline(NSNumber)
    case strokeColor(NSColor)
    case strokeWidth(NSNumber)
    case shadow(NSShadow)
    case textEffect(NSString)
    case attachment(NSTextAttachment)
    case link(NSURL)
    case baselineOffset(NSNumber)
    case obliqueness(NSNumber)
    case expansion(NSNumber)
    case writingDirection([NSNumber])
    case verticalGlyphForm(NSNumber)
    case markedClauseSegment(NSNumber)
    case textAlternatives(NSTextAlternatives)
    case spellingState(NSNumber)
    case cursor(NSNumber)
    case toolTip(NSString?)
    
    public var key: String {
        switch self {
        case .font: return NSFontAttributeName
        case .paragraphStyle: return NSParagraphStyleAttributeName
        case .foregroundColor: return NSForegroundColorAttributeName
        case .backgroundColor: return NSBackgroundColorAttributeName
        case .ligature: return NSLigatureAttributeName
        case .kern: return NSKernAttributeName
        case .strikethrough: return NSStrikethroughStyleAttributeName
        case .underline: return NSUnderlineStyleAttributeName
        case .strokeColor: return NSStrokeColorAttributeName
        case .strokeWidth: return NSStrokeWidthAttributeName
        case .shadow: return  NSShadowAttributeName
        case .textEffect: return NSTextEffectAttributeName
        case .attachment: return NSAttachmentAttributeName
        case .link: return NSLinkAttributeName
        case .baselineOffset: return NSBaselineOffsetAttributeName
        case .obliqueness: return NSObliquenessAttributeName
        case .expansion: return NSExpansionAttributeName
        case .writingDirection: return NSWritingDirectionAttributeName
        case .verticalGlyphForm: return NSVerticalGlyphFormAttributeName
        case .markedClauseSegment: return NSMarkedClauseSegmentAttributeName
        case .textAlternatives: return NSTextAlternativesAttributeName
        case .spellingState: return NSSpellingStateAttributeName
        case .cursor: return NSCursorAttributeName
        case .toolTip: return NSToolTipAttributeName
        }
    }
    public var keyValuePair: [String: Any] {
        switch self {
        case .font(let value): return [self.key : value]
        case .paragraphStyle(let value): return [self.key : value]
        case .foregroundColor(let value): return [self.key : value]
        case .backgroundColor(let value): return [self.key : value]
        case .ligature(let value): return [self.key : value]
        case .kern(let value): return [self.key : value]
        case .strikethrough(let value): return [self.key : value]
        case .underline(let value): return [self.key : value]
        case .strokeColor(let value): return [self.key : value]
        case .strokeWidth(let value): return [self.key : value]
        case .shadow(let value): return [self.key : value]
        case .textEffect(let value): return [self.key : value]
        case .attachment(let value): return [self.key : value]
        case .link(let value): return [self.key : value]
        case .baselineOffset(let value): return [self.key : value]
        case .obliqueness(let value): return [self.key : value]
        case .expansion(let value): return [self.key : value]
        case .writingDirection(let value): return [self.key : value]
        case .verticalGlyphForm(let value): return [self.key : value]
        case .markedClauseSegment(let value): return [self.key : value]
        case .textAlternatives(let value): return [self.key : value]
        case .spellingState(let value): return [self.key : value]
        case .cursor(let value): return [self.key : value]
        case .toolTip(let value): return [self.key : value]
        }
    }
}

public struct TextAttributedDesigner {
    internal let attrText = NSMutableAttributedString()
    
    public var attributedString: NSAttributedString {
        return attrText
    }
    // Texkit Support
    public init(_ text: String, attrType: AttributeItemType? = nil ){
        self.append(text, attrType: attrType )
    }
    public func newline(attrType: AttributeItemType? = nil){
        self.append( "\r\n", attrType: attrType )
    }
    public func append(_ text: String, attrType: AttributeItemType? = nil ){
        let attr =  NSAttributedString(string: text, attributes: attrType?.keyValuePair )
        self.attrText.append( attr )
    }
    public func insert(_ text: String, at loc: Int, attrType: AttributeItemType? = nil ){
        let attr =  NSAttributedString(string: text, attributes: attrType?.keyValuePair )
        self.attrText.insert( attr, at: loc)
    }
    public func append(_ text: String, attrTypes: [AttributeItemType] ){
        let attr =  NSAttributedString(string: text, attributes: ItemTypesToDict(attrTypes: attrTypes) )
        self.attrText.append( attr )
    }
    public func insert(_ text: String, at loc: Int, attrTypes: [AttributeItemType] ){
        let attr =  NSAttributedString(string: text, attributes: ItemTypesToDict(attrTypes: attrTypes) )
        self.attrText.insert( attr, at: loc)
    }
    
    //
    private func ItemTypesToDict(attrTypes: [AttributeItemType] )->[String: Any] {
        var dict = [String:Any]()
        for attr in attrTypes {
            let keyValue = attr.keyValuePair
            for (key, value) in keyValue {
                dict[key] = value
            }
        }
        return dict
    }

}


这里的代码简化了NSTextView的文本和图片的插入。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值