2014-02-19 63 views
0

我想要一個UITextView在兩種顯示模式之間切換。 在模式1中,它應該顯示縮寫,並在模式2中顯示完整的單詞。例如「縮寫」。 vs「縮寫」。如何插入額外的字形?

什麼是最好的方法來做到這一點?請記住,有些單詞可以具有相同的縮寫,並且用戶可以自由輸入完整的單詞或縮寫?

到目前爲止,我嘗試子類NSLayoutManager。 假設我得到一個簡短的字符串,我要畫完整的單詞,我會實現以下方法:

-(void)setGlyphs:(const CGGlyph *)glyphs 
    properties:(const NSGlyphProperty *)props 
characterIndexes:(const NSUInteger *)charIndexes 
     font:(UIFont *)aFont 
forGlyphRange:(NSRange)glyphRange 
{ 
    NSUInteger length = glyphRange.length; 
    NSString *sourceString = @"a very long string as a source of characters for substitution"; //temp. 

unichar *characters = malloc(sizeof(unichar) * length+4); 
CGGlyph *subGlyphs = malloc(sizeof(CGGlyph) * length+4); 
[sourceString getCharacters:characters 
         range:NSMakeRange(0, length+4)]; 

CTFontGetGlyphsForCharacters((__bridge CTFontRef)(aFont), 
          characters, 
          subGlyphs, 
          length+4); 

[super setGlyphs:subGlyphs 
     properties:props 
characterIndexes:charIndexes 
      font:aFont 
    forGlyphRange:NSMakeRange(glyphRange.location, length+4)]; 

}

但是這種方法會抱怨無效字形索引「_NSGlyphTreeInsertGlyphs無效字符的索引」時我嘗試插入4個附加字形。

+0

出了什麼問題只是改變了_text_ ? – matt

+0

有些詞映射到相同的縮寫。 – user965972

+0

那麼?在自定義屬性中保留祕密信息(即原始單詞是什麼)。 – matt

回答

1

你在吠叫錯誤的樹;在這種情況下嘗試子類NSLayoutManager是矯枉過正。你的問題僅僅是交換文本段(用縮寫代替縮寫),所以你只需要這麼做 - 在文本中顯示底層的NSMutableAttributedString。

你在評論中說「有些詞映射到相同的縮寫」。沒問題。假設你知道原始單詞(如果你不知道這個問題是不可解決的),把原始單詞存儲爲NSMutableAttributedString的一部分,即作爲單詞所在地的一個屬性。因此,當您替換縮寫時,該屬性將保留,並因此保留原始單詞,以便在需要將其切換回來時爲您準備好。

例如,假設這個字符串:@"I love New York"您可以隱藏文字「紐約」作爲文本的同一段由「紐約」佔領一個屬性:

[attributedString addAttribute:@"realword" value:@"New York" range:NSMakeRange(7,8)]; 

現在,您可以設置範圍的文本到@"NY",但該屬性仍然存在,您可以在需要將文本切換回未縮寫形式時參考該文本。

(我畫了這個答案在一些長度,因爲很多人都不知道,你能定義你自己的任意NSAttributedString屬性。這是做一個非常有用的東西。)