如何在UITextView里面创build一个UITableViewCell,在UITextView的基础上dynamic调整它的高度?

我想有一个类似苹果的iPhone联系人应用程序的行为tablew视图:一个uitablextview里面有一个uitextview,所以当我在uitextview中写入时,uitextview增加了它的高度,因此uitableviewcelldynamic调整它的高度。 我在整个networking上search,只find部分解决scheme和缺乏示例代码!

请帮助我我绝望

托尼

看着这个,你需要有点棘手。 您需要dynamic地计算textView的高度,并根据TextView的高度,您需要返回单元格的高度..

这很容易,有点棘手..

这是你可以计算string的大小的代码….

首先得到string的大小

NSString *label = @"Sample String to get the Size for the textView Will definitely work "; CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap]; over here .... NSLog(@"%f",stringSize.height); 

其次dynamic创build单元格中的textView ..给stringSize.height

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; //} NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section]; NSString *string = [d valueForKey:@"Description"]; CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap]; UITextView *textV=[[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, stringSize.height+10)]; textV.font = [UIFont systemFontOfSize:15.0]; textV.text=string; textV.textColor=[UIColor blackColor]; textV.editable=NO; [cell.contentView addSubview:textV]; [textV release]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section]; NSString *label = [d valueForKey:@"Description"]; CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap]; return stringSize.height+25; } 

给我的手指给了这么多的痛苦之后……我想这个代码是足够的了……一定会帮你解决问题..

祝你好运

创build一个自定义的UITableViewCell,并将你的UITextView添加到单元格的contentView。

在LayoutSubviews中,将textView.frame设置为单元格的contentView.bounds(或者做一些其他的自定义布局)。

当textView内容改变(通过UITextViewDelegate发现)时,做两件事情:

1)调用[tableView beginUpdates]; [tableView endUpdates]; [tableView beginUpdates]; [tableView endUpdates]; 这将强制表视图重新计算所有单元格的高度(将调用tableView:heightForRowAtIndexPath: 。 如果你的单元格是textView的委托,那么你将不得不弄清楚如何得到一个指向tableView的指针,但有几种方法来实现这一点。 或者你可以使委托你的视图控制器…

2)当为这个单元tableView:heightForRowAtIndexPath:时,返回textView.contentSize.height 。 你可以从这里通过调用[tableView cellForRowAtIndexPath]; 或者如果你只有这些单元格中的一个,那么在你的viewController中caching一个指向它的指针。

我发现接受答案的唯一问题是我们每次都分配UITextView。 我发现这引起了问题,即在视图中键入并立即更新文本,并将视图保持为第一响应者。 当我试图用新的高度重新加载单元格时,它会尝试添加一个新的textView。

正因为如此,我发现了一个稍微不同的方法来实现相同的目标。 希望这种不同的看法可以帮助那些正在努力实现上述代码的人。

1)在头文件中定义一个文本和textView的高度variables:

 UITextView * _textView; NSInteger _textHeight; 

设置一个variables意味着我们可以加载视图到一定的高度,如果我们正在加载到textView的文本,也降低了复杂性。

2)加载文本视图,并将其添加到我们的单元格

 _textView = [[UITextView alloc] init]; _textView.delegate = self; _textView.returnKeyType = UIReturnKeyDone; _textView.font = [UIFont fontWithName:@"Helvetica" size:16]; if (![_user metaStringForKey:bBioKey].length) { _textView.text = @"Placeholder text"; _textView.textColor = [UIColor lightGrayColor]; } - (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath == 0) { // Add logic to choose the correct cell if (_textView.superview != cell) { [cell addSubview:_textView]; _textView.keepTopInset.equal = KeepRequired(7); _textView.keepBottomInset.equal = KeepRequired(7); _textView.keepRightInset.equal = KeepRequired(10); _textView.keepLeftInset.equal = KeepRequired(70); } } } } 

使用keeplayout使我们能够保持文本字段始终保持与单元格相同的高度。 我们也只是一次添加我们的UITextView。

3)添加代码来计算文本的高度

 - (NSInteger)getHeightOfBio: (NSString *)text { UILabel * gettingSizeLabel = [[UILabel alloc] init]; gettingSizeLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; gettingSizeLabel.text = text; gettingSizeLabel.numberOfLines = 0; CGSize maximumLabelSize = CGSizeMake(240, 9999); // this width will be as per your requirement CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize]; return expectedSize.height; } 

我尝试了很多,发现这是最好的

4)在单元格高度添加一些逻辑来利用这个:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 0) { // Set the height for our changing textView return 30 + [self getHeightOfBio:_textView.text]; } return 44; } 

显然,我们需要比我们的文字高度多一点的高度,所以我增加了一个额外的坐垫数量,可以尝试。

5)每次input一个字符时刷新视图来检查是否需要增加大小:

 - (void)textViewDidChange:(UITextView *)textView { if ([self getHeightOfText:textView.text] != _textHeight) { _textHeight = [self getHeightOfText:textView.text]; [self.tableView beginUpdates]; [self.tableView endUpdates]; } } 

