4

我正在使用此答案中提供的代码来创建动态标签,它在大多数情况下都有效。但是,只要标签文本的长度超过 94 个字符,它就会被截断并添加省略号。

还有一件更奇怪的事情是,如果我在字符串中添加更多字符,它们就会显示出来,但最后两行仍然被截断。

例如。

字符串:

this is a very very long string 
with lots of words to test the 
dynamic bubble sizing one two three.

显示如下:

this is a very very long string 
with lots of words to test the 
dynamic bubble sizing one tw...

但是当我通过在标签中再次使用相同的句子来加倍字符串时,它会显示更多的文本,但仍然会截断它。

例如。

字符串:

this is a very very long string 
with lots of words to test the 
dynamic bubble sizing one two 
three. this is a very very long 
string with lots of words to test 
the dynamic bubble sizing one 
two three.

显示如下:

this is a very very long string 
with lots of words to test the 
dynamic bubble sizing one two 
three. this is a very very long 
string with lots of words to tes...

这是我正在使用的代码。

NSString *temp = [NSString stringWithFormat:@"this is a very very long string with lots of words to test the dynamic bubble sizing one two three"];

captionLabel.text = temp;
//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [temp sizeWithFont:captionLabel.font 
                                  constrainedToSize:maximumLabelSize 
                                      lineBreakMode:captionLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = captionLabel.frame;
newFrame.size.height = expectedLabelSize.height;
captionLabel.frame = newFrame; 

希望有人有一个想法,因为这让我摸不着头脑。

编辑

感谢@troolee,使用 captionLabel.frame.size.width 而不是硬编码的 296 修复了它,如果他/她选择创建答案,我会将其标记为正确。

4

4 回答 4

1

而不是captionLabel.lineBreakMode,只是写UILineBreakModeWordWrap。它应该工作。

于 2012-07-19T10:49:01.453 回答
1

我希望@troolee 现在已经将他的评论作为答案,但既然他没有,我将发布答案并将其标记为正确,以便我可以关闭这个问题。

使用 captionLabel.frame.size.width 而不是硬编码的 296 修复它。

于 2012-08-10T11:26:00.970 回答
1
 NSString * test=@"this is test this is test inthis is test ininthis is test inthis is test inthis is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel END";

        testLabel.text = test;
        testLabel.numberOfLines = 0; //will wrap text in new line
        [testLabel sizeToFit];

        [self.view addSubview:testLabel];

这肯定会帮助你。

谢谢

于 2012-07-19T10:38:27.220 回答
0

尝试以下UILabel类别。感谢创作者。

UILabel+VAlign.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface UILabel (VAlign)
- (void) setVerticalAlignmentTopConstrainedToSize:(CGSize)size;
@end

UILabel+VAlign.h

#import "UILabel+VAlign.h"

@implementation UILabel (VAlign)

- (void) setVerticalAlignmentTopConstrainedToSize:(CGSize)size
{
    CGSize textSize = [self.text sizeWithFont:self.font
                            constrainedToSize:size
                                lineBreakMode:self.lineBreakMode];

    CGRect textRect = CGRectMake(self.frame.origin.x,
                                 self.frame.origin.y,
                                 self.frame.size.width,
                                 textSize.height);
    [self setFrame:textRect];
    [self setNeedsDisplay];
}

@end
于 2012-07-19T10:46:03.803 回答