Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UILabel sizeThatFits不起作用_Ios_Uitableview_Uiview_Uilabel - Fatal编程技术网

Ios UILabel sizeThatFits不起作用

Ios UILabel sizeThatFits不起作用,ios,uitableview,uiview,uilabel,Ios,Uitableview,Uiview,Uilabel,我试图计算UITableViewCell的高度,所以我定义了一个类方法,如下所示 + (CGFloat)heightWithText:(NSString *)text { SizingLabel.text = text; [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_M

我试图计算UITableViewCell的高度,所以我定义了一个类方法,如下所示

+ (CGFloat)heightWithText:(NSString *)text
{
    SizingLabel.text = text;
    [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];

    return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_MARGIN);
}
我对SizingLabel的定义如下:

+ (void)initialize
{
    SizingLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    SizingLabel.numberOfLines = 0;
    SizingLabel.lineBreakMode = NSLineBreakByWordWrapping;
}

但是,如果我在-heightWithText:方法中插入断点,我会注意到SizingLabel的维度从未改变,因此我得到了一个错误的值。为什么会这样?

下面的代码是计算动态文本长度的rect(ios7版本)

+ (CGFloat)heightWithText:(NSString *)text
{
    SizingLabel.text = text;
    CGSize labelSize = [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)];

    return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
}
得到rect后,用它来计算单元格大小

----------------旧版本-------------------

CGSize contentSize = [content sizeWithFont:font
                             constrainedToSize:CGSizeMake(maxWidth, maxHeight)
                                 lineBreakMode: NSLineBreakByWordWrapping];

在自定义单元格类中执行此操作:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code

        //Message Label
        lbl_name = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 25)];            

        [lbl_name setFont:[UIFont fontWithName:@"Helvetica" size:16.0f]];
        lbl_name.lineBreakMode = UILineBreakModeWordWrap;
        lbl_name.numberOfLines = 0;
        [lbl_name sizeToFit];
        [self.contentView addSubview:lbl_name];

        //Time 
    }
    return self;
}    

-(void)resizeNameLabel:(NSString *)text
{
    CGSize constraint = CGSizeMake(300 , 20000.0f);
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:16.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    [lbl_name setFrame:CGRectMake(10, 5, 300, MAX(size.height, 25.0f))];//300 Label Width
    [lbl_name setText:text];
}
在主课上做这个

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    {
        cell = (CustomCell *)[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
    }
        [((CustomCell *)cell) resizeNameLabel:text];

    return cell;
}

就这样做吧……

为了简单地调整具有属性文本的UILabel的大小,我将此类别添加到UILabel中

@implementation UILabel (PAUtils)

- (CGSize)jb_attributedSizeThatFits:(CGSize)size
{
    CGRect textRect = [self.attributedText boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];
    return textRect.size;
}

@end
有两点需要注意:

  • 当不设置
    attributedText
    (而只使用
    text
    )时,此方法不考虑
    numberOfLines
    属性
  • boundingRectWithSize
    返回点的分数。如果将此方法返回的值用于布局,则可能应该
    ceilf
    宽度和高度

  • 如上所述,
    sizeThatFits:
    (因此
    sizeToFit
    )不能很好地处理
    UILabel
    对象

    最好使用首选的
    textRectForBounds:LimitedToNumberOffline:
    方法:

    + (CGFloat)heightWithText:(NSString *)text
    {
        resizingLabel.text = text;
        CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX)
                                     limitedToNumberOfLines:0].size; // No limit
    
        return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
    }
    

    -(CGSize)sizeThatFits:返回文本适合标签的大小。啊,好的,它实际上不调整标签的大小吗?是的,它只返回一个大小。@SEANDAZEISER:允许多行标记?当属性仅应用于文本范围时,经过测试的boundingRectWithSize方法无法正确计算。如果属性应用于文本的所有范围,则其工作正常。但是,由于您在第一次提问时没有提到要将其应用于属性文本,因此您对我的回答投反对票是不公平的(NSDictionary)属性是您设置文本属性的地方。这对我不适用,而且,您应该遵循命名约定,以小写字母开始变量名称(或者
    SizingLabel
    应该是一个类吗?
    SizingLabel
    一定是一个自动重命名问题。此外,您或任何人都可以编辑帖子;)因为这不起作用。问题出在哪里?基本上,这段代码只使用内置的
    textRectForBounds:LimitedToNumberOfflines:
    ,这应该总是有效的。它返回的大小并没有真正反映文本的大小。毕竟,它没有考虑字体。最后,我使用了
    NSString boundingrect with size:options:attributes:context:
    。它考虑了
    UILabel
    字体和参数。您可以在IB中全部设置,然后进行精确测量。这就是为什么我更喜欢它,而不是尝试使用
    NSString
    重新创建标签配置。至于您的问题,是内置方法返回了错误的值还是伴随的调整?而
    SizingLabel
    来自原始问题。如果您相信,当属性字符串不包含
    NSFontAttributeName
    时,它似乎无法正常工作。如果为标签设置字体,则适用于UILabel。@OlgaVogue否,它仅有时有效。sizeThatFits是出了名的童车。
    + (CGFloat)heightWithText:(NSString *)text
    {
        resizingLabel.text = text;
        CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX)
                                     limitedToNumberOfLines:0].size; // No limit
    
        return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN);
    }