2016-09-14 20 views
0

下記のクラス& funcを使用して非表示の文字を表示しようとしていますが、正常に動作しています。replaceGlyphAtIndexは非推奨です

しかしreplaceGlyphAtIndexはOS X 10.11で廃止され、我々は()setGlyhsを使用する必要が

setGlyphs(<#T##glyphs: UnsafePointer<CGGlyph>##UnsafePointer<CGGlyph>#>, properties: <#T##UnsafePointer<NSGlyphProperty>#>, characterIndexes: <#T##UnsafePointer<Int>#>, font: <#T##NSFont#>, forGlyphRange: <#T##NSRange#>) 

しかし、私はsetGlyphsにreplaceGlyphAtIndexを変換する方法についての困難を抱えています。 以下のように、GlyphAtIndexをsetGlyphs()に置き換える方法を教えてください。

私は以下のように試みましたが、クラッシュしています。

let data = String(g).dataUsingEncoding(NSUTF8StringEncoding) 
let cgG = UnsafePointer<CGGlyph>(data!.bytes) 
self.setGlyphs(cgG, properties: nil, characterIndexes: UnsafePointer<Int>(bitPattern: characterIndex), font: font as! NSFont, forGlyphRange: NSMakeRange(glyphIndex, 1)) 

上記のコード行で何が間違っているのか教えてください。

class MyLayoutManager: NSLayoutManager { 

override func drawGlyphsForGlyphRange(glyphsToShow: NSRange, atPoint origin: NSPoint) { 
    if let storage = self.textStorage { 
     let s = storage.string 
     let startIndex = s.startIndex 

     for glyphIndex in glyphsToShow.location ..< glyphsToShow.location + glyphsToShow.length { 
      let characterIndex = self.characterIndexForGlyphAtIndex(glyphIndex) 
      let ch = s[startIndex.advancedBy(characterIndex)] 
      switch ch { 
      case " ": //Blank Space 
       let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil) 
       if let font = attrs[NSFontAttributeName] { 
        let g = font.glyphWithName("period")//("periodcentered") 
        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g) 


        //      let data = String(g).dataUsingEncoding(NSUTF8StringEncoding) 
        //      let cgG = UnsafePointer<CGGlyph>(data!.bytes) 
        // 
        //      self.setGlyphs(cgG, properties: nil, characterIndexes: UnsafePointer<Int>(bitPattern: characterIndex), font: font as! NSFont, forGlyphRange: NSMakeRange(glyphIndex, 1)) 
       } 
      case "\n": //New Line 
       let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil) 
       if let font = attrs[NSFontAttributeName] { 
        let g = font.glyphWithName("logicalnot") 
        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g) 
       } 
      case newLineUniCodeStr: 
       let attrs = storage.attributesAtIndex(characterIndex, effectiveRange: nil) 
       if let font = attrs[NSFontAttributeName] { 
        let g = font.glyphWithName("logicalnot") 
        self.replaceGlyphAtIndex(glyphIndex, withGlyph: g) 
       } 
      default: 
       break 
      } 
     } 
    } 
    super.drawGlyphsForGlyphRange(glyphsToShow, atPoint: origin) 
} 

}

答えて

0

Iは、グリフを表示するための別の方法を発見しました。 (それは他の人に有用である可能性があるとして、以下の私のコードを投稿する)

override func drawGlyphsForGlyphRange(glyphsToShow: NSRange, atPoint origin: NSPoint) { 
    if let storage = self.textStorage { 
     let s = storage.string 
     let startIndex = s.startIndex 

     var padding:CGFloat = 0 
     for glyphIndex in glyphsToShow.location ..< glyphsToShow.location + glyphsToShow.length { 
      let characterIndex = self.characterIndexForGlyphAtIndex(glyphIndex) 
      if characterIndex < s.characters.count 
      { 
       var glyphStr = "" 
       let ch = s[startIndex.advancedBy(characterIndex)] 
       switch ch { 
       case " ": //Blank Space 
        glyphStr = periodCenteredUniCodeStr 
       case "\n": //New Line 
        glyphStr = lineBreakUniCodeStr 
       case newLineUniCodeStr: 
        glyphStr = lineBreakUniCodeStr 
        padding += 5 
       default: 
        break 
       } 
       var glyphPoint = self.locationForGlyphAtIndex(glyphIndex) 
       let glyphRect = self.lineFragmentRectForGlyphAtIndex(glyphIndex, effectiveRange: nil) 
       if glyphStr.characters.count > 0{ 
        glyphPoint.x = glyphPoint.x + glyphRect.origin.x 
        glyphPoint.y = glyphRect.origin.y 
        NSString(string: glyphStr).drawInRect(NSMakeRect(glyphPoint.x, glyphPoint.y, 10, 10), withAttributes: nil) 
       } 
      }else{ 
       print("Wrong count here") 
      } 
     } 

    } 
    super.drawGlyphsForGlyphRange(glyphsToShow, atPoint: origin) 
} 
+0

残念ながら、この方法は、はい私は最近、それに気づいたのが遅すぎると、複数ページレイアウト –

+0

@VitaliyVashchenkoでは動作しません。あなたはもっと良いアイデアを知っていますか?それは彼が私と他の人のために役立つように。 –

+0

はい、非常に効率的です。私が解決策を見つけたら、私の質問トピックにコードを投稿しました:http://stackoverflow.com/questions/39545718/nslayoutmanager-hides-new-line-characters-no-matter-what-i-do –