我使用表格视图来显示书籍列表,其中每个单元格都有一个UILabel,用于显示书籍的名称,另一个UILabel用于显示书籍的作者
我的问题是关于作者的标签.一本书可以有多个作者,我希望它的行为如下:
>如果书中有一位作者(‘John Colman’)的标签应为:“John Colman”
>如果书中有多位作者(‘John Colman’,’Bob Night’,’Michael’)标签应为:“John Colman 2位作者”
现在的问题是这个,我希望标签在”之前被截断.因此,例如,如果第一个作者名称很长,让我们说’Benjamin Walter Jackson’,我希望标签看起来像这样:
"Benjamin Walter Ja... +2 authors"
"Benjamin Walter Jackson +2 au..."
如果我使用中间截断,则无法保证它会在正确的位置截断标签(在”之前)
解决方法
编辑:广泛使用任何“截断位置”字符串的解决方案.以前的版本仅在字符串@“”的实例中截断.编辑允许您定义截断发生的位置.
我从this question获得了答案(这是从this site的答案中修改的答案),并根据您的需求量身定制.创建一个新的Nsstring接口,您可以在其中发送要自定义截断的字符串.
注意:此解决方案仅适用于iOS 7.要在iOS 6中使用,请在Nsstring TruncatetoWidth.m文件中使用sizeWithFont:而不是sizeWithAttributes :.
@interface Nsstring (TruncatetoWidth) - (Nsstring*)stringByTruncatingAtString:(Nsstring *)string toWidth:(CGFloat)width withFont:(UIFont *)font; @end
#import "Nsstring+TruncatetoWidth.h" #define ellipsis @"…" @implementation Nsstring (TruncatetoWidth) - (Nsstring*)stringByTruncatingAtString:(Nsstring *)string toWidth:(CGFloat)width withFont:(UIFont *)font { // If the string is already short enough,or // if the 'truncation location' string doesn't exist // go ahead and pass the string back unmodified. if ([self sizeWithAttributes:@{NSFontAttributeName:font}].width < width || [self rangeOfString:string].location == NSNotFound) return self; // Create copy that will be the returned result NSMutableString *truncatedString = [self mutablecopy]; // Accommodate for ellipsis we'll tack on the beginning width -= [ellipsis sizeWithAttributes:@{NSFontAttributeName:font}].width; // Get range of the passed string. Note that this only works to the first instance found,// so if there are multiple,you need to modify your solution NSRange range = [truncatedString rangeOfString:string]; range.length = 1; while([truncatedString sizeWithAttributes:@{NSFontAttributeName:font}].width > width && range.location > 0) { range.location -= 1; [truncatedString deleteCharactersInRange:range]; } // Append ellipsis range.length = 0; [truncatedString replaceCharactersInRange:range withString:ellipsis]; return truncatedString; } @end
使用它:
// Make sure to import the header file where you want to use it myLabel.text = [@"Benjamin Walker Jackson + 2 authors" stringByTruncatingAtString:@" +" toWidth:myLabel.frame.size.width withFont:myLabel.font]; // Sample Result: Benjamin Walte... + 2 authors
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。