在本节中,我们每次input用户时都会得到文本的高度。

然后,虽然我们使用我们的存储值,并将当前值与存储的值进行比较。 显然,如果他们是相同的,那么刷新视图就没有意义了。 如果他们不同,我们更新值,然后刷新我们的表。

这一点,我发现stackOverflow上的一个很好的答案,展示了如何刷新表格的高度,而不是单元格本身。 当我们不需要的时候,为什么刷新细胞? 这意味着,一旦这被称为单元格高度更新,并很好地增加。

无论如何,我发现这个工作真的很好,很简单,它可以放在一起,或采取不同的部分,并将其放入其他人的代码段。

支持被接受的答案,一路上各种各样的被掠夺的东西,但我也希望这个答案可以帮助那些和我有同样困难的人。

我写了我的学习和解决scheme, 基于我的博客上的内部UITextView计算UITableViewCell高度 。 该文章包含适用于通用应用程序的代码,包括表格视图样式和自动旋转。

最后我得到了它的工作。 主要问题是如何获取单元格的contentView正确的宽度。 硬编码的宽度不适用于所有情况,因为它可能会相应地改变平原/分组表格样式,添加附件或横向/纵向布局。 获得100%正确宽度的唯一方法是从单元对象中获取。 所以我在heightForRowAtIndexPath创build单元格并将其存储在caching中,然后这个caching的单元格将由cellForRowAtIndexPath方法返回。 另一个问题是如何强制单元格在使用之前对其子视图进行布局。 如果我们临时添加单元格到tableView并用tabelView的宽度更新单元格的框架,就可以完成。 之后,所有的子视图将以正确的方式进行布置。 这是我如何在我的TableKit库中工作。

我编辑TomSwift响应是最好的方法:

这里是我的单元格代码(快速)

 class CommentaireTextViewCell: UITableViewCell,UITextViewDelegate { @IBOutlet weak var textViewCom: UITextView! weak var parentTableView:UITableView? @IBOutlet weak var constraintTextViewTopMargin: NSLayoutConstraint! @IBOutlet weak var constraintTextViewHeight: NSLayoutConstraint! @IBOutlet weak var constraintTextViewBottomMargin: NSLayoutConstraint! override func awakeFromNib() { self.textViewCom.delegate = self; } func textViewDidChange(textView: UITextView) { self.parentTableView?.beginUpdates(); self.parentTableView?.endUpdates(); } func getHeight() -> CGFloat { constraintTextViewHeight.constant = self.textViewCom.contentSize.height; // cell height = textview marge top+ textview height+ textView Marge bottom return constraintTextViewTopMargin.constant+constraintTextViewHeight.constant+constraintTextViewBottomMargin.constant+8 // add 8 because it seems to have an inset inside the textView } override func setSelected(selected: Bool, animated: Bool) { self.textViewCom.becomeFirstResponder(); } } 

为了说明,单元格表格视图是单元格的一个弱特性,所以我可以告诉它在用户input文本时更新布局。 单元格的高度是contentView的顶部约束和contentView的底部约束,textView.contantSize.height也等于textView的常量高度

在这里输入图像描述

您需要在heightForRowAtIndexPath委托方法中返回正确的高度。

试试下面的代码:

 CGSize constraintSize; constraintSize.height = MAXFLOAT; constraintSize.width = yourTextView.frame.size.width; NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"yourFontName" size:yourFontSize], NSFontAttributeName, nil]; CGRect frame = [yourTextView.text boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDictionary context:nil]; CGSize stringSize = frame.size;//The string size can be set to the UITableViewCell 

您可以编程方式获得UITextView大小。根据大小,使用以下代理设置单元格的高度

 tableView:heightForRowAtIndexPath: 

伙计们这真的很酷的东西,但你可以使用tableview:didSelectRowForIndexPath:将UITextView添加到单元格,因为它的子视图时,用户点击它,工作得很好,因为你只需要使用1个UITextView,你可以重复使用,不会干扰与桌面接收触摸! 完成后释放它。

细节? 只是问!