高亮
不少开发的时候会用到文字显示,会用UILabel
或UITextView
,
这两个组件都有一个NSAttributedString
(iOS6 later)的属性,通过设置attributedText属性来改变文字显示的样式。
UIKIT_EXTERN NSString *const NSFontAttributeName NS_AVAILABLE_IOS(6_0); // UIFont, default Helvetica(Neue) 12
UIKIT_EXTERN NSString *const NSParagraphStyleAttributeName NS_AVAILABLE_IOS(6_0); // NSParagraphStyle, default defaultParagraphStyle
UIKIT_EXTERN NSString *const NSForegroundColorAttributeName NS_AVAILABLE_IOS(6_0); // UIColor, default blackColor
UIKIT_EXTERN NSString *const NSBackgroundColorAttributeName NS_AVAILABLE_IOS(6_0); // UIColor, default nil: no background
UIKIT_EXTERN NSString *const NSLigatureAttributeName NS_AVAILABLE_IOS(6_0); // NSNumber containing integer, default 1: default ligatures, 0: no ligatures
UIKIT_EXTERN NSString *const NSKernAttributeName NS_AVAILABLE_IOS(6_0); // NSNumber containing floating point value, in points; amount to modify default kerning. 0 means kerning is disabled.
UIKIT_EXTERN NSString *const NSStrikethroughStyleAttributeName NS_AVAILABLE_IOS(6_0); // NSNumber containing integer, default 0: no strikethrough
UIKIT_EXTERN NSString *const NSUnderlineStyleAttributeName NS_AVAILABLE_IOS(6_0); // NSNumber containing integer, default 0: no underline
UIKIT_EXTERN NSString *const NSStrokeColorAttributeName NS_AVAILABLE_IOS(6_0); // UIColor, default nil: same as foreground color
UIKIT_EXTERN NSString *const NSStrokeWidthAttributeName NS_AVAILABLE_IOS(6_0); // NSNumber containing floating point value, in percent of font point size, default 0: no stroke; positive for stroke alone, negative for stroke and fill (a typical value for outlined text would be 3.0)
UIKIT_EXTERN NSString *const NSShadowAttributeName NS_AVAILABLE_IOS(6_0); // NSShadow, default nil: no shadow
UIKIT_EXTERN NSString *const NSTextEffectAttributeName NS_AVAILABLE_IOS(7_0); // NSString, default nil: no text effect
UIKIT_EXTERN NSString *const NSAttachmentAttributeName NS_AVAILABLE_IOS(7_0); // NSTextAttachment, default nil
UIKIT_EXTERN NSString *const NSLinkAttributeName NS_AVAILABLE_IOS(7_0); // NSURL (preferred) or NSString
UIKIT_EXTERN NSString *const NSBaselineOffsetAttributeName NS_AVAILABLE_IOS(7_0); // NSNumber containing floating point value, in points; offset from baseline, default 0
UIKIT_EXTERN NSString *const NSUnderlineColorAttributeName NS_AVAILABLE_IOS(7_0); // UIColor, default nil: same as foreground color
UIKIT_EXTERN NSString *const NSStrikethroughColorAttributeName NS_AVAILABLE_IOS(7_0); // UIColor, default nil: same as foreground color
UIKIT_EXTERN NSString *const NSObliquenessAttributeName NS_AVAILABLE_IOS(7_0); // NSNumber containing floating point value; skew to be applied to glyphs, default 0: no skew
UIKIT_EXTERN NSString *const NSExpansionAttributeName NS_AVAILABLE_IOS(7_0); // NSNumber containing floating point value; log of expansion factor to be applied to glyphs, default 0: no expansion
UIKIT_EXTERN NSString *const NSWritingDirectionAttributeName NS_AVAILABLE_IOS(7_0); // NSArray of NSNumbers representing the nested levels of writing direction overrides as defined by Unicode LRE, RLE, LRO, and RLO characters. The control characters can be obtained by masking NSWritingDirection and NSTextWritingDirection values. LRE: NSWritingDirectionLeftToRight|NSTextWritingDirectionEmbedding, RLE: NSWritingDirectionRightToLeft|NSTextWritingDirectionEmbedding, LRO: NSWritingDirectionLeftToRight|NSTextWritingDirectionOverride, RLO: NSWritingDirectionRightToLeft|NSTextWritingDirectionOverride,
UIKIT_EXTERN NSString *const NSVerticalGlyphFormAttributeName NS_AVAILABLE_IOS(6_0); // An NSNumber containing an integer value. 0 means horizontal text. 1 indicates vertical text. If not specified, it could follow higher-level vertical orientation settings. Currently on iOS, it's always horizontal. The behavior for any other value is undefined.
可以设置的有文字字体(大小,字体...)、下划线、描边、斜体、背景色、前景色(字体颜色)等。
通过定义一个NSMutableAttributedString
,然后addAttribute:value:range:
添加要修改的属性,range就是所添加属性的实现范围。
为了更加方便的实现我通过利用占位符来控制要特殊显示的范围,这我用到了&
。然后通过写NSMutableString
的Category来实现。
@implementation NSMutableString(Highlight)
//去除‘&’并获取要高亮的range
- (NSArray *)formatStringAndGetRanges
{
NSMutableArray *arr = [NSMutableArray array];
while ([self rangeOfString:@"&"].length > 0) {
NSRange ranF = [self rangeOfString:@"&"];
[self replaceCharactersInRange:ranF withString:@""];
NSRange ranE = [self rangeOfString:@"&"];
if (ranE.length == 0) {
break;
}
[self replaceCharactersInRange:ranE withString:@""];
NSRange ran = NSMakeRange(ranF.location, ranE.location - ranF.location);
[arr addObject:[NSValue valueWithRange:ran]];
}
return arr;
}
//返回已经设置好所有高亮属性的NSAttributedString
- (NSAttributedString *) highlightAttributedStringWithColor:(UIColor *)color
{
NSArray *arr = [self formatStringAndGetRanges];
NSMutableAttributedString *attriStr = [[NSMutableAttributedString alloc]initWithString:self];
for (NSValue *va in arr) {
NSRange ran = [va rangeValue];
[attriStr addAttribute:NSForegroundColorAttributeName
value:color
range:ran];
}
return attriStr;
}
@end
使用
NSMutableString *str = [NSMutableString stringWithString:@"0&1&234567&8&9"];
[textView setAttributedText:[str highlightAttributedStringWithColor:[UIColor blueColor]]];
注意占位符&
需要成对出现!
效果
