有很多解决方案使用“sizeWithFont”或类似的东西,从iOS 7开始就不赞成使用.
这是我到目前为止拼凑的一些代码.高度变化,但完全没有变化:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // Configure the cell... cell.textLabel.text = "The Cell's Text!"; cell.textLabel.numberOfLines = 0; [cell.textLabel setLineBreakMode:NSLineBreakByWordWrapping]; [cell.textLabel sizeToFit]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { CGRect screenBounds = [[UIScreen mainScreen] bounds]; CGSize screenSize = screenBounds.size; NSAttributedString *aString = [[NSAttributedString alloc] initWithString:"The Cell's Text!"]; UITextView *calculationView = [[UITextView alloc] init]; [calculationView setAttributedText:aString]; CGSize size = [calculationView sizeThatFits:CGSizeMake(screenSize.width,FLT_MAX)]; return size.height; }
再举一个例子,这里有一个类似的答案:https://stackoverflow.com/a/9828777/693121虽然如前所述,但它使用了弃用的代码.
解决方法
您应该使用文档中提到的方法来替换旧的 – boundingRectWithSize:options:attributes:context:.这是一个我认为应该工作的例子(无论如何它适用于多行标签).
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSStringDrawingContext *ctx = [NSStringDrawingContext new]; NSAttributedString *aString = [[NSAttributedString alloc] initWithString:@"The Cell's Text!"]; UITextView *calculationView = [[UITextView alloc] init]; [calculationView setAttributedText:aString]; CGRect textRect = [calculationView.text boundingRectWithSize:self.view.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:calculationView.font} context:ctx]; return textRect.size.height; }
这假定您希望文本视图的大小为self.view.如果没有,您应该为文本视图使用initWithFrame,并为boundingRectWithSize:参数传递calculateView.frame.size.