UILabel不会更改setFrame的高度

时间:2013-02-28 08:07:56

标签: iphone ios objective-c cocoa-touch

我试图更改UILabel的高度,具体取决于标签中的文字数量。

我可以计算标签所需的尺寸,但是当我尝试设置UILabel框架时,它就不会改变。

以下是我的代码。 即使我将最后一行中的size.height替换为500,UILabel帧的大小也不会改变

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

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"GameItemCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    GameItem* item = [_hunt.gameItems objectAtIndex: indexPath.row];


    cell.itemHeaderLabel.text = [NSString stringWithFormat:@"#%d - (%d pts)", indexPath.row+1, item.itemPoints];

    UILabel* textLabel = cell.itemTextLabel;

    textLabel.text = item.itemText;
    textLabel.lineBreakMode = NSLineBreakByWordWrapping;


    CGRect frame = cell.itemTextLabel.frame;
    CGSize textSize = { frame.size.width, 20000.0f };
    CGSize sizeOneLine = [@"one line" sizeWithFont:cell.itemTextLabel.font constrainedToSize:textSize lineBreakMode:NSLineBreakByWordWrapping];
    CGSize cellTextSize = [item.itemText sizeWithFont:cell.itemTextLabel.font constrainedToSize:textSize lineBreakMode:NSLineBreakByWordWrapping];
    CGSize sizeOneLineSpacing = CGSizeMake(sizeOneLine.width, sizeOneLine.height + 3);
    NSInteger lines = cellTextSize.height / sizeOneLine.height;
    CGSize size = CGSizeMake(frame.size.width, lines * sizeOneLineSpacing.height);

    textLabel.frame = CGRectMake(frame.origin.x, frame.origin.y, size.width, size.height);



    return cell;
}

8 个答案:

答案 0 :(得分:7)

您必须在-(void)layoutSubviews

内的GameItemCell中设置标签的框架

答案 1 :(得分:2)

不要做那么辛苦的工作,而是尝试:

textLabel.numberOfLines = 0;
textLabel.text = textString;
[textLabel sizeToFit];

请记住sizeToFit尊重您的标签默认宽度,因此请根据您的要求设置宽度。然后,高度将由sizeToFit方法管理。

答案 2 :(得分:2)

最后,您需要在UITableViewCell子类中添加这两个方法:

// call this method on your cell, during cellForRowAtIndexPath
// provide your resizing info (frame, height, whatever)

- (void) updateLabelFrame:(CGRect)newLabelFrame {
    self.resizedLabelFrame = newLabelFrame;
    [self setNeedsLayout];
}

// the actual resize happens here when UIKit gets around to it

- (void) layoutSubviews {
    [super layoutSubviews];
    self.myLabel.frame = self.resizedLabelFrame;
}

答案 3 :(得分:1)

您错过了numberOfLines要设置的属性。

添加:

textLabel.numberOfLines = 0;

答案 4 :(得分:0)

numberOfLines

用于渲染文本的最大行数。

此属性的默认值为1. 要删除任何最大限​​制,并根据需要使用多行,请将此属性的值设置为0.

看一眼UILabel Class Reference

根据你的问题,你可以设置不行

现在您的标签没有设置行数,所以设置它,

textLabel.numberOfLines = lines;

答案 5 :(得分:0)

CGRect labelFrame = myLabel.frame;

labelFrame.size = [myLabel.text sizeWithFont:myLabel.font             constrainedToSize:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)
                                lineBreakMode:myLabel.lineBreakMode];

cell.textLabel.frame = labelFrame;

答案 6 :(得分:0)

是的,对于多行使用textLabel.numberOfLines = 0;在cellForRowAtIndexPath

但是你还需要改变细胞的高度:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Calculate new cell height too as you are doing in cellForRowAtIndexPath 
    return YOUR_SIZE;;
}

答案 7 :(得分:0)

试试这个:

        NSString *text1 = shareObjC.commentText;
        CGSize constraint1 = CGSizeMake(280 - (size.width + 5), 2000);

        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] autorelease];

        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        [cell.viewLikeComment addSubview:lblComment];