微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 在特定位置截断UILabel

我使用表格视图来显示书籍列表,其中每个单元格都有一个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 :.

Nsstring TruncatetoWidth.h

@interface Nsstring (TruncatetoWidth)
- (Nsstring*)stringByTruncatingAtString:(Nsstring *)string toWidth:(CGFloat)width withFont:(UIFont *)font;
@end

Nsstring TruncatetoWidth.m

#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 举报,一经查实,本站将立刻删除。

相关推荐