NSAttributedString的設置

/*將符號轉換為上標*/

-(NSMutableAttributedString *)changeToSuperscriptForNumberSignWith:(NSString *)string changeString:(NSString *)changeString{

NSRange range = [string rangeOfString:changeString];

NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc]initWithString:string];

NSDictionary * attris = @{NSBaselineOffsetAttributeName:@(3),

NSFontAttributeName:[UIFont systemFontOfSize:9]};

[attributedString setAttributes:attris range:range];

return attributedString;

}

NSAttributedString可以讓我們使一個字符串顯示的多樣化胖笛,但是目前到iOS 5為止梢夯,好像對它支持的不是很好驯鳖,因為顯示起來不太方便(至少沒有在OS X上方便)。

首先導入CoreText.framework,并在需要使用的文件中導入:

#import

創(chuàng)建一個NSMutableAttributedString:

1NSMutableAttributedString*attriString?=?[[[NSMutableAttributedStringalloc]initWithString:@"this?is?test!"]

2autorelease];

非常常規(guī)的創(chuàng)建方式,接下來我們給它配置屬性:

1//把this的字體顏色變?yōu)榧t色

2[attriStringaddAttribute:(NSString*)kCTForegroundColorAttributeName

3value:(id)[UIColorredColor].CGColor

4range:NSMakeRange(0,?4)];

5//把is變?yōu)辄S色

6[attriStringaddAttribute:(NSString*)kCTForegroundColorAttributeName

7value:(id)[UIColoryellowColor].CGColor

8range:NSMakeRange(5,?2)];

9//改變this的字體,value必須是一個CTFontRef

10[attriStringaddAttribute:(NSString*)kCTFontAttributeName

11value:(id)CTFontCreateWithName((CFStringRef)[UIFontboldSystemFontOfSize:14].fontName,

1214,

13NULL)

14range:NSMakeRange(0,?4)];

15//給this加上下劃線冗荸,value可以在指定的枚舉中選擇

16[attriStringaddAttribute:(NSString*)kCTUnderlineStyleAttributeName

17value:(id)[NSNumbernumberWithInt:kCTUnderlineStyleDouble]

18range:NSMakeRange(0,?4)];

19returnattriString;

這樣就算是配置好了,但是我們可以發(fā)現NSAttributedString繼承于NSObject利耍,并且不支持任何draw的方法蚌本,那我們就只能自己draw了。寫一個UIView的子類(假設命名為TView)隘梨,在initWithFrame中把背景色設為透明(self.backgroundColor = [UIColor clearColor])程癌,然后在重寫drawRect方法:

1-(void)drawRect:(CGRect)rect{

2[superdrawRect:rect];

3

4NSAttributedString*attriString?=?getAttributedString();

5

6CGContextRef?ctx?=?UIGraphicsGetCurrentContext();

7CGContextConcatCTM(ctx,?CGAffineTransformScale(CGAffineTransformMakeTranslation(0,?rect.size.height),?1.f,?-1.f));

8

9CTFramesetterRef?framesetter?=?CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);

10CGMutablePathRef?path?=?CGPathCreateMutable();

11CGPathAddRect(path,NULL,?rect);

12

13CTFrameRef?frame?=?CTFramesetterCreateFrame(framesetter,?CFRangeMake(0,?0),?path,NULL);

14CFRelease(path);

15CFRelease(framesetter);

16

17CTFrameDraw(frame,?ctx);

18CFRelease(frame);

19}

在代碼中我們調整了CTM(current transformation matrix),這是因為Quartz 2D的坐標系統(tǒng)不同轴猎,比如(10, 10)到(20, 20)的直線坐標:

坐標類似于數學中的坐標嵌莉,可以先不調整CTM,看它是什么樣子的捻脖,下面兩種調整方法是完全一樣的:

1CGContextConcatCTM(ctx,?CGAffineTransformScale(CGAffineTransformMakeTranslation(0,?rect.size.height),?1.f,?-1.f));

==

1CGContextTranslateCTM(ctx,?0,?rect.size.height);

2CGContextScaleCTM(ctx,?1,?-1);

CTFramesetter是CTFrame的創(chuàng)建工廠锐峭,NSAttributedString需要通過CTFrame繪制到界面上,得到CTFramesetter后可婶,創(chuàng)建path(繪制路徑)沿癞,然后得到CTFrame,最后通過CTFrameDraw方法繪制到界面上矛渴。

如果想要計算NSAttributedString所要的size椎扬,就需要用到這個API:

CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行時會算不準的具温,因為在CoreText里蚕涤,行間距也是你來控制的。

設置行間距和換行模式都是設置一個屬性:kCTParagraphStyleAttributeName铣猩,這個屬性里面又分為很多子

屬性揖铜,其中就包括

? kCTLineBreakByCharWrapping

? kCTParagraphStyleSpecifierLineSpacingAdjustment

設置如下:

1//段落

2//line?break

3CTParagraphStyleSetting?lineBreakMode;

4CTLineBreakMode?lineBreak?=?kCTLineBreakByCharWrapping;//換行模式

5lineBreakMode.spec?=?kCTParagraphStyleSpecifierLineBreakMode;

6lineBreakMode.value?=?&lineBreak;

