UILabel在指定位置插入小图片,前面是“...”


图片描述

场景:UILable展示问题描述的内容,附件为一个标志,表明此问题是否有图片;
问题:这个小图片要求始终跟在标题最后面,标题的内容是可变的,最多两行;单行或者内容不超过两行的时候的时候用NSAttributeString即可实现,但是刚好两行或者多于两行的时候要求图片的最右边和“遇”的最右边对齐,前面是"..."省略号;这个怎么实现!
难点:怎么截取字符串,并在合适的位置插入省略号和图片,用NSAttributeString还是CoreText,如何实现?

uilabel ios

wincard 9 years, 7 months ago

暴力计算法

有一个运行效率比较低的算法。将文字截成两段使用两个label。

使用下面代码将文字拆分成两行


 NSString * string = nil;
    NSString * string1 = nil;
    NSString * string2 = nil;
    CGFloat labelMaxWidth = 280;
    NSDictionary *attribute = @{NSFontAttributeName: label.font};
    for (NSInteger i = 0; i < string.length; i++ )
    {
        NSString * s = [string substringToIndex:i];
        CGSize size = [s boundingRectWithSize:size
        options: \
         NSStringDrawingTruncatesLastVisibleLine |
         NSStringDrawingUsesLineFragmentOrigin |
         NSStringDrawingUsesFontLeading
         attributes:attribute
         context:nil].size;
        if ( size.width > labelMaxWidth ) {
            string1 = [string substringToIndex:i-1];
            string2 = [string substringFromIndex:i];
        }
    }
    if (string1 == nil)
    {
        string1 = string;
    }

    // string1 为第一行文字
    // string2 为第二行文字(可能为nil)

如果只有string1,那就把图片加入到第一行,如果存在string2,就把图片加到第二行。
上面时最粗暴的算法,可以用别的算法提高运行效率,比如不让从0开始计算,让它从一个比较大且安全的值开始。

悠久D成敗 answered 9 years, 7 months ago

Your Answer