如何知道UILabel中显示的文字?

时间:2010-08-19 09:37:15

标签: iphone objective-c string uilabel

我有UIView包含两个UILabels,以显示字符串。 第一个UILabel具有固定的大小,如果字符串太长且无法保留在此UILabel中,我想在第一个UILabel中显示我可以使用的最大字符数,并在第二个UILabel中显示其余字符串。

但要做到这一点,我必须知道第一个UILabel中显示的字符串的确切部分,由于字符串和换行符的随机性,这并不容易。

那么,有没有办法只获取第一个UILabel中显示的文本,而没有字符串的截断部分?

2 个答案:

答案 0 :(得分:1)

if ([_infoMedia.description length] > 270) {
        NSRange labelLimit = [_infoMedia.description rangeOfString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(270, (_infoMedia.description.length - 270))];
        _descTop.text = [_infoMedia.description substringToIndex:labelLimit.location];
        _descBottom.text = [_infoMedia.description substringFromIndex:(labelLimit.location+1)];
} else {
            _descTop.text = _infoMedia.description;
            _descBottom.text = @"";
}

好的,这是一个迟到的答案,但也许它可以帮助某人。上面的代码大概是我在我的应用程序中使用的解决方案。

_descTop是我的第一个标签,_descBottom是第二个标签。 270是一个常数,相当于我第一个标签_descTop中显示的平均最大字符数。我手工计算,尝试使用许多不同的字符串,也许有更好的方法可以做到这一点,但这也不错。

如果我要显示的字符串(_infoMedia.description)大于270个字符,我将前270个字符加上字符串中下一个字的结尾(通过搜索下一个空格),如果270个字符的限制会在一个单词的中间剪切字符串。然后我将字符串的第一部分放在我的第一个标签中,第二部分放在第二个标签中。

如果没有,我只将字符串的全局性放在第一个标签中。

我知道这是一个糟糕的解决方案,但它有效,我没有找到更好的方法来做到这一点。

答案 1 :(得分:0)

以下代码可能会帮助您获得所需内容!!

//If you want the string displayed in any given rect, use the following code..
@implementation NSString (displayedString)

//font- font of the text to be displayed
//size - Size in which we are displaying the text

-(NSString *) displayedString:(CGSize)size font:(UIFont *)font
{
NSString *written = @"";

int i = 0;
int currentWidth = 0;
NSString *nextSetOfString = @"";

while (1)
{
    NSRange range;
    range.location = i;
    range.length = 1;

    NSString *nextChar = [self substringWithRange:range];
    nextSetOfString = [nextSetOfString stringByAppendingString:nextChar];

    CGSize requiredSize = [nextSetOfString sizeWithFont:font constrainedToSize:CGSizeMake(NSIntegerMax, NSIntegerMax)];
    currentWidth = requiredSize.width;

    if(size.width >= currentWidth && size.height >= requiredSize.height)
    {
        written = [written stringByAppendingString:nextChar];
    }
    else
    {
        break;
    }
    i++;
}


    return written;
}

@end