7lineBreakMode.valueSize?=sizeof(CTLineBreakMode);

8//行間距

9CTParagraphStyleSetting?LineSpacing;

10CGFloat?spacing?=?4.0;//指定間距

11LineSpacing.spec?=?kCTParagraphStyleSpecifierLineSpacingAdjustment;

12LineSpacing.value?=?&spacing;

13LineSpacing.valueSize?=sizeof(CGFloat);

14

15CTParagraphStyleSetting?settings[]?=?{lineBreakMode,LineSpacing};

16CTParagraphStyleRef?paragraphStyle?=?CTParagraphStyleCreate(settings,?2);//第二個參數為settings的長度

17[attributedStringaddAttribute:(NSString*)kCTParagraphStyleAttributeName

18value:(id)paragraphStyle

19range:NSMakeRange(0,?attributedString.length)];

-----------------------------------------猥瑣的分界線-----------------------------------------

這并不是唯一的方法,還有另一種替代方案:

1CATextLayer*textLayer?=?[CATextLayerlayer];

2textLayer.string?=?getAttributedString();

3textLayer.frame?=?CGRectMake(0,?CGRectGetMaxY(view.frame),?200,?200);

4[self.view.layeraddSublayer:textLayer];

CATextLayer可以直接支持NSAttributedString剂习!

-----------------------------------------猥瑣的分界線-----------------------------------------

效果圖:

文本屬性Attributes

1.NSKernAttributeName: @10 調整字句 kerning 字句調整

2.NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 設置字體

3.NSForegroundColorAttributeName :[UIColor redColor] 設置文字顏色

4.NSParagraphStyleAttributeName : paragraph 設置段落樣式

5.NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];

paragraph.alignment = NSTextAlignmentCenter;

6.NSBackgroundColorAttributeName: [UIColor blackColor] 設置背景顏色

7.NSStrokeColorAttributeName設置文字描邊顏色,需要和NSStrokeWidthAttributeName設置描邊寬度较沪,這樣就能使文字空心.

NSStrokeWidthAttributeName這個屬性所對應的值是一個 NSNumber 對象(小數)鳞绕。該值改變描邊寬度(相對于字體size 的百分比)。默認為 0尸曼,即不改變们何。正數只改變描邊寬度。負數同時改變文字的描邊和填充寬度控轿。例如冤竹,對于常見的空心字拂封,這個值通常為3.0。

同時設置了空心的兩個屬性鹦蠕,并且NSStrokeWidthAttributeName屬性設置為整數冒签,文字前景色就無效果了

效果:

效果:

8. NSStrikethroughStyleAttributeName 添加刪除線,strikethrough刪除線

效果:

9. NSUnderlineStyleAttributeName 添加下劃線

效果:

10. NSShadowAttributeName 設置陰影钟病,單獨設置不好使萧恕,必須和其他屬性搭配才好使。

和這三個任一個都好使肠阱,NSVerticalGlyphFormAttributeName票唆,NSObliquenessAttributeName,NSExpansionAttributeName

11.NSVerticalGlyphFormAttributeName

該屬性所對應的值是一個 NSNumber 對象(整數)屹徘。0 表示橫排文本走趋。1 表示豎排文本。在 iOS 中噪伊,總是使用橫排文本簿煌,0 以外的值都未定義。

效果:

12. NSObliquenessAttributeName設置字體傾斜酥宴。Skew 斜

效果:

13. NSExpansionAttributeName 設置文本扁平化

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末啦吧,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子拙寡,更是在濱河造成了極大的恐慌授滓,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肆糕,死亡現場離奇詭異般堆,居然都是意外死亡,警方通過查閱死者的電腦和手機诚啃,發(fā)現死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門淮摔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人始赎,你說我怎么就攤上這事和橙。” “怎么了造垛?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵魔招,是天一觀的道長。 經常有香客問我五辽,道長办斑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乡翅,結果婚禮上鳞疲,老公的妹妹穿的比我還像新娘。我一直安慰自己蠕蚜,他們只是感情好尚洽,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著波势,像睡著了一般翎朱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尺铣,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天拴曲,我揣著相機與錄音,去河邊找鬼凛忿。 笑死澈灼,一個胖子當著我的面吹牛,可吹牛的內容都是我干的店溢。 我是一名探鬼主播叁熔,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼床牧!你這毒婦竟也來了荣回?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戈咳,失蹤者是張志新(化名)和其女友劉穎心软,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體著蛙,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡删铃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了踏堡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猎唁。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顷蟆,靈堂內的尸體忽然破棺而出诫隅,到底是詐尸還是另有隱情,我是刑警寧澤帐偎,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布逐纬,位于F島的核電站,受9級特大地震影響肮街,放射性物質發(fā)生泄漏风题。R本人自食惡果不足惜判导,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一嫉父、第九天 我趴在偏房一處隱蔽的房頂上張望沛硅。 院中可真熱鬧,春花似錦绕辖、人聲如沸摇肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽围小。三九已至,卻和暖如春树碱,著一層夾襖步出監(jiān)牢的瞬間肯适,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工成榜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留框舔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓赎婚,卻偏偏與公主長得像刘绣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挣输,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容