首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSMutableAttributedString与NSRange问题

NSMutableAttributedString与NSRange问题
EN

Stack Overflow用户
提问于 2014-06-20 14:31:21
回答 2查看 1.4K关注 0票数 0

我有以下字符串

22\n沙ʻ禁令\n 1435

我使用NSMutableAttributedString来使用多个字体格式化上面的字符串,如下所示:

代码语言:javascript
运行
复制
NSString* orgString=@"22\nShaʻban\n1435";
NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:[dateStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
UIFont *dayFont=[UIFont fontWithName:@"Helvetica-Bold" size:40.0f];
UIFont *monthFont=[UIFont fontWithName:@"Arial" size:22.0f];
UIFont *yearFont=[UIFont fontWithName:@"Arial" size:20.0f];

//format day part
[attString addAttribute:NSFontAttributeName value:dayFont range:NSMakeRange(0,2)];
//format month part
[attString addAttribute:NSFontAttributeName value:monthFont range:NSMakeRange(3,[self indexOf:[dateStr substringFromIndex:3] andSearchChar:@"\n"])];
//format year part, app crashes here
[attString addAttribute:NSFontAttributeName value:yearFont range:NSMakeRange([self indexOf:[dateStr substringFromIndex:3] andSearchChar:@"\n"]+1,[dateStr length])];


- (int) indexOf:(NSString*)orgStr andSearchChar:(NSString *)charToSearc  {
NSRange range = [orgStr rangeOfString:charToSearc];
if ( range.length > 0 ) {
    return range.location;
} else {
    return -1;
  }
}

我不知道为什么它在试图格式化最后一部分时崩溃,我从第2 +1部分的最后一个位置开始排列到字符串的长度,请提供任何帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-20 14:50:42

我建议这样做:

代码语言:javascript
运行
复制
NSString* orgString=@"22\nShaʻban\n1435";

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] init];

UIFont *dayFont = [UIFont fontWithName:@"Helvetica-Bold" size:40.0f];
UIFont *monthFont = [UIFont fontWithName:@"Arial" size:22.0f];
UIFont *yearFont = [UIFont fontWithName:@"Arial" size:20.0f];

NSArray *array = [orgString componentsSeparatedByString:@"\n"];

[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:[array objectAtIndex:0] attributes:@{NSFontAttributeName: dayFont}]];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:[array objectAtIndex:1] attributes:@{NSFontAttributeName: monthFont}]];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:[array objectAtIndex:2] attributes:@{NSFontAttributeName: yearFont}]];

所以,没有NSRange问题。此外,正如@Wain所说,您误解了什么是NSRange。与您正在做的事情不同,一旦您找到了位置,就必须将其作为NSMakeRange的第二个参数:。最后一个例子是这样的:

代码语言:javascript
运行
复制
NSMakeRange([self indexOf:[dateStr substringFromIndex:3] andSearchChar:@"\n"]+1,
            [dateStr length]-[self indexOf:[dateStr substringFromIndex:3] andSearchChar:@"\n"]+1)
票数 0
EN

Stack Overflow用户

发布于 2014-06-20 14:47:36

代码语言:javascript
运行
复制
NSRange NSMakeRange (
   NSUInteger loc,
   NSUInteger len
);

范围是一个位置和长度,而不是开始和结束位置。因此,您需要更改计算范围内容的方式。

或者,将源字符串拆分,为每个部分创建属性化字符串,然后将它们附加到一起。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24329668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档