naohide_a
naohide_a

Reputation: 1146

UILabel doesn't change height in UITableViewCell in first scroll

I'm using tableview on storyboard.

I change label's frame in (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath function.

then, after some scrolling, it can change frame. but, when I open my application, frame doesn't change at first.

sorry, can't post image till 10 reputation. please help.

- (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];
}

Upvotes: 0

Views: 1873

Answers (5)

gdm
gdm

Reputation: 7930

Remember these steps in order to have UILabel to change size:

1) If you have a Custom UITableViewCell, switch off AutoLayout on elements of the cell

2) Use heightForRowAtIndex protocol method to change the height

3) Set the numberOfLines = 0 for the UILabel inside the cell

4) If this does not work re-set the frame ( I found that this happens when you are trying to enlarge a UILabel in some "far" end of the cell)

Examples

- (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);
}

Upvotes: 0

Premsuraj
Premsuraj

Reputation: 2505

You can't change the size initially through cellForRow method. You need to calculate the size and return it in the following delegate

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

To calculate size for a label based on the text use

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);

Upvotes: 0

naohide_a
naohide_a

Reputation: 1146

autolayout was problem.
I switched off 'Use Autolayout' on storyboard. then, it became clear.

thank you all.

Upvotes: 4

Traze
Traze

Reputation: 180

Try resizing frames in willDisplayCell delegate method.

Upvotes: 0

AMarones
AMarones

Reputation: 1203

If your app is using Autolayout you should do it with Constraints. To resize a UILabel with Constraints that should has at least that properties: Line Numbers = 0 Line Breaks = Word Wrap

And about Constraints you should set in both sides, and one to top, DONT set to bottom!!

To set right size in the row u can use this code example:

-(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;

}

Upvotes: 0

Related Questions