FXLabel支持中文行距的简单修改
2013-01-10 12:07
513 查看
新版的FXLabel已经可以支持设置行间距了,但发现不能支持中文,遂简单改写了一下应急用
主要修改函数:
- (NSArray *)FXLabel_linesWithFont:(UIFont *)font
constrainedToSize:(CGSize)size
lineBreakMode:(NSLineBreakMode)lineBreakMode
lineSpacing:(CGFloat)lineSpacing
characterSpacing:(CGFloat)characterSpacing
kerningTable:(NSDictionary *)kerningTable
allowOrphans:(BOOL)allowOrphans
此函数中函数word的识别是根据“ ”空格区分的,中文字之间没有,所以识别上有问题。
简单的修改思路是将每个字符作为一个word,也就是类似NSLineBreakByCharWrapping模式
修改代码如下:
例子下载:Linespacing & Orphans
更正一下:
CGSize size = [str sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(320, 999999.0f) lineBreakMode:kCTLineBreakByCharWrapping
lineSpacing:0.8 characterSpacing:0 kerningTable:nil allowOrphans:NO];
CGRect frame = CGRectMake(0, 0, 320, size.height);
l1.frame = frame;
l1.text = str;
l1.backgroundColor = [UIColor clearColor];
l1.textColor = [UIColor redColor];
l1.lineSpacing = 1;
例子中的这段代码,计算size时的lineSpacing写成了0.8比label的设置小了,所以少分了一行
自行更正,我不改例子了
主要修改函数:
- (NSArray *)FXLabel_linesWithFont:(UIFont *)font
constrainedToSize:(CGSize)size
lineBreakMode:(NSLineBreakMode)lineBreakMode
lineSpacing:(CGFloat)lineSpacing
characterSpacing:(CGFloat)characterSpacing
kerningTable:(NSDictionary *)kerningTable
allowOrphans:(BOOL)allowOrphans
此函数中函数word的识别是根据“ ”空格区分的,中文字之间没有,所以识别上有问题。
简单的修改思路是将每个字符作为一个word,也就是类似NSLineBreakByCharWrapping模式
修改代码如下:
- (NSArray *)FXLabel_linesWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode lineSpacing:(CGFloat)lineSpacing characterSpacing:(CGFloat)characterSpacing kerningTable:(NSDictionary *)kerningTable allowOrphans:(BOOL)allowOrphans { //TODO: handle lineBreakMode of type NSLineBreakByCharWrapping //this will require splitting text into individual characters //split text into words NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0]; for (int i=0; i<self.length; i++) { NSString *str = [self substringWithRange:NSMakeRange(i,1)]; NSLog(@"%@", str); [array addObject:str]; } NSArray *words = [NSArray arrayWithArray:array]; // NSString *text = [self stringByReplacingOccurrencesOfString:@"\t" withString:@" "]; // text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@" \n "]; // 空格作为分隔符 // NSArray *words = [text componentsSeparatedByString:@" "]; words = [words filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]]; //calculate lines NSInteger index = 0; NSMutableArray *lines = [NSMutableArray array]; while (index < [words count]) { NSInteger lineCount = [lines count]; if (lineCount && ((lineCount + 1) * font.lineHeight + lineCount * font.pointSize * lineSpacing) > size.height) { //append remaining text to last line NSArray *remainingWords = [words subarrayWithRange:NSMakeRange(index, [words count] - index)]; NSString *line = [lines lastObject]; // 加回空格分隔符 //NSString *newLine = [line length]? [line stringByAppendingString:@" "]: @""; NSString *newLine = [line length]? line : @""; // 加回空格分隔符 //newLine = [newLine stringByAppendingString:[remainingWords componentsJoinedByString:@" "]]; newLine = [newLine stringByAppendingString:[remainingWords componentsJoinedByString:@""]]; newLine = [newLine stringByReplacingOccurrencesOfString:@"\n " withString:@"\n"]; newLine = [newLine stringByReplacingOccurrencesOfString:@" \n" withString:@"\n"]; [lines replaceObjectAtIndex:lineCount - 1 withObject:newLine]; break; } NSString *line = nil; for (int i = index; i < [words count]; i++) { NSString *word = words[i]; // 加回空格分隔符 //NSString *newLine = line? [line stringByAppendingFormat:@" %@", word]: word; NSString *newLine = line? [line stringByAppendingFormat:@"%@", word]: word; CGFloat lineWidth = [newLine sizeWithFont:font minFontSize:font.pointSize actualFontSize:NULL forWidth:INFINITY lineBreakMode:lineBreakMode characterSpacing:characterSpacing kerningTable:kerningTable].width; if ([word isEqualToString:@"\n"]) { //add line and prepare for next [lines addObject:line ?: @""]; index = i + 1; break; } else if ([word isEqualToString:@"\r"]) { //add line and prepare for next [lines addObject:line ?: @""]; index = i + 1; break; } else if (lineWidth > size.width && line) { //check for orphans if (!allowOrphans && i > 0 && (i == [words count] - 1 || [words[i + 1] isEqualToString:@"\n"] || [words[i + 1] isEqualToString:@"\r"]) && ![words[i - 1] FXLabel_isPunctuation]) { //force line break NSRange range = [line rangeOfString:@" " options:NSBackwardsSearch]; if (range.location != NSNotFound) { line = [line substringToIndex:range.location]; i --; } } //add line and prepare for next [lines addObject:line]; index = i; break; } else if (i == [words count] - 1) { //add line and finish [lines addObject:newLine]; index = i + 1; break; } else { //continue line = newLine; } } } return lines; }
例子下载:Linespacing & Orphans
更正一下:
CGSize size = [str sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(320, 999999.0f) lineBreakMode:kCTLineBreakByCharWrapping
lineSpacing:0.8 characterSpacing:0 kerningTable:nil allowOrphans:NO];
CGRect frame = CGRectMake(0, 0, 320, size.height);
l1.frame = frame;
l1.text = str;
l1.backgroundColor = [UIColor clearColor];
l1.textColor = [UIColor redColor];
l1.lineSpacing = 1;
例子中的这段代码,计算size时的lineSpacing写成了0.8比label的设置小了,所以少分了一行
自行更正,我不改例子了
相关文章推荐
- FXLabel支持中文行距的简单修改
- 查看修改mysql编码方式让它支持中文(gbk或者utf8)
- 支持中文的zip压缩和解压,修改自带jdk ZipInputStream、ZipOutputStream、ZipEntry代码
- 修改 Lua支持中文变量名
- Luaplus5.3.3中文支持修改
- pligg9.7beta搭起后HTML编辑器插件的安装——fckeditor的配置与修改变相支持中文文件名:默认上传后不能正常调用
- wifi名称修改时最多支持10个中文或32个英文字符;当中文混杂时,只支持20个Asic码(V盘项目)
- 原生JavaScript简单的静态搜索过滤文字(只支持中文,暂无拼音搜索)
- 富文本(TYAttributedLabel 简单,强大的属性文本控件(无需了解CoreText),支持图文混排显示,支持添加链接,image和UIView控件,支持自定义排版显示)
- 修改源代码,让Lua支持中文,中英混合变量名收藏
- Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)
- zabbix修改之中文主机名 触发器表达式支持中文
- WayOs固件修改:内置简单拨号王消息控制器及支持安卓手机续费
- 修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
- centOS7 修改中文支持
- kindeditor本身支持上传flash功能,但是我们经常需要上传一些flv、mp4或则其它格式的视频。 其实具体的播放功能是通过jwplayer实现的。我只对kindeditor简单的修改了一下
- centos中文乱码修改字符编码使用centos支持中文
- proxool 最简单的设置mysql 支持 中文的方式
- jme3与nifty gui1.3结合,修改使其支持中文的输入与显示