UILabel在第一次滚动时不会在UITableViewCell中改变高度

时间:2013-12-05 10:54:51

标签: ios objective-c uitableview

我在故事板上使用tableview。

我在(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath函数中更改了标签的框架。

然后,经过一些滚动,它可以改变帧。但是,当我打开我的应用程序时,框架最初不会改变。

抱歉,不能发布图片直到10点声望。 请帮忙。

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// get one row
Plan* planObj = [_planObjList objectAtIndex:indexPath.row];

// get custom cell info
LargeImageCell* cell = (LargeImageCell*)[tableView dequeueReusableCellWithIdentifier:@"CustomLargeImageCell"];

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg"]];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.titleLabel.text = planObj.planTitle;
cell.titleLabel.numberOfLines = 0;
cell.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
cell.userNameLabel.text = planObj.getProducerName;

// title size
CGSize titleSize = [cell.titleLabel.text boundingRectWithSize:CGSizeMake(300.0f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName: cell.titleLabel.font} context:nil].size;
// user name size
CGSize userNameSize = [cell.userNameLabel.text boundingRectWithSize:CGSizeMake(300.0f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:@{NSFontAttributeName: cell.userNameLabel.font} context:nil].size;

// set title size
cell.titleLabel.frame = CGRectMake(7.0f, 230.0f, 306.0f, ceilf(5.0f + titleSize.height));
cell.titleLabel.backgroundColor = [UIColor redColor];

// set name size
cell.userNameLabel.frame = CGRectMake(7.0f, ceilf(235.0f + titleSize.height), 148.0f, ceilf(5.0f + userNameSize.height));
cell.userNameLabel.backgroundColor = [UIColor blueColor];
}

5 个答案:

答案 0 :(得分:4)

autolayout是问题 我在故事板上关闭了“使用Autolayout”。然后,它变得清晰了。

谢谢大家。

答案 1 :(得分:0)

您最初无法通过cellForRow方法更改大小。您需要计算大小并在以下代理中返回

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

根据文字使用

计算标签的大小
NSString *labelText=@"some text";
[myLabel setText:labelText];
UIFont *labelTextFont = [UIFont fontWithName:@"Helvetica" size:labelTextsize];
CGSize labelFrameSize = [labelText sizeWithFont:labelTextFont];
myLabel.frame = CGRectMake(xPos, yPos, labelFrameSize.width, labelFrameSize.height);

答案 2 :(得分:0)

如果您的应用使用的是Autolayout,则应使用Constraints。要使用至少具有该属性的约束来调整UILabel的大小: 行号= 0 换行=自动换行

关于约束你应该设置在两边,一到顶部,DONT设置到底部!!

要在行中设置正确的大小,您可以使用以下代码示例:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {     id data = [self.listOfNews safeObjectAtIndex:indexPath.row];

UIFont *font =  [UIFont fontWithName:K_FONT_AVENIR_MEDIUM size:textSize];

if ([data isKindOfClass:[NewsModel class]]) {
    NewsModel *news = (NewsModel *)data;

    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        CGSize constraintSize = CGSizeMake(cellTextWidth, MAXFLOAT);
        CGSize textRect = [news.title sizeWithFont:font constrainedToSize:constraintSize];

        return textRect.height + paddingTopAndBottom;
    } else {
        CGRect textRect = [news.title boundingRectWithSize:CGSizeMake(cellTextWidth, CGFLOAT_MAX)
                                                   options:NSStringDrawingUsesLineFragmentOrigin
                                                attributes:@{NSFontAttributeName:font}
                                                   context:nil];

        return textRect.size.height + paddingTopAndBottom;
    }
}

return 0;

}

答案 3 :(得分:0)

尝试在willDisplayCell委托方法中调整帧大小。

答案 4 :(得分:0)

请记住以下步骤,以便UILabel更改尺寸:

1)如果您有自定义UITableViewCell,请关闭单元格元素的AutoLayout

2)使用heightForRowAtIndex协议方法更改高度

3)为单元格内的numberOfLines设置UILabel = 0

4)如果这不起作用重新设置框架(我发现当你试图在某些"远端的单元格中放大UILabel时会发生这种情况)

实施例

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 GeneralCell* cell      = [tableView dequeueReusableCellWithIdentifier:@"GeneralCell"];
    if (cell == nil) {
        cell = [[GeneralCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GeneralCell"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    /////// USE the following block if still in trouble 
    CGRect frame = cell.label.frame;      
    [cell.label setFrame:frame];
    [cell.label sizeToFit]; // this should not be necessary in general
    ///////////
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  {
    NSString     *detail   = [NSString stringWithFormat:@"YOUR TEXT]];

    CGSize constraintSize = CGSizeMake(CELL_CONTENT_WIDTH, MAXFLOAT);
    CGSize labelSize = [detail boundingRectWithSize:constraintSize
                                            options:NSStringDrawingUsesLineFragmentOrigin
                                         attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE]}
                                            context:nil].size;


    float h = (fmod((int)labelSize.height ,2) == 0) ? labelSize.height : labelSize.height+1;
    CGFloat height = MAX(h, 30.0f);
    elemento = nil;
    detail   = nil;
    return height + (CELL_CONTENT_MARGIN * 2);
}