对CCLabelTTF进行自动换行,显示打字效果(转)

有时候我们在开发cocos2d游戏的时候,会用到任务的对话,或者在做任务的时候跟npc进行对话。这几天正好项目需要,就写了个简单的label,效果就是我们打字一样,一个一个显示出来,自动换行。在我这个例子中,我把总的行数限定4行,根据这个先决条件写了下面的几行代码,仅供参考!!


ary = [NSMutableArray arrayWithCapacity:20];

[ary retain];

int length = [copyStr length];

int line = 1; // 必须要有一行

int wordCount = 0; // 标记第几个字

for (int i = 0; i < length; i++) 

{

// 发现回车行数加1

if ([copyStr characterAtIndex:i] == '\n') 

{

line++;

//NSLog(@"subStr === %@",[copyStr substringToIndex:i]);

[ary addObject:[copyStr substringToIndex:i]];

//NSLog(@"剩余的字符串:%@",[copyStr substringFromIndex:i+1]);

copyStr = [copyStr substringFromIndex:i+1];

length = [copyStr length];// 截取了回车之前的部分之后,就要从新计算剩余字符串的长度

wordCount = 0;

i = 0;

}

if (wordCount*14 > 300) 

{

line++;

//NSLog(@"第一次截取 :%@",[copyStr substringToIndex:wordCount]);

[ary addObject:[copyStr substringToIndex:wordCount]];

copyStr = [copyStr substringFromIndex:wordCount];

//NSLog(@"省下的 === %@",copyStr);

length = [copyStr length];

if (length < kTextCount) 

{

[ary addObject:copyStr];

}

//NSLog(@"省下的长度 === %d",length);

wordCount = 0// 如果发现,到某个字的时候,总的宽度大于了300我们就要手动换行,然后从新开始记数

i = 0; // 从新开始循环变量也要归0

}

//NSLog(@"i == %d",i);

wordCount++;

}

//CGSize size = [kString sizeWithFont:[UIFont fontWithName:@"Arial-BoldMT" size:14] constrainedToSize:CGSizeMake(300, 1000) lineBreakMode:UILineBreakModeWordWrap];

//[self schedule:@selector(setSubString:) interval:0.03];

}

NSMutableArray* array = [NSMutableArray arrayWithCapacity:10];

NSMutableString* mStr = [[NSMutableString alloc] init];

int lineCount = 0;

int maxLine = [ary count];

// 4句话合成一句话

for(NSString* str in ary)

{

[mStr appendString:str];

lineCount++;

if(lineCount%4==0||lineCount>=maxLine)

{

[array addObject:[NSString stringWithFormat:@"%@",mStr]];

[mStr deleteCharactersInRange:NSMakeRange(0, [mStr length])];

}

}

// 获取完之后,由于从新组合了数组,我们把这哥ary清空,从新放入新数组中的对象,就是一个方便

[ary removeAllObjects];

for (int n = 0; n < [array count]; n++) 

{

//NSLog(@"array[%d] == %@",n,[array objectAtIndex:n]);

[ary addObject:[array objectAtIndex:n]];

}

// 标记重新组合的字符串在数组中的索引

printID = 0;

[self nextPrint];

return self;

}


-(void)nextPrint

{

// 标记搜索到的字符数

printIndex = 0;

strPrint = [ary objectAtIndex:printID];

// 求拿出来的字符串的长度

maxPrint = [strPrint length];

printID++;

[self schedule:@selector(print:) interval:0.05];

}


-(void)print:(ccTime)step

{

printIndex++;

[self printString:strPrint index:printIndex];

if(printIndex>=maxPrint)

{

[self unschedule:_cmd];

if (printID < [ary count]) 

{

[self nextPrint];

}

}

}



-(void)printString:(NSString*)str index:(int)index

{


[label setString:[str substringToIndex:index]];

}

原文地址:https://www.cnblogs.com/pinping/p/2244099